简绍如何在Beaglebone Black/bbblack上使用i2c设置和读取外置的rx8025硬件时钟。
如何使用
注意,
- 目前仅支持rx8025t和rx8025sa;
- 目前仅支持i2c1(P9_17和P9_18,默认未启用);
1 | git clone https://github.com/zhangjunjia/beaglebone_black_bbblack_rx8025.git |
原理简介
beaglebone的准备
- 搭配好rx8025外电路,笔者选用的是i2c1口;
- 参考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-interface的Implementation 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
函数读取到的第一个字节是秒寄存器,从时序图的角度如何解释?