IIC串行总线一般有两根信号线,一根双向数据线SDA,一根时钟线SCL
IIC总线协议包括:起始信号、停止信号、数据位DATA、应答位ACK
IIC总线四种操作模式:主设备发送模式、主设备接收模式、从设备发送模式、从设备接收模式。
寄存器
1、IIC总线控制寄存器IICCON
rIICCON = 0xaf; //1010 [7]应答使能,[6]设置IICCLK为MCLK/16,[5]使能中断,
[4]:读出0,没发生中断;写入0时清除未决条件并恢复中断响应;
读出1,发送中断;不可进行写入操作
2、IIC总线状态寄存器IICSTAT
rIICSTAT = 0xf0;//1111 [7:6]主发送模式 [5]写入1:产生起始条件 [4]使能发送接收
**数据在起始条件后自动被送出
rIICSTAT = 0xb0;//1011 [7:6]主接收模式 [5]读出1:状态忙 [4]使能发送接收
3、IIC总线地址寄存器IICADD
rIICADD = 0x10;//从设备地址(初始化IIC接口)
4、IIC总线发送接收移位寄存器IICDS
**IICSTAT中,输出使能为1,则写使能,总为可读;
读写流程
1、写:
1) 配置IIC主设备发送模式
a、写从设备地址:将从设备地址写入接收发送数据移位器IICDS中:rIICDS = unSlaveAddr;
b、配置主发送模式:将0xf0写入控制状态寄存器IICSTAT中:rIICDSTAT = 0xf0;
2) 等待应答信号ACK
while(f_nGetACK == 0); f_nGetACK = 0;
3)写入访问地址:rIICDS = unAddr;
4)恢复IIC,应答、发送/接收使能:将0xaf写入rIICCON中:rIICCON = 0xaf;
5)等待应答信号ACK
while(f_nGetACK == 0); f_nGetACK = 0;
7) 写数据
将待发送数据写入寄存器IICDS中RIICDS = UNADDR
清中断标志RIICCON = 0xaf;
等待应答信号ACK …
8) 继续写数据重复7)
9) 停止写数据
a、将0XD0写入寄存器IICSTAT中RIICSTAT = 0xd0;
b、清除中断标志将0XAF写入IICCON中RIICCON = 0xaf;
10) 完成发送
2、读
1) 配置写入数据地址模式:
a、写入设备从地址:rIICDS = unSlaveAddr;
b、配置发送模式:rIICSTAT = 0xf0;
c、等待:while(f_nGetACK == 0); f_nGetACK = 0;
2)写入数据地址: rIICDS = unAddr;
3)恢复IIC,应答、发送/接受使能:rIICCON = 0xaf;
4)等待应答ACK:____
5)配置IIC数据接收模式:
a、写从设备地址:将设备地址写入接收发送数据移位寄存器IICDS中:rIICCDS = unSlaveAddr;
b、配置主接收模式:将0Xb0写入控制状态寄存器IICSTAT中:rIICSTAT = 0xb0;
6)等待应答ACK:____
7) 读数据
a、使能rIICCON = 0xaf
b、等待ACK____
c、读取cRecvByte = rIICDS;
8) 继续读数据重复7)
9) 读取最后一个数据
a、清除中断标志 rIICCON = 0x2f;
b、读取最后一个数据 cRecvByte = rIICDS;
10) 停止写数据
a、向寄存器IICSTAT写入0X90 RIICSTAT = 0X90;
b、清除中断标志 RIICCON = 0xaf;
11) 完成接收
***Rx模式下,在读取最后一个字节数据后不允许产生ACK信号