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.
6 years, 8 months ago.
Nucleo F103RB i2c Problem
Good Day everyone!
I have this setup here:
Note: I just use the battery image as reference for power supply. Power supply I used here is MiWi 5V/3A
I ran this code on the Master Device.
F103RB_I2C_Master
#include "mbed.h" I2C i2cMaster(PB_9, PB_8);// SDA, SCL Serial pc(USBTX, USBRX); int main() { char writeData[2]; pc.baud(57600); pc.printf("Starting I2CMaster\r\n"); i2cMaster.frequency(400000); while(1) { int count = 0; for (int address=0; address<256; address+=2) { if (!i2cMaster.write( address , NULL, 0)) { // 0 returned is ok pc.printf("I2C address 0x%02X\r\n", address); count++; } } pc.printf("%d devices found\r\n", count); wait(2); } }
And this code on Slave Device
F103RB_I2C_Master
#include <mbed.h> I2CSlave slave(PB_11, PB_10); Serial pc(USBTX, USBRX); #define ADDRESS 0x50 int main() { pc.baud(57600); pc.printf("Starting slave device at address:0x%02x\r\n", ADDRESS); slave.address(ADDRESS); slave.frequency(400000); //Set the clock frequency char buf[2]; char msg[1]; msg[0] = 0x00; int j = 1; while (1) { myled = 1; int i = slave.receive(); if(i > 0) pc.printf("rcv:%d\r\n", i); switch (i) { case I2CSlave::ReadAddressed: pc.printf("I2CSlave::ReadAddressed\r\n"); //slave.write(msg, strlen(msg) + 1); // Includes null char break; case I2CSlave::WriteAddressed: pc.printf("I2CSlave::WriteAddressed\r\n"); slave.read(buf, 2); printf("Read A: 0x%02x, 0x%02x\r\n", buf[0], buf[1]); break; } buf[0] = 0; // Clear buffer buf[1] = 0; msg[0] = j; j++; } }
The problem is the Master Device cannot detect the Slave device(address = 0x50). It already scan address from 0 to 256. Is there something with my code or on my hardware setup?
Here is the logic analyzer result for more info:
I'm hoping somebody can help me on this issue. I already doing this for 3 days but the issue is still there. I already also tried the other I2C pins but still no success.
Best Regards, Lester
2 Answers
6 years, 8 months ago.
Hello Lester,
In your code for the slave device rather than first setting address and then frequency:
slave.address(ADDRESS); slave.frequency(400000); //Set the clock frequency
try to first set frequency and then address:
slave.frequency(400000); //Set the clock frequency slave.address(ADDRESS);
6 years, 8 months ago.
Hi Lester. I think the issue may be with your hardware setup. Believe you are not mating with the proper I2C pins on the (Master - left side) Nucleo board.
Shift the YELLOW wire up by one position.
Then do the same with the GREEN wire up by one position.
The top 2 pins on the board are the I2C lines and the diagram appears to be shifted down by one pin. Please post your results for future readers.
Also, for your I2C slave, after the above change to the wiring, consider to use an I2C address of 0xA0 (ie. 0x50 << 1) due to this similar topic thread:
https://os.mbed.com/questions/672/I2C-master-and-slave/
BTW: We are also working with I2C and the same target but as I2C Master only as of yesterday and is working fine using the same I2C port pins.
-
Update - ignore my comments on the I2C port pins. You do have that correct as the CN10 pins are shifted down by a pin so working with pins 3 & 5.
The issue could be just your I2C address value - try the 0xA0 on your slave and post your results.
Update # 2
Now I recall why this sounds so familiar...do review this lengthy thread and hope it helps you:
https://os.mbed.com/forum/platform-34-ST-Nucleo-F401RE-community/topic/26679/?page=1#comment-52936