树莓派的I2C - AT24C02 EEPROM 芯片

目标:学习树莓派的I2C模块,理解Linux i2c device driver。

AT24Cxx EEPROM系列的芯片正好符合我的要求,价格便宜,功能简单。


1. 为了方便面包板实验,芯片的买的是DIP封装

树莓派的I2C - AT24C02 EEPROM 芯片_第1张图片  树莓派的I2C - AT24C02 EEPROM 芯片_第2张图片
2. 实验的原理图如下,注意SCL,SDA引脚要接10K的上拉电阻 (也有的说要接4.7K,到底是根据什么来确定?)
地址线线A0,A1,A2都接地,通过查看datasheet,这种配置下,I2C address是0x50
写保护WP接地,这样就可以正常读写该芯片了。VCC接的是树莓派的3.3V
树莓派的I2C - AT24C02 EEPROM 芯片_第3张图片
3. 面包板电路接好后如下所示

树莓派的I2C - AT24C02 EEPROM 芯片_第4张图片

树莓派的I2C - AT24C02 EEPROM 芯片_第5张图片

树莓派的I2C - AT24C02 EEPROM 芯片_第6张图片


4. 首先,参考 树莓派的I2C配置
然后查看I2C的设备速率

$ sudo cat /sys/module/i2c_bcm2708/parameters/baudrate

10000

默认的I2C速度为100KHz,对于多数I2C设备而言100KHz并不算快,但是对于个别的I2C设备而言100KZH还是太快了,那么也可以修改I2C的速率使得通信更稳定。我发现,33KHz的时候读AT24c02没问题,但是写有问题。最后,我配置为10KHz的时候,读写都没有问题了。原因可能是面包板上用杜邦线连接I2C,从而导致信号较差吧。
所以,修改下面的配置文件
$ sudo vim /etc/modprobe.d/custom.conf
增加配置项  options i2c_bcm2708 baudrate=10000
然后重启树莓派  
$ sudo reboot

5. 接下来,用 i2c tools 进行基本的调试 (我的树莓派是用的I2C-1)
$ sudo i2cdetect -l
i2c-0 i2c bcm2708_i2c.0 I2C adapter
i2c-1 i2c bcm2708_i2c.1 I2C adapter


$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: 50 51 52 53 54 55 56 57 -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         


$ sudo i2cdump -y 1 0x50

No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 66 15 16 27 38 ff ff ff ff ff ff ff ff ff ff ff    f??'8...........
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................


$ sudo i2cset -y 1 0x50 0x00 0x5a
$ sudo i2cget -y 1 0x50 0x00
0x5a


6. 最后,用自己的程序读一下AT24C02 EEPROM

树莓派的I2C - AT24C02 EEPROM 芯片_第7张图片

#include 
#include 
#include 
#include 
#include 

#define I2C_ADDR_AT24C02 0x50

int main(int argc, char **argv)
{
    int rc = 0;
    int i = 0;
    int counter = 0;
    unsigned char rbuf = 0;

	if (!bcm2835_init())  
		return 1;  

    bcm2835_i2c_begin();
    bcm2835_i2c_setSlaveAddress(I2C_ADDR_AT24C02);
    bcm2835_i2c_set_baudrate(10000); /* 10 KHz */
    
    // read
    counter = 8;
    for (i = 0; i < counter; i++) {
        rc = bcm2835_i2c_read(&rbuf, 1);
        if (!rc) {
            printf("Read rbuf = %x\n", rbuf);
        } else {
            printf("ERROR! rc = %d\n", rc);
        }
    }

    // Just leave them as i2c pin to make i2c tools happy :-)
    //bcm2835_i2c_end();   
    bcm2835_close();

    return 0;
}

$ sudo ./at24c02 
Read rbuf = 5a
Read rbuf = 15
Read rbuf = 16
Read rbuf = 27
Read rbuf = 38
Read rbuf = ff
Read rbuf = ff
Read rbuf = ff



你可能感兴趣的:(RaspberryPi)