1、IIC 简介
第二节代码会用到该部分内容,对于 IIC 来说,从机
是不能主动发送数据的,开始条件都是由主机生成。
1.1、主机发送数据流程
1) 主机在检测到总线为“空闲状态”(即 SDA、
SCL 线均为高电平)时,发送一个启动信号“S”,开
始一次通信的开始
2) 主机接着发送一个命令字节。该字节由 7 位的
外围器件地址和 1 位读写控制位 R/W 组成(此时
R/W=0)
3) 相对应的从机收到命令字节后向主机回馈应答信
号 ACK(ACK=0)
4) 主机收到从机的应答信号后开始发送第一个字节
的数据
5) 从机收到数据后返回一个应答信号 ACK
6) 主机收到应答信号后再发送下一个数据字节
7) 当主机发送最后一个数据字节并收到从机的
ACK 后,通过向从机发送一个停止信号 P 结束本次
通信并释放总线。从机收到 P 信号后也退出与主机
之间的通信
1.2、主机接收数据流程
1) 主机发送启动信号后,接着发送命令字节(其中
R/W=1)
2) 对应的从机收到地址字节后,返回一个应答信号
并向主机发送数据
3) 主机收到数据后向从机反馈一个应答信号
4) 从机收到应答信号后再向主机发送下一个数据
5) 当主机完成接收数据后,向从机发送一个“非应
答信号(ACK=1)”,从机收到 ASK=1 的非应答信
号后便停止发送
6) 主机发送非应答信号后,再发送一个停止信号,
释放总线结束通信
1.3、处理器的 I2C 模块会在如下所述的情况产生中
断信号
RX_UNDER 当处理器通过 IC_DATA_CMD 寄存
器读取接收缓冲器为空时置位
RX_OVER 当接收缓冲器被填满,而且还有数据
从外设发送过来时被置位;缓冲器被填满后接收的数
据将会丢失
RX_FULL 当接收缓冲器达到或者超过 IC_RX_TL
寄存器中规定的阈值时被置位;当数据低于阈值时标
志位将被自动清除
TX_OVER 当发送缓冲器被填满,而且处理器试
图发送另外的命令写 IC_DATA_CMD 寄存器时被置
位
TX_EMPTY 当发送缓冲器等于或者低于
IC_TX_TL 寄存器中规定的阈值时被置位;当数据高
于阈值时标志位将被自动清除
TX_ABRT 当 i2c 模块无法完成处理器下达的命令
时被置位,有如下几种原因:
* 发送地址字节后没有从机应答
* 地址识别成功后主机发送的数据
从机没有应答
* 当 i2c 模块只能作为从机时试图发
送主机命令
* 当模块的 RESTART 功能被关
闭,而处理试图完成的功能必须要 RESTART 功能
开启才能完成
* 高速模块主机代码被应答
* START BYTE 被应答
* 模块仲裁失败
无论标志位什么时候被置位,发送
缓冲器和接收缓冲器的内容都会被刷新
ACTIVITY 表明 i2c 模块正在活动,这个标志位将
会一直保持直到用以下 4 种方式清除:
* 关闭 i2c
* 读取 IC_CLR_ACTIVITY 寄存器
* 读取 IC_CLR_INTR 寄存器
* 系统重启
即使 i2c 模块是空闲的,这个标志
仍然需要被置位直到被清除,因为这表明 i2c 总线上
有数据正在传输
需要用到的:
RD_REQ 当 i2c 模块作为从机时并且另外的主
机试图从本模块读取数据时被置位
RX_DONE 当 i2c 模块作为从机发送数据时,如
果主机没有应答则置位;这种情况发生在 i2c 模块发
送最后一个字节数据时,表明传输结束
STOP_DET 表明 i2c 总线上产生了 STOP 信号,
无论模块作为主机还是从机
START_DET 表明 i2c 总线上产生了 START 信
号,无论模块作为主机还是从机
2、IIC 从机中断收发函数
// 从机收发函数处理
void I2C1_EV_IRQHandler(void)
{