Hallo,
Zitat :
|
i2c_start();
/* A START condition has been transmitted */
i2c_transmit(0x78 << 1);
/* SLA+W has been transmitted; ACK has been received */
received_data = i2c_receive(NACK);
/* Data byte has been transmitted; NOT ACK has been received */
i2c_stop();
/* Data byte has been transmitted; NOT ACK has been received */
Der Slave hat quasi geantwortet, nur sendet er keine Daten... auch nicht mit i2d_receive(ACK)
|
Ja, ist klar.
Du sendest ja auch SLA+W, nicht SLA+R.
Versuch mal sowas in der Art:
#define SLA (0x78<<1)
#define READ 1
uint8_t data[4];
i2c_start();
i2c_transmit(SLA + READ);
data[0] = i2c_receive(ACK);
data[1] = i2c_receive(ACK);
data[2] = i2c_receive(ACK);
data[3] = i2c_receive(NACK);
i2c_stop();
Für Debug würde ich nach jeder i2c-Transaktion via i2c_get_status() den Status über die UART an den PC senden und dann mit dem Datenblatt die Zustände abgleichen.
Offenbar hört der Slave ja auf seine Schreibadresse, nur ist das hier uninteressant.
_________________