总线一:IIC( 二 )


4. 第一个字节的发送期间 , 软件可以写第二个字节到 , 此时TBE位被清0 , 因为寄存器和移位寄存器都不是空 。
5. 第一个字节的发送完成之后 ,  TBE被再次置起 , 软件可以写第三个字节到 , 同时TBE位被清0 。在此之后 , 任何时候TBE被置1 , 只要依然有数据待被发送 , 软件都可以写入一个字节到寄存器 。
6. 倒数第二个字节发送期间 , 软件写最后一个数据到寄存器来清除TBE标志位 , 之后就再不用关心TBE的状态 。TBE位会在倒数第二个字节发送完成后置起 ,  直到检测到STOP结束位时被清0 。
7. 根据I2C协议 ,  I2C主机将不会对接收到的最后一个字节发送应答 , 所以在最后一个字节发送结束后 ,  I2C从机的AERR会置起以通知软件发送结束 。软件写0到AERR位可以清除此位。
从机发送模式如下图所示:
八、从机接收模式下的软件流程
在从机模式下接收数据时 , 软件应该遵循这些步骤来操作:
1. 首先 , 软件应该使能I2C外设时钟 , 以及配置中时钟相关寄存器来确保正确的
I2C时序 。使能和配置以后 ,  I2C运行在默认的从机模式状态 , 等待START起始位以及地址 。
2. 在接收到START起始条件和匹配的7位或10地址之后 ,  I2C硬件将I2C状态寄存器的
位置1 , 此位应该通过软件轮询或者中断来检测 , 发现置起后 , 软件通过先读
寄存器然后读寄存器来清除位 。一旦位被清
0 ,  I2C就开始接收来自I2C总线的数据 。
3. 一旦接收到第一个字节 ,  RBNE位被硬件置1 , 软件可以读取寄存器的第一个字
节 , 此时RBNE位也被清0 。
4. 任何时候RBNE被置1 , 软件可以从寄存器读取一个字节 。
5. 接收到最后一个字节后 ,  RBNE被置1 , 软件可以读取最后的字节 。
当I2C检测到I2C总线上一个STOP结束位 ,  位被置1 , 软件通过先读
寄存器再写寄存器来清除位 。
丛机接收模式如下图所示:
九、主机发送模式下的软件流程
在主机模式下发送数据到I2C总线时 , 软件应该遵循这些步
骤来运行I2C模块:
1. 首先 , 软件应该使能I2C外设时钟 , 以及配置中时钟相关寄存器来确保正确的
I2C时序 。使能和配置以后 ,  I2C运行在默认的从机模式状态 , 等待START起始位 ,  随后等
待I2C总线寻址 。
2. 软件将START位置1 , 在I2C总线上产生一个START起始位 。
3. 发送一个START起始位后 ,  I2C硬件将的位置1然后进入主机模式 。
现在软件应该读寄存器然后写一个7位地址位或带有地址头的10位地址位到
寄存器来清除位 。一旦位被清0 ,  I2C就开始发送地址或者地
址头到I2C总线 。如果发送的地址是10位带地址头的地址 , 硬件在发送地址头的时候会将
位置1 , 软件应该通过读寄存器然后写10位低地址到
来清除位 。
4. 7位或10位的地址位发送出去之后 ,  I2C硬件将位置1 , 软件应该清除
位(通过读寄存器然后读寄存器) 。
5. I2C进入数据发送状态 , 因为移位寄存器和数据寄存器都是空的 , 所以硬件将TBE位置1 。此时软件可以写第一个字节数据到寄存器 , 但是TBE位此时不会被