Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
9 years, 5 months ago.
I2C - ACK not sent by slave
Hello everyone, I'm trying to make 2 nucleo boards communicate through I2C but i'm facing some issues; I'm sending 5 bytes but only the first 4 are received and no ack is sent by the slave, what can i do?
Master
#include "mbed.h" //MASTER NUCLEO-L476RG I2C i2c(PB_9,PB_8); // sda, scl Serial pc(PA_2, PA_3); const int addr = 0x78; // define the I2C Address int main() { char cmd[2]; pc.printf("INIZIO\n"); i2c.frequency(400000); while(1) { char str[] = "stringa"; cmd[0] = 0x0; // pointer to command register cmd[1] = 0x51; // Start ranging, results in cm int x =i2c.write(addr, "abcde", 5); // Send command string pc.printf("%d\n",x); wait(1); } }
slave
//SLAVE NUCLEO-F446RE #include "mbed.h" I2CSlave slave(PB_9,PB_8); Serial pc(PA_2, PA_3); DigitalOut led1(LED1); int main() { pc.printf("Welcome\n"); char buf[8] = {""}; int val; uint16_t * controlregister = 0x0000; uint16_t content = *controlregister; *controlregister=0x0001; pc.printf("control register content: %x\n",content); slave.frequency(400000); slave.address(0x78); pc.printf("Starting program"); while (1) { int i = slave.receive(); if(i == 0) continue; pc.printf("Slave Receive: %d: \n", i); switch (i) { case I2CSlave::ReadAddressed: val = slave.write(buf, 4); // Includes null char pc.printf("ReadAddressed: %d\n\r", val); break; case I2CSlave::WriteGeneral: val = slave.read(buf, 4); pc.printf("WriteGeneral: %d\n\r", val); break; case I2CSlave::WriteAddressed: val = slave.read(buf, 8); pc.printf("WriteAdressed: %s return %d\n\r", buf,val); for(int i = 0; i < 8; i ++) { pc.printf(" %d \t ", buf[i]); } break; } } }