在Beaglebone Black/bbblack上使用i2c读取rx8025硬件时钟

简绍如何在Beaglebone Black/bbblack上使用i2c设置和读取外置的rx8025硬件时钟。

如何使用

注意,

  • 目前仅支持rx8025t和rx8025sa;
  • 目前仅支持i2c1(P9_17和P9_18,默认未启用);
1
2
3
4
5
6
7
git clone https://github.com/zhangjunjia/beaglebone_black_bbblack_rx8025.git
cd beaglebone_black_bbblack_rx8025
gcc rtc-8025.c -o rtc-8025
## set bbblack os time to rx8025
./rtc-8025 set
## get rx8025time and set to os
./rtc-8025 get

原理简介

beaglebone的准备

  1. 搭配好rx8025外电路,笔者选用的是i2c1口;
  2. 参考BeagleBone Black I2C References设置i2c1(即bash下执行echo BB-I2C1 > /sys/devices/bone_capemgr.9/slots

通过文章可知rx8025芯片的默认slave address是0x32,在代码rtc-8025.c可见。

i2c-dev

笔者使用i2c-dev工具操作i2c设备与rx8025芯片进行通信。关于i2c-dev的详细实现见i2c-dev-interfaceImplementation details章节。简要描述下:操作i2c设备的驱动由内核负责,通过上文的设置将i2c设备映射为一个系统文件,就能在用户空间下对i2c设备进行读写编程,实质是内核操作i2c设备的系统调用,SCL和SDL的控制完全由内核驱动接管。

rx8025t和rx8025sa的差别

rx8025t的说明书见rx8025_cn,rx8025sa的说明书见RX8025SA。下面从编程的角度列举其不同点,

  • EEPROM:rx8025t的寄存器为EEPROM,这意味着每次读写rx8025t后,其PC指针将增加1,越限时回到0,rx8025sa则不是;
  • read操作结果不同:rx8025sa在使用read函数读取时,属于情况Read method from address Fh, with no specified start address for read opreation(说明书第26页),因此read函数返回结果的第一个字节其实是0x0F寄存器的内容,而rx8025t的第一个字节是秒寄存器;
  • 未就绪位不同:未就绪位为1表征芯片处于初始化状态或需要程序初始化芯片,此状态下寄存器的内容无意义,rx8025t的未就绪位为VLF,而rx8025sa为PON;
  • 小时表示不同:rx8025t默认使用24小时制,rx8025sa支持12/24小时制;
  • 写操作的不同:根据说明书时序图章节,rx8025t通过write函数写的第一个字节是寄存器的开始地址,而rx8025sa则是寄存器的开始地址加上传输模式。

TODO

为什么读取rx8025t时,通过read函数读取到的第一个字节是秒寄存器,从时序图的角度如何解释?

reference

  1. BeagleBone Black I2C References
  2. i2c-dev-interface