2440通过I2C总线连接设备(AT24Cxx),芯片内部有一个I2C控制器。
当主机(2440)Master为Transmitter时,从机Slave为Receiver,当主机Master为Receiver时,从机Slave为Transmitter。
下图是2440的I2C总线框图。从左往右看,首先是I2C的时钟,I2C的时钟源是PCLK(50MHz),经过一个4bit的分频器,产生I2C的时钟。通过IICSTAT寄存器发出信号,通过IICDS发送数据或接受数据。
数据的传输格式如下图如所示。首先发出开始信号S,然后是7位的从设备地址,1位的读写标志位,然后等待从机返回一个ACK信号,如果是发送数据,那么就将1B数据发出,然后等待从设备回传ACK,如果是接受,那么就接收从设备返回的1B的DATA数据,然后给从设备发送一个ACK信号,如果要结束传输,就使用一个P信号来结束。
在第九个时钟信号产生了中断,在中断处理过程中,SCL为低,谁都不可以使用I2C。
那么,在中断中做什么呢?
- 对于写,如果没有ACK,则出错,要结束传输(发出P信号);若有ACK,那么说明传输成功,这时若仍有数据,则继续写入IICDS,并清中断,若无数据要传输,则发出结束信号;
- 对于读,收到数据后要回应一个ACK信号,若还有数据要读,则清中断,启动下一次传输;若不想读了,则发送结束标志。
**重点:发生IIC中断时,SCL被拉低,阻止继续使用IIC,清中断后,才可以继续使用。**这种机制给我们的IIC控制器提供了处理时间。
下面是2440手册中,读写的操作说明。
在Transmitter模式,当数据发送完毕后,IIC总线将等待IICDS寄存器接收一个新数据。在新数据写入到IICDS寄存器之前,SCL被拉低,写入新数据后再被释放。2440要进入中断,来确定当前数据是否发送完成。在2440处理完中断后,要向IICDS寄存器写入下一个数据。
- IICDS = val;
- 发送完成,产生中断,要拉低SCL;
- 中断程序中,判断状态,IICDS = val,IIC继续工作;
在Receive模式,当数据接受完毕,IIC总线接口要等待IICDS寄存器被读取。在新数据被读取之前,SCL被拉低,只有在数据被取出后,SCL才被释放。2440要进入中断来保证新数据是否读取完成。在CPU收到一个中断请求之后,需要从IICDS寄存器中读取数据。
- 发起传输,接受DATA;
- 产生中断,SCL被拉低;
- 中断程序中,判断;判断并处理之后,val = IICDS,IIC继续工作,继续接受新数据;