//------------------------------------------------------------------- uint8_t I2C_ReadByte ( uint8_t SlaveAddr, uint8_t RegAddr ) { #if 0 return sccb_read(SlaveAddr, RegAddr); #else uint8_t Data = 0; I2CSendAddr(SlaveAddr,WRITE); I2CSendByte(RegAddr); I2CSendAddr (SlaveAddr,READ); I2CGetByte(LAST_BYTE, &Data); I2CSendStop(); return Data; #endif }
//------------------------------------------------------------------------------ // Function Name: I2C_ReadSegmentBlockEDID // Function Description: Reads segment block of EDID from HDMI Downstream Device //------------------------------------------------------------------------------ uint8_t I2C_ReadSegmentBlockEDID (uint8_t SlaveAddr, uint8_t Segment, uint8_t Offset, uint8_t *Buffer, uint8_t Length) { uint8_t i, bState; TX_DEBUG_PRINT(("I2C_ReadSegmentBlockEDID%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n")); bState = I2CSendAddr(0x60, WRITE); if(bState){ I2CSendStop(); return IIC_NOACK; } bState = I2CSendByte(Segment); if(bState){ I2CSendStop(); return IIC_NOACK; } bState = I2CSendAddr(SlaveAddr,WRITE); if(bState){ I2CSendStop(); return IIC_NOACK; } bState = I2CSendByte(Offset); if(bState){ I2CSendStop(); return IIC_NOACK; } bState = I2CSendAddr (SlaveAddr,READ); if(bState){ I2CSendStop(); return IIC_NOACK; } for (i = 0; i < Length - 1; i++) if (I2CGetByte(NOT_LAST_BYTE, &Buffer[i])) return IIC_SCL_TIMEOUT; if (I2CGetByte(LAST_BYTE, &Buffer[i])) return IIC_SCL_TIMEOUT; I2CSendStop(); return IIC_OK; }
//------------------------------------------------------------------- void I2C_WriteByte ( uint8_t SlaveAddr, uint8_t RegAddr, uint8_t Data ) { #if 0 sccb_write(SlaveAddr, RegAddr, Data); #else I2CSendAddr(SlaveAddr,WRITE); I2CSendByte(RegAddr); I2CSendByte(Data); I2CSendStop(); #endif }
//------------------------------------------------------------------------------ // Function Name: I2C_ReadBlock // Function Description: Reads block of data from I2C Device //------------------------------------------------------------------------------ uint8_t I2C_ReadBlock(uint8_t SlaveAddr, uint8_t RegAddr,uint8_t *Data, uint8_t NBytes) { uint8_t i, bState; bState = I2CSendAddr(SlaveAddr,WRITE); if(bState){ I2CSendStop(); return IIC_NOACK; } bState = I2CSendByte(RegAddr); if(bState){ I2CSendStop(); return IIC_NOACK; } bState = I2CSendAddr (SlaveAddr,READ); if(bState){ I2CSendStop(); return IIC_NOACK; } for (i = 0; i < NBytes - 1; i++) { if (I2CGetByte(NOT_LAST_BYTE, &Data[i])){ I2CSendStop(); return IIC_SCL_TIMEOUT; } } if (I2CGetByte(LAST_BYTE, &Data[i])){ I2CSendStop(); return IIC_SCL_TIMEOUT; } I2CSendStop(); return IIC_OK; }
//------------------------------------------------------------------------------ // Function Name: I2C_WriteBlock // Function Description: Writes block of data from I2C Device //------------------------------------------------------------------------------ uint8_t I2C_WriteBlock( uint8_t SlaveAddr, uint8_t RegAddr, uint8_t NBytes, uint8_t * Data ) { uint8_t i, bState; bState = I2CSendAddr (SlaveAddr,WRITE); if( bState ){ I2CSendStop(); return IIC_NOACK; } bState = I2CSendByte(RegAddr); if(bState){ I2CSendStop(); return IIC_NOACK; } for (i=0; i<NBytes; i++) I2CSendByte(Data[i]); I2CSendStop(); return IIC_OK; }
/* * workAS() * Schnittstelle nur fuer das Modul Betriebsmittelverwaltung. Die * Schnittstelle dient dem Auslesen von maximal vier Meldungen der Module aus * dem Ringpuffer und deren Versendung ueber den I2C-Bus. * Fuer diese Uebertragung werden werden maximal 29 Bytes + Start- und * Stoppbits versendet. * * Nach Aufruf dieser Schnittstelle wird ueberprueft, ob der Ringpuffer leer * ist. Wenn dem so ist, muessen keine Daten untersucht werden und der Vorgang * wird beendet. * Andernfalls wird ueberprueft, ob der Lesezeiger AS_read_next_msg auf einen * gueltigen Index zeigt. Ggf. wird dieser durch Nullsetzen korrigiert. * Dadurch soll sichergestellt werden, dass im Folgenden nicht wahllose Werte * aus dem Speicher gelesen werden. * Es wird eine Wartepause von 1,568 ms eingelegt. * Dann wird versucht die I2C-Bus-Verbindung zum AD herzustellen. Dazu wird die * Funktion I2CSendAddr(addr, rd) mit den Parametern (8, WRITE) benutzt. * Schlaegt die Verbindung fehl, wird der Vorgang beendet. * Danach wird versucht maximal vier Meldungen zu versenden. Dazu werden * jeweils die naechsten 7 Daten aus dem Ringpuffer an der Stelle des * Lesezeigers AS_read_next_msg gelesen und mit Hilfe der Funktion * I2CSendByte(bt) wird sucht, sie zu versenden. Schlaegt die Verbindung fehl, * wird erst versucht die Verbindung zu beenden und danach wird der Vorgang * beendet. * Ist der Vorgang des Daten aus dem Ringpuffers versenden abgeschlossen, wird * versucht die Verbindung zu beenden. Dazu wird die Funktion I2CSendStop() * benutzt. * * Rueckgabe: Keine * * Autor: Felix Blueml */ void workAS() { // Maximale Anzahl Mitteilungen, die versendet werden. // byte maxSendMsg_workAS; // ist globale Variable // Zaehler fuer die beiden for-Schleifen, fuer die Versendung von // Mitteilungen. // byte i_workAS, j_workAS; // sind globale Variablen // Keine Elemente im Puffer zum versenden? if(!AS_msg_counter) { // Abbruch! return; } // Enthaellt AS_read_next_msg einen falschen Wert? if(AS_read_next_msg >= MAX_MELDUNGEN) { // Sicherstellen, dass nicht wahllos irgendwelche Werte aus // dem Speicher gelesen werden AS_read_next_msg = 0; } warten(); // eine Wartepause einlegen // Versuche eine schreibende Verbindung zum Arduino mit der // Adresse 4 herzustellen _i2c_error = 255; // Status: Kein Fehler I2CSendAddr(8, WRITE); if(_i2c_error != 255) // Fehler erkannt? { // Abbruch! return; } // Lese maximal 4 Mitteilungen aus dem Ringpuffer und versende sie if(AS_msg_counter<4) { maxSendMsg_workAS = AS_msg_counter; } else { maxSendMsg_workAS = 4; } for(i_workAS=0; i_workAS<maxSendMsg_workAS; i_workAS++) { for(j_workAS=0; j_workAS<7; j_workAS++) { // Versuche ein Byte aus dem Ringpuffer an den Arduino // zu versenden _i2c_error = 255; // Status: Kein Fehler I2CSendByte(AS_msg_array[AS_read_next_msg][j_workAS]); if(_i2c_error != 255) // Fehler erkannt? { // Versuche die Verbindung zu beenden I2CSendStop(); // Abbruch! return; } } // Eine komplette Statusmeldung wurde versendet, // Lesezeiger auf die naechste zu sendende Meldung setzen AS_read_next_msg = (AS_read_next_msg+1) % MAX_MELDUNGEN; // Fuellstand um 1 verringern AS_msg_counter--; } // Versuche die Verbindung zu beenden I2CSendStop(); }