Simple Test Program to check ACK from i2c Devices connected to an MBED board and then to report their addresses

Dependencies:   mbed TextLCD

Committer:
martinsimpson
Date:
Tue Jan 13 15:48:33 2015 +0000
Revision:
0:2db41a0c2f17
Child:
1:df2444f34fec
First Release - A simple program to help Identify i2c devices connected to an MBED Board and Display their Addresses

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martinsimpson 0:2db41a0c2f17 1 #include "mbed.h"
martinsimpson 0:2db41a0c2f17 2 #include "TextLCD.h"
martinsimpson 0:2db41a0c2f17 3
martinsimpson 0:2db41a0c2f17 4 #define Device_Name_ADDR (0xEE) // Device You Wish to Use Address - using i2c Address
martinsimpson 0:2db41a0c2f17 5 #define WRITE (0x00) // i2c Write bit
martinsimpson 0:2db41a0c2f17 6 #define READ (0x01) // i2c Read bit
martinsimpson 0:2db41a0c2f17 7
martinsimpson 0:2db41a0c2f17 8 /* This is a program to demonstrate the ease of use of the i2c bus
martinsimpson 0:2db41a0c2f17 9 and Detecting any Devices connected and returning their addresses
martinsimpson 0:2db41a0c2f17 10 Do not forget that Pull Up resistors are required on the SDA and SCL lines
martinsimpson 0:2db41a0c2f17 11 (Typically 2K ohms for 400KHz bus speeds) NB these could be provided on the PCB Modules.
martinsimpson 0:2db41a0c2f17 12 These are required since devices connected with the i2c will have 'open drain' (or open collector)
martinsimpson 0:2db41a0c2f17 13 circuitry to allow wire 'ORing' of their respective connections. Used with a stm32-Nucleo-F401RE.
martinsimpson 0:2db41a0c2f17 14 Used both Serial Port to USB and LCD Module to display results can use either or both just comment out if you wish.
martinsimpson 0:2db41a0c2f17 15 Martin Simpson January 2015 */
martinsimpson 0:2db41a0c2f17 16
martinsimpson 0:2db41a0c2f17 17 I2C i2c(I2C_SDA, I2C_SCL); //I2C Class Pin Assignments see I2C.h
martinsimpson 0:2db41a0c2f17 18
martinsimpson 0:2db41a0c2f17 19 Serial pc(SERIAL_TX, SERIAL_RX); //Serial Class Pin Assignments see Serial.h
martinsimpson 0:2db41a0c2f17 20
martinsimpson 0:2db41a0c2f17 21 TextLCD lcd(D2,D3,D4,D5,D6,D7); //Text LCD Class assignments RS, E, D4 to D7 see TextLCD.h
martinsimpson 0:2db41a0c2f17 22
martinsimpson 0:2db41a0c2f17 23 char ucdata_write[2];
martinsimpson 0:2db41a0c2f17 24 short count=0;
martinsimpson 0:2db41a0c2f17 25
martinsimpson 0:2db41a0c2f17 26 int main()
martinsimpson 0:2db41a0c2f17 27 {
martinsimpson 0:2db41a0c2f17 28 unsigned int uibaudrate=115200;
martinsimpson 0:2db41a0c2f17 29 pc.baud(uibaudrate);
martinsimpson 0:2db41a0c2f17 30
martinsimpson 0:2db41a0c2f17 31 unsigned int uifrequency=400000; //400KHz for i2c Max
martinsimpson 0:2db41a0c2f17 32 i2c.frequency (uifrequency);
martinsimpson 0:2db41a0c2f17 33
martinsimpson 0:2db41a0c2f17 34 pc.printf("\n\rHello World ");
martinsimpson 0:2db41a0c2f17 35 pc.printf("at %u BAUD and %uKHz i2c Frequency\n\r",uibaudrate,uifrequency/1000);
martinsimpson 0:2db41a0c2f17 36 pc.printf("Using mbed.org Martin\n\r");
martinsimpson 0:2db41a0c2f17 37
martinsimpson 0:2db41a0c2f17 38 lcd.cls();lcd.locate(0,0); //Tidy up LCD Display
martinsimpson 0:2db41a0c2f17 39
martinsimpson 0:2db41a0c2f17 40 ucdata_write[0]=0;ucdata_write[1]=0;
martinsimpson 0:2db41a0c2f17 41
martinsimpson 0:2db41a0c2f17 42 for (int Device_Adress=0;Device_Adress<=0xFE;Device_Adress+=2)//Stepping in 2 Because Read/Write use LSB
martinsimpson 0:2db41a0c2f17 43 {
martinsimpson 0:2db41a0c2f17 44 if (!i2c.write((Device_Adress|WRITE), ucdata_write, 1, 0))// Check for ACK from i2c Device NB I am 'ORing' the Write Bit
martinsimpson 0:2db41a0c2f17 45 {
martinsimpson 0:2db41a0c2f17 46 pc.printf("ACK from the Device at Address %#4x\n\r",Device_Adress);
martinsimpson 0:2db41a0c2f17 47 lcd.printf("ACK at:%#4x\n",Device_Adress);
martinsimpson 0:2db41a0c2f17 48 count=count+1;
martinsimpson 0:2db41a0c2f17 49 wait(2);
martinsimpson 0:2db41a0c2f17 50 }
martinsimpson 0:2db41a0c2f17 51 else
martinsimpson 0:2db41a0c2f17 52 {
martinsimpson 0:2db41a0c2f17 53 //Left the following in for development/Future coding
martinsimpson 0:2db41a0c2f17 54 //pc.printf("\n\rCannot get an ACK from the Device check connections!\n\r");
martinsimpson 0:2db41a0c2f17 55 //lcd.printf("No ACK from\nDevice!");
martinsimpson 0:2db41a0c2f17 56 }
martinsimpson 0:2db41a0c2f17 57 }
martinsimpson 0:2db41a0c2f17 58 pc.printf("\n\r %d Devices have been detected!\n\r",count);
martinsimpson 0:2db41a0c2f17 59 lcd.printf("%d Dev Found!",count);
martinsimpson 0:2db41a0c2f17 60 }