protocolo I2C en el IDE en línea de mbed usando dos tarjetas STM32F429ZI

0

Estoy intentando enviar un mensaje desde el esclavo (STM2) a mi maestro (STM1) .pero no muestra nada en mi terminal serial. sólo quiero enviar y recibir datos entre amo y esclavo

mi código maestro:

#include "mbed.h"

I2C i2c(PB_9,PB_6);      
Serial pc(USBTX, USBRX); 



int main() {
    const int addr = 0xA0;
    int a,b;
    char buff[10]; const char data[]="message master"; 

    i2c.frequency(10000);

    while(1) { 
    /* i2c.start();                             
        a=i2c.read(addr, buff,10,1);
        wait(1);        
        pc.printf("Read %d", a);        
        i2c.stop();                
        pc.printf("MASTER READ: %s \n\r", buff);*/         
        i2c.start();        
        b=i2c.write( addr, data, strlen(data)+1);        
        wait(0.07);          
        i2c.stop();        
        pc.printf("Write %d\n\r", b);        
        for(int i = 0; i < 10; i++) buff[i] = 0;

        }
 }

Mi código de esclavo:

#include "mbed.h"

I2C i2c(PB_9,PB_6);
Serial pc(USBTX, USBRX);   

int main() {    

    const char test[]= "message slave";
    char buf[10];
    int i, b;

    i2c.frequency(10000);
    slave.address(0x01);    

    while(1) {

        i = slave.receive();
        wait(0.75);

        switch (i) {

            case I2CSlave::ReadAddressed:

                slave.stop();
                b=slave.write(test, strlen(test) + 1); 
                wait(0.75);

                pc.printf("Return Slave %d", b);// only to check return value

                break;
            case I2CSlave::WriteGeneral:

                slave.stop();
                slave.read(buf, 10);
                wait(0.75);
                pc.printf("SLAVE Read G: %s\n\r", buf);
                break;
            case I2CSlave::WriteAddressed:

                slave.stop();
                slave.read(buf, 10);
                wait(0.75);
                pc.printf("SLAVE Read A: %s\n\r", buf);
                break;
        }
        for(int i = 0; i < 10; i++) buf[i] = 0;        

    }
}
    
pregunta user1811790

2 respuestas

1

Su dirección de envío y su dirección de esclavo no coinciden.

Establece la dirección de acceso como 0xA0 en el maestro, y establece la dirección del esclavo como 0x01 . Tienen que coincidir entre sí.

Además, en el direccionamiento I2C, el bit menos significativo se usa para el bit de Lectura / Escritura. así que LSB bit en la dirección de esclavo se ignora , lo que significa 0x01 para la dirección del esclavo no es válido y la dirección del esclavo podría ser una dirección de llamada general, 0x00 . Así que intenta cambiarlo a slave.address(0xA0); en tu código esclavo.

Añadido: No olvide agregar resistencias de levantamiento en los dos cables.

    
respondido por el Bumsik Kim
0

Creo que deberías usar direcciones de 8 bits

const int addr7bit = 0x48;      // 7 bit I2C address
const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90

enlace

    
respondido por el Roskoto

Lea otras preguntas en las etiquetas