一、主机发送模式
在主机发送模式下,向从机接收器发送几个数据字节。主机通过 CR[2:0]设置期望时钟速率并向IICEN 位写 1 使能 IIC 总线,设置 STA 位为 1 进入主机发送模式,只要总线空闲,硬件将测试总线并产生起始信号,成功产生起始信号后,SI 标志位将置位且 IICSTA 的状态码为 08H,之后就是给 IICDAT载入目标从机地址和数据方向位“写”(SLA+W),SLA+W 开始传输时 SI 位必须清零。
主机发送模式流程与状态
二、主机接收模式
在主机接收模式下,从从机发送器接收几个字节的数据。传输开始与主机发送模式相似,在起始信号之后,IICDAT 应该加载目标从机地址和数据方向位“读”(SLA+R),SLA+R 字节发送后,且返回应答位,重新置位 SI 标志且 IICSTA 读出为 40H,SI 标志应该被清零以便接收从机发送过来的数据,如果 AA 标志位置位,主机接收器将应答从机发送器,如果清零 AA,主机接收器将不会应答从机,并释放从机发送器为不被寻址的从机,然后主机产生停止信号或重复起始信号中止传输或开始另一次传输。
主机接收模式流程与状态
三、从机发送模式
在从机发送模式下,发送几个字节数据到主机接收器。确定 IICADR 和 IICCON 的值之后,IIC等待自己的地址被寻址“读”(SLA+R)。如果仲裁失败后,也可以进入从机发送模式。
在从机被 SLA+W 寻址后,应该清 SI 标志以便传输数据到主机发送器,通常主机接收器将在从机发送每个字节数据之后返回应答,如果没有接收到应答,如果继续传输将发送全“1”,就成为不被寻址的从机,如果在传输中清了 AA 标志,从机发送最后一个字节数据,下一次传输数据全为“1”,从机成为不被寻址。
从机发送模式流程与状态
四、从机接收模式
在从机接收模式下,从主机发送器接收几个字节数据。发送开始之前,IICADR 必须装载响应器件的地址,以让主机寻址,AA 位必须设置使能应答自身从机地址或广播呼叫,完成以上初始过程后,IIC 等待自身地址被寻址与数据方向位“写”(SLA+W)或被广播呼叫寻址。如果在仲裁失败时,也可以进入从机接收模式。
在从机被 SLA+W 寻址后,应该清 SI 标志以便接收主机发送过来的数据,传输期间,如果 AA 位为 0,从机将在下一次接收到的数据字节之后返回无应答(non-acknowledge),从机也不被寻址并与主机分离,不能接收 IICDAT 的任何字节,而保持当前接收到的数据字节。
从机接收模式流程与状态
五、广播呼叫
广播呼叫是从机接收模式的一种特殊情况,即从机地址和数据方向位全为 0,被广播呼叫寻址的从机在正常从机接收模式的 IICSTA 里有不同状态码,如果仲裁失败,也可以产生广播呼叫。
六、其他状态
其他状态有两个 IICSTA 状态码与 24 个定义状态不一致,即前面提到的 0F8H 和 00H 状态。第一个状态码 0F8H 表示在每次传输期间没有得到相关信息,同时,SI 标志为 0 且没有 IIC 中断请求。
另一个标志码 00H 意味在传输过程中发生错误,总线错误是由 START 或停止信号暂时出现在一个非法的位置,如地地址字节里第 2 位换到第 8 位,或数据字节包括应答位,当出现总线错误时,SI标志立即置位,当在 IIC 总线上检测到总线错误,工作器件立即切换到不被寻址从机模式,释放 SDA和 SCL 总,置位 SI 标志,将 00H 载入 IICSTA。要从总线错误恢复,STO 位必须设置为逻辑 1 且 SI必须清零,然后,STO 由硬件清零且在没有停止信号就释放 IIC 总线。
特例:如果没有成功产生 START 或重复起始信号,IIC 总线被 SDA 的低电平阻挡,如一个从 CPU时钟件没有位同步,可以通过在 SCL 总线上发送额外时钟脉冲解决这个问题。当 STA 位置位时,IIC 硬件发送额外时钟脉冲,但是由于 SDA 被拉低,不能产生起始信号,当 SDA 总线最终被释放,发送一个普通的 START 条件,进入状态 08H,继续进行串行传输。当 SDA 为低,如果发送重复起始信号,IIC 硬件也执行以上相同的动作。此情况下,在成功发送起始信号后,进入状态 08H,而不是进入 10H。
注:软件不能解决这类总线问题。
本文总结了HC18M003单片机的IIC设备的集中工作模式、工作流程以及状态码的说明。文中SLA指的是从机地址,“SLA+R”指的是读从机的操作,“SLA+W”指的是写从机的操作。通常写从机的指令=读从机指令+1。因为这个1,代表的是B0位,这个位是用来区分读写操作的。这里的“读”,不要理解成从从机获取任何信息。在主机发送模式下,在通讯过程中从机也是要恢复诸如“ACK”或者“NACK”信号的,这个不能算作读操作。
通常情况下,我们接触到的“单向写”多一些,就是只向从机发送指令和数据,并不从从机获取数据。例如对于我们常用的0.96英寸的IIC总线OLED,它只需要向0x78地址写指令、数据,来完成显示处理。