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, 7 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;
}
}
}