Simple Test Program to check ACK from i2c Devices connected to an MBED board and then to report their addresses
main.cpp@0:2db41a0c2f17, 2015-01-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |