2016年9月9日 星期五

[Raspberry] 在Raspberry Pi 2 使用 I2C

網路上找到的,Raspberry Pi2 Model B 40 Pin GPIO接腳圖,其中:GPIO3 I2C SDA1,GPIO5 I2C SCL1,GPIO9 GND

找到的資料有提及:
電流輸出的限制:每個接腳輸出最大為16mA,全部接腳同時最大輸出為50mA
GPIO3.3V準位




pi@raspberrypi:~ $ lsmod   (檢查系統所載入的module)
Module                  Size  Used by
.
i2c_bcm2708             4834     0
i2c_dev                 5859     0


pi@raspberrypi:~ $ sudo  i2cdetect  (列舉出系統上的I2C裝置)
i2c-1   i2c          3f804000.i2c   I2C adapter


pi@raspberrypi:~ $ sudo  i2cdetect  -y  1  (列出可用的slave address)
    0 1 2 3 4 5 6 7 8 9 a b c d e f
00:      -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- 14 -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- 55 -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                        


 pi@raspberrypi:~ $ sudo i2cget -y 1 0x55 0x2c   (讀取SOC low bte)
0x31
pi@raspberrypi:~ $ sudo i2cget -y 1 0x55 0x2d   (讀取SOC high bte)
0x00


pi@raspberrypi:~ $ sudo i2cdump -y 1 0x55
No size specified (using byte-data access)
        0 1   2   3   4  5  6  7  8    9 a    b   c  d    e  f
00: 00 00 00 00 ff 7f a6 0b 2a 0f c0 01 34 05 9f 0a    .....???*???4???
10: 34 05 9f 0a 00 00 ff ff 00 00 00 00 ff ff 00 00    4???............
20: ff ff 79 04 00 00 ff ff a6 0b 00 00 31 00 64 00    ..y?....??..1.d.
30: 00 00 34 05 00 00 00 00 00 00 00 00 be 0a 78 94    ..4?........??x?
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00    ........ .......
70: 00 00 c3 0b 00 00 55 00 00 00 00 00 00 00 00 00    ..??..U.........
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX


安裝 libi2c-dev (sudo apt-get install libi2c-dev)
有安裝就可使用 i2c_smbus_read_word_data 等眾多function,不然只有簡單 read/write 可用
如果有用 python,安裝 python-smbus


C的程式如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>

using namespace std;

/*
*
*/
int main(int argc, char** argv) {
int file_i2c;
int length;
unsigned char buffer[100]={0};
char *filename=(char *)"/dev/i2c-1";    

//open the bus
if((file_i2c=open(filename,O_RDWR))<0)
{
    printf("Failed to openthei2c bus\n\r");
    return 0;
}
else
    printf("open /dev/i2c-1 ok!\r\n");

//setup slave address
int addr=0x55;
if(ioctl(file_i2c,I2C_SLAVE,addr)<0)
{
    printf("Failed to acquire bus acess and/or talk toslave");
    return 0;
}
else
    printf("setup slaveaddress to 0x55 ok!\r\n");


length=2;
if(read(file_i2c,buffer,length)!=length)  //not useful
{
    printf("Failed to read  from i2c bus\r\n");
    return 0;
}
else
    printf("Data read:%x %x\r\n",buffer[0],buffer[1]);


int dat;
dat=i2c_smbus_read_word_data(file_i2c,0x3e);
 if(dat<0)
 {
     printf("read failed\r\n");
 }
 else
 {
     printf("Data read:%lx \r\n",dat);
 }

printf("finish\n\r");  

close(file_i2c);

return 0;
}





不錯的參考資料
(1)   安裝編譯C/C++
[How To Raspberry Pi] 安裝 GCC
Raspberry Pi:Pi 2 Raspbian 上安裝NetBeansIDE,撰寫JavaC++ 程式

(2)安裝/啟動 I2C driver
I2C Installation for Raspberry Pi – Step by Step Guide
讓你的Raspberry Pi透過I2C讀取EEPROM

(3)參考文章:
Raspberry Pi:如何更新Raspbian
Raspberry Pi:Raspbian套件列表
Raspberry Pi安裝中文環境
http://yehnan.blogspot.tw/2012/08/raspberry-pi.html 
黑傑克的筆記
I2C Drivers, Part I
Interfacing an I2C GPIO expander(MCP23017) to the Raspberry Pu using C++(i2Cdev)
Using the I2C interface












沒有留言:

張貼留言