Gast
#3939361
Hallo Leute :)
Ich beschäftige mich zurzeit damit, über TWI (I2C) mit einem Sensor zu
kommunizieren. Jedoch komme ich nicht so wirklich klar damit. Die
gesamte Kommunikation soll später über 3 Funktionen (TWI_initTWI,
TWI_ReceiveData und TWI_SendData) erfolgen. Hierfür möchte ich gerne die
Nebenfunktionen in die Receive und Send Funktion einbauen, jedoch klappt
das nicht so recht. Könnt Ihr mir evtl weiterhelfen und sagen, wo meine
Fehler liegen?
Hier der Code:
/***********************************************************************
********
*Funktion void TWI_InitTWI_v(uint8_t BitRate, uint8_t
PrescalerHighBit, uint8_t PrescalerLowBit)
*
*Beschreibung Initialiesiert das TWI-Modul des Mikrocontrollers
*
*Parameter BitRate: Bitrate die im Register TWBR eingestellt werden
soll
* PrescalerHighBit: Wert der fuer TWPS1 eingestellt werden soll
* PrescalerLowBit: Wert der fuer TWPS0 eingestellt werden soll
*
*Rueckgabe keine
*
************************************************************************
*******/
void TWI_InitTWI(uint8_t BitRate, uint8_t PrescalerHighBit, uint8_t
PrescalerLowBit)
{
// TWIFrequenz auswaehlen freq= F_CPU/(16+2(TWBR)*4^TWPS)
TWBR=BitRate; //Bitrate setzen
TWSR=(PrescalerHighBit<<TWPS1)|(PrescalerLowBit<<TWPS0); // Setzen
der prescalar bits
}
/***********************************************************************
********
*Funktion void TWI_StartCondition(void)
*
*Beschreibung Sendet eine Startbedingung fuer eine TWI Kommunikation
*
*Parameter keine
*
*Rueckgabe keine
*
************************************************************************
*******/
void TWI_StartCondition(void)
{
// Setzt TWI interrupt flag zurueck, legt Startbedingung an SDA,
Enable TWI
TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT))); // wartet bis die Startbedingung gesendet
ist
while((TWSR & 0xF8)!= 0x08); // prueft acknowledgement
}
/***********************************************************************
********
*Funktion void TWI_RepeatedStartCondition(void)
*
*Beschreibung Sendet eine erneute Startbedingung
*
*Parameter keine
*
*Rueckgabe keine
*
************************************************************************
*******/
void TWI_RepeatedStartCondition(void)
{
// Setzt TWI interrupt flag zurueck, legt Startbedingung an SDA,
Enable TWI
TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT))); // wartet bis die Startbedingung gesendet
ist
while((TWSR & 0xF8)!= 0x10); // prueft acknowledgement
}
/***********************************************************************
********
*Funktion void TWI_SendAddress(uint8_t Adress, uint8_t Direction)
*
*Beschreibung Sendet die Slave Adresse, ob anschließend gelesen oder
geschriben werden soll und wartet ACK ab
*
*Parameter Adress: Adresse des Slaves im 8-Bit Format (letztes Bit
egal)
* Direction: Read=1; Write=0
*
*Rueckgabe keine
*
************************************************************************
*******/
void TWI_SendAddress(uint8_t Adress, uint8_t Direction)
{
if (Direction==0)
{
Adress&=0xFE;
}
else
{
Adress|=0x01;
}
TWDR=Adress; // Addresse and Richtung senden
TWCR=(1<<TWINT)|(1<<TWEN); // Setzt TWI interrupt flag zurueck,
Enable TWI
while (!(TWCR & (1<<TWINT))); // wartet bis TWDR uebertragen ist
if (Direction==0)
{
while((TWSR & 0xF8)!= 0x18); // prueft acknoledgement fuer lesen
}
else
{
while((TWSR & 0xF8)!= 0x40); // prueft acknoledgement fuer
schreiben
}
}
/***********************************************************************
********
*Funktion void TWI_WriteData(uint8_t char Data)
*
*Beschreibung Sendet 8-Bit Daten und wartet auf ACK
*
*Parameter Data: 8-Bit Daten, die gesendet werden sollen
*
*Rueckgabe keine
*
************************************************************************
*******/
void TWI_WriteData(uint8_t Data)
{
TWDR=Data; // legt Data ins Senderegister
TWCR=(1<<TWINT)|(1<<TWEN); // Setzt TWI interrupt flag zurueck,
Enable TWI
while (!(TWCR & (1<<TWINT))); // wartet bis TWDR uebertragen ist
while((TWSR & 0xF8) != 0x28); // prueft acknoledgement
}
/***********************************************************************
********
*Funktion uint8_t TWI_ReadData(void)
*
*Beschreibung Empfaengt 8-Bit Daten ueber TWI
*
*Parameter keine
*
*Rueckgabe 8Bit Daten
*
************************************************************************
*******/
uint8_t TWI_ReadData(void)
{
uint8_t ReciveData; //Variable fuer die empfangenden Daten
TWCR=(1<<TWINT)|(1<<TWEN); // Setzt TWI interrupt flag zurueck,
Enable TWI
while (!(TWCR & (1<<TWINT))); // wartet bis das TWDR-Byte
uebermittelt wurde
while((TWSR & 0xF8) != 0x58); // prueft acknoledgement
ReciveData=TWDR; // liest TWDR-Byte aus
return (ReciveData); // Rueckgabe der Daten
}
/***********************************************************************
********
*Funktion void TWI_StopCondition(void)
*
*Beschreibung Sendet Stopp-Bedingung nach TWI-Kommunikation
*
*Parameter keine
*
*Rueckgabe keine
*
************************************************************************
*******/
void TWI_StopCondition(void)
{
// Setzt TWI interrupt flag zurueck, legt Stoppbedingung an SDA,
Enable TWI
TWCR= (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
while(!(TWCR & (1<<TWSTO))); // wartet bis Stoppbedingung
uebermittelt wurde
}
/***********************************************************************
********
*Funktion void TWI_SendData(uint8_t SlaveAdress, uint8_t
RegisterAdress, uint8_t Data)
*
*Beschreibung Schreibt Daten ins das abgegebene Register des Slaves
mit der angegebenen Adresse
*
*Parameter SlaveAdress: Adresse des Slaves, der angesprochen werden
soll
* Registeradress: Register, in das geschrieben werden soll
* Data: Daten, die in das Register geschrieben werden sollen
*
*Rueckgabe keine
*
************************************************************************
*******/
void TWI_SendData(uint8_t SlaveAdress, uint8_t RegisterAdress, uint8_t
Data)
{
/*Funktion mit Hilfe der oben gegeben Funktionen schreiben*/
TWI_StartCondition();
TWI_SendAddress(SlaveAdress, RegisterAdress);
TWI_WriteData(Data);
TWI_WriteData(Data);
TWI_StopCondition();
}
/***********************************************************************
********
*Funktion uint8_t TWI_ReciveData(uint8_t SlaveAdress, uint8_t
RegisterAdress)
*
*Beschreibung Empfaengt Daten des Slaves, welche unter der angebenen
Registeradresse zu finden sind
*
*Parameter SlaveAdresse: Adresse des angeschlossenen Slaves im 8-Bit
Format
* RegisterAdress: Adresse des Registers, das gelesen werden soll
*
*Rueckgabe 8-Bit Daten
*
************************************************************************
*******/
uint8_t TWI_ReciveData(uint8_t SlaveAdress, uint8_t RegisterAdress)
{
/*Funktion mit Hilfe der oben gegeben Funktionen schreiben*/
TWI_StartCondition();
TWI_SendAddress(SlaveAdress, RegisterAdress);
TWI_ReadData();
TWI_RepeatedStartCondition();
TWI_StopCondition();
}
Ich hoffe, dass mir jemand weiterhelfen kann :)
LG