16.3.5 自身地址寄存器1:I2Cx_OAR1
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ADDMODE | - | ADD[9:8] | ADD[7:1] | ADD0 |
Bit 15:寻址模式(从模式)
0:7位从地址(不响应10位地址)
1:10位从地址(不响应7位地址)
Bit 9~Bit 8:接口地址
7位地址模式时不用关心
10位地址模式时为地址的9~8位
Bit 7Bit 1:接口地址,地址的71位
Bit 0:接口地址
7位地址模式时不用关心
10位地址模式时为地址第0位
16.3.6 自身地址寄存器2:I2Cx_OAR2
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | ADD2[7:1] | ENDUAL |
Bit 7Bit 1:接口地址,在双地址模式下地址的71位
Bit 0:双地址模式使能位
0:在7位地址模式下,只有OAR1被识别
1:在7位地址模式下,OAR1和OAR2都被识别
16.3.7 状态寄存器1:I2Cx_SR1
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SMBALERT | TIMEOUT | - | PECERR | OVR | AF | ARL0 | BERR | TXE | RXNE | - | STOPF | ADD10 | BTF | ADDR | SB |
Bit 15: SMBus提醒
在SMBus主机模式下:
0:无SMBus提醒
1:在引脚上产生SMBAlert提醒事件
在SMBus从机模式下:
0:没有SMBAlert响应地址头序列
1:收到SMBAlert响应地址头序列至SMBAlert变低
Bit 14:超时或Tlow错误
0:无超时错误
1:SCL低电平达到25ms;或主机低电平累积时间超过10ms;或从设备低电平累积时间超过25ms
Bit 12:在接收时发生PEC错误
0:无PEC错误:接收到PEC后接收器返回ACK(如果ACK=1)
1:有PEC错误:接收到PEC后接收器返回NACK(不管ACK是什么值)
Bit 11:过载/欠载
0:无过载/欠载
1:出现过载/欠载
Bit 10:应答失败
0:没有应答失败
1:应答失败
Bit 9:仲裁丢失(主模式)
0:没有检测到仲裁丢失
1:检测到仲裁丢失
Bit 8:总线出错
0:无起始或停止条件出错
1:起始或停止条件出错
Bit 7:数据寄存器为空(发送时)
0:数据寄存器非空
1:数据寄存器空
Bit 6:数据寄存器非空(接收时)
0:数据寄存器为空
1:数据寄存器非空
Bit 4:停止条件检测位(从模式)
0:没有检测到停止条件
1:检测到停止条件
Bit 3:10位头序列已发送(主模式)
0:没有ADD10事件发生
1:主设备已经将第一个地址字节发送出去
Bit 2:字节发送结束
0:字节发送未完成
1:字节发送结束
Bit 1:地址已被发送(主模式)/地址匹配(从模式)
地址匹配(从模式)
0:地址不匹配或没有收到地址
1:收到的地址匹配Bit 1:
地址发送标志(主模式)
0:地址发送没有结束
1:地址发送结束
10位地址模式时,当收到地址的第二个字节的ACK后该位被置1
7位地址模式时,当收到地址的ACK后该位被置1
Bit 0:起始位(主模式)
0:未发送起始条件
1:起始条件已发送
16.3.8 状态寄存器2:I2Cx_SR2
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PEC[7:0] | DUALF | SMBHOST | SMBDEFAULT | GENCALL | - | TRA | BUSY | MSL |
Bit 15~Bit 8:数据包出错检测,当ENPEC=1时,PEC[7:0]存放内部的PEC的值
Bit 7:双标志(从模式)
0:接收到的地址与OAR1内的内容相匹配
1:接收到的地址与OAR2内的内容相匹配
Bit 6:SMBus主机头系列(从模式)
0:未收到SMBus主机的地址
1:当SMBTYPE=1且ENARP=1时,收到SMBus主机地址
Bit 5:SMBus设备默认地址(从模式)
0:未收到SMBus设备的默认地址
1:当ENARP=1时,收到SMBus设备的默认地址
Bit 4:广播呼叫地址(从模式)
0:未收到广播呼叫地址
1:当ENGC=1时,收到广播呼叫的地址
Bit 2:发送/接收
0:接收到数据
1:数据已发送
Bit 1:总线忙,在检测到SDA或SCl为低电平时,硬件将该位1
0:在总线上无数据通讯
1:在总线上正在进行数据通讯
Bit 0:主从模式
0:从模式
1:主模式
16.3.9 数据寄存器:I2Cx_DR
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | DR[7:0] |
Bit 7~Bit 0:8位数据寄存器,用于存放接收到的数据或放置用于发送到总线的数据
发送器模式:当写一个字节至DR寄存器时,自动启动数据传输。一旦传输开始,如果能及时把下一个需传输的数据写入DR寄存器,I2C模块将保持连续的数据流
接收器模式:接收到的字节被拷贝到DR寄存器。在接收到下一个字节之前读出数据寄存器,即可实现连续的数据传送
注1:在从模式下,地址不会被拷贝进数据寄存器DR
注2:硬件不管理写冲突(如果TxE=0,仍能写入数据寄存器)
注3:如果在处理ACK脉冲时发生ARLO事件,接收到的字节不会被拷贝到数据寄存器里,因此不能读到它
16.4 实验例程
16.4.1 软件模拟IIC控制
(1)创建at24cxx.h文件,并输入以下代码。
/*********************************************************************************************************
EEPROM 驱 动 文 件
*********************************************************************************************************/
#ifndef _AT24Cxx_H_
#define _AT24Cxx_H_
#include "sys.h"
/*********************************************************************************************************
硬 件 端 口 定 义
*********************************************************************************************************/
#define IIC_SCL PBout( 6 )
#define IIC_SDA PBout( 7 )
#define IIC_SDA_READ PBin( 7 )
/*********************************************************************************************************
函 数 列 表
*********************************************************************************************************/
void AT24Cxx_Init( void ) ; //AT24C初始化
void AT24Cxx_Write_Data( u16 Address, u8 Data ) ; //写入1个数据
void AT24Cxx_Write_nData( u16 Address, u8 *Buffer, u16 Len ) ; //写入n个数据
void AT24Cxx_Read_Data( u16 Address, u8 *Data ) ; //读取1个数据
void AT24Cxx_Read_nData( u16 Address, u8 *Buffer, u16 Len ) ; //读取n个数据
#endif