2011年8月3日 星期三

[ I2C Tool -1 ] I2C Bus 上的 I2C slave address scan

曾經~在某年某月某日
遇過某人提供過一片 電容式 Touch Pad ,
該片電容式 Touch Pad是透過 I2C 介面控制,讀取.
也給了 電容式 Touch Pad 規格書.
規格書上草草的放了幾個 register 與描述.
但是獨缺 電容式 Touch Pad 的 I2C slave address , 很蝦...

又再要了好幾次正確資料的過程中發現,真是雞同鴨講.
所以想到不如來寫段簡單的測試程式,
自己來找該 電容式 Touch Pad 的 Slave address 好了.( 真的是求人不如求己來著 汗~ )
於是有了這份 project



拿之前在台中上課使用的 base board做測試.
確實找到 base board上的 兩個 I2C Device ( LM75 0x9E 以及 BMA250 0x30 )的 Slave address.

主要的 code 如下



  temp_add = 0x02;
  while(1)
  {

    I2CCount = 0;
    I2CReadLength = 0;
    I2CWriteLength = 1;
    I2CMasterBuffer[0] = temp_add;
    I2CEngine();

    switch(I2CCount)
    {
    case 0x18:
        printf("Find I2C slave address = %x, \n",temp_add);
        yes++;
        break;
    case 0x20:
        no++;
        break;
    default:
        break;
    }

    if(temp_add == 0xfe)
    {
        printfs("\n");
        printfs("Finished !\n");
        break;
    }
      temp_add += 2;

  }



這邊使用一個 loop 依順序,從 0x02 每次加上 2 (只檢查 write) 做 Slave ack 確認.
若有 ack 反應就判為 I2C Bus上存在這個 Slave address.


至於如何判定是否有 Ack,
參考 User Manual







則放在  I2C_IRQHandler 中以下兩段 code.



    case 0x18:            /* Regardless, it's a ACK */
    I2CCount = 0x18;




Bus 上對 slave address 有 ack



    case 0x20:        /* regardless, it's a NACK */
    I2CCount = 0x20;



Bus 上對 slave address Nack

就這樣...
試試看你的 I2C Bus 上有哪些 slave device 吧..

從這裡下載 project Download page

2 則留言:

  1. 我讓 LPC1343 模仿 EEPROM 24C16 當 I2C slave device, 結果 連續接收二筆資料,第一筆常會丟失, 但第二筆則是穩定正常.

    回覆刪除
    回覆
    1. 可以在具體的描述 一筆是指 一串資料還是第一個byte?
      我使用起來沒遇過lose資料。 遇到這種問題比較難隔空把脈就是了。

      刪除

Related Posts Plugin for WordPress, Blogger...