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;
        }
    }
}
Be the first to answer this question.