跳到主要内容

06_编写APP直接访问EEPROM

编写APP直接访问EEPROM

参考资料:

  • Linux驱动程序: drivers/i2c/i2c-dev.c
  • I2C-Tools-4.2: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
  • AT24cxx.pdf

本节源码:GIT仓库中

  • doc_and_source_for_drivers/IMX6ULL/source/04_I2C/01_at24c02_test
  • doc_and_source_for_drivers/STM32MP157/source/A7/04_I2C/01_at24c02_test

1. 硬件连接

  • STM32MP157的I2C模块连接方法 image-20210225170942275

  • IMX6ULL的I2C模块连接方法 image-20210225171500459

2. AT24C02访问方法

2.1 设备地址

从芯片手册上可以知道,AT24C02的设备地址跟它的A2、A1、A0引脚有关:

image-20210225173113723

打开I2C模块的原理图(这2个文件是一样的):

  • STM32MP157/开发板配套资料/原理图/04_Extend_modules(外设模块)/eeprom.zip/i2c_eeprom_module_v1.0.pdf
  • IMX6ULL/开发板配套资料/原理图/Extend_modules/eeprom.zip/i2c_eeprom_module_v1.0.pdf
  • 如下: image-20210225173414072

从原理图可知,A2A1A0都是0,所以AT24C02的设备地址是:0b1010000,即0x50。

2.2 写数据

image-20210225173850025

2.3 读数据

可以读1个字节,也可以连续读出多个字节。 连续读多个字节时,芯片内部的地址会自动累加。 当地址到达存储空间最后一个地址时,会从0开始。

image-20210225173934939

3. 使用I2C-Tools的函数编程

4. 编译

4.1 在Ubuntu设置交叉编译工具链

  • STM32MP157

    export ARCH=arm
    export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
    export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
  • IMX6ULL

    export ARCH=arm
    export CROSS_COMPILE=arm-linux-gnueabihf-
    export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin

4.2 使用I2C-Tools的源码

image-20210225210415578

4.3 编译

为IMX6ULL编译时,有如下错误: image-20210225205509383

这是因为IMX6ULL的工具链自带的include目录中,没有smbus.h。

需要我们自己提供这个头文件,解决方法:

  • 提供头文件: image-20210225205724354

  • 修改Makefile指定头文件目录

    all:
    $(CROSS_COMPILE)gcc -I ./include -o at24c02_test at24c02_test.c i2cbusses.c smbus.c

4.4 上机测试

以下命令在开发板中执行。

  • 挂载NFS

    • vmware使用NAT(假设windowsIP为192.168.1.100)

      [root@100ask:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999
      192.168.1.100:/home/book/nfs_rootfs /mnt
    • vmware使用桥接,或者不使用vmware而是直接使用服务器:假设Ubuntu IP为192.168.1.137

      [root@100ask:~]# mount -t nfs -o nolock,vers=3 192.168.1.137:/home/book/nfs_rootfs /mnt
  • 复制、执行程序

    [root@100ask:~]# cp /mnt/at24c02_test /bin
    [root@100ask:~]# at24c02_test 0 w www.100ask.net
    [root@100ask:~]# at24c02_test 0 r

get data: www.100ask.net