前面的章节讲述了单组 8 位数据的发送,但是仅仅发送单组数据往往是不够的, 因为实际上I2C协议的芯片需要传输多组数据。在使用 PCF8563和 AT24C02 之类的芯片之前,我们需要准备好实现多组数据的发送代码。
I2C 的多组数据连续发送与单组数据稍有差异,时序图如下:
上图由于长度关系只展示两组数据,实际上的 I2C 通讯的数据一般在 4组以上。时序也是类似的,这里不再赘述。
经过多次调试实现的 I2C 多组数据连续发送代码如下:
代码将 I2C 的信号传输分为4个函数:
- 发送起始位 i2c_start_bit
- 发送数据位 i2c_data_bit
- 发送应答位 i2c_ack_bit
- 发送停止位 i2c_stop_bit
I2C 速率较高,在 I2C 的发送过程中如果进行计算数据发送会大大的延迟。所以,在发送前必须计算完所有需要发送的数据。
由于 Keil C51 不支持动态数组,这里的声明的二维数组为 8 * 8的。这段代码允许连续发送的数据不超过 8 个,如果数据超过这个限制就需要做出修改。
逻辑分析仪给出的结果如下:
逻辑分析仪输出了四位数据 01、02、03、04,可以看到代码工作的还算不赖。由于没有接芯片,所以逻辑分析仪显示 ACK 位没有应答。
(●'◡'●),这样的话,I2C 的部分就基本准备结束了,下一章节将以 PCF8563 为例,用 I2C 协议实现 RTC 的功能。