现在的位置: 首页 > 综合 > 正文

IIC总线读写小记

2018年03月20日 ⁄ 综合 ⁄ 共 1445字 ⁄ 字号 评论关闭

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信号



抱歉!评论已关闭.