TI-AM3359 I2C适配器实例分析
I2C Spec简述
特性:
- 兼容飞利浦I2C 2.1版本规格
- 支持标准模式(100K bits/s)和快速模式(400K bits/s)
- 多路接收、发送模式
- 支持7bit、10bit设备地址模式
- 32字节FIFO缓冲区
- 可编程时钟发生器
- 双DMA通道,一条中断线
- 三个I2C模块实例I2C0\I2C1\I2C2
- 时钟信号能够达到最高48MHz,来自PRCM
不支持
- SCCB协议
- 高速模式(3.4MBPS)
管脚
管脚 | 类型 | 描述 |
---|---|---|
I2Cx_SCL | I/OD | I2C 串行时钟 |
I2Cx_SDA | I/OD | I2C 串行数据 |
I2C重置
- 通过系统重置PIRSTNA=0,所有寄存器都会被重置到上电状态
- 软重置,置位I2C_SYSC寄存器的SRST位。
- I2C_CON寄存器的I2C_EN位可以让I2C模块重置。当PIRSTNA=1,I2C_EN=0会让I2C模块功能部分重置,所有寄存器数据会被暂存(不会恢复上电状态)
数据有效性
- SDA在SCL高电平期间必须保持稳定,而只有在SCL低电平期间数据线(SDA)才可以进行高低电平切换
开始位&停止位
当I2C模块被设置为主控制时会产生START和STOP:
- START开始位是SCL高电平期间SDA HIGH->LOW
SCL _____ _______
\____/
SDA __
\____________
- STOP停止位是SCL高电平期间SDA LOW->HIGH
SCL _____ _______
\____/
SDA
___________
__/
- 在START信号后总线就会被认为是busy忙状态,而在STOP后其会被视为空闲状态
串行数据格式
8位数据格式,每个放在SDA线上的都是1个字节即8位长,总共有多少个字节要发送/接收是需要写在DCOUNT寄存器中的。数据是高位先传输,如果I2C模块处于接收模式中,那么一个应答位后跟着一个字节的数据。I2C模块支持两种数据格式:
- 7bit/10bit地址格式
- 带有多个开始位的7bit/10bit地址格式
FIFO控制
I2C模块有两个内部的32字节FIFO,FIFO的深度可以通过控制I2C_IRQSTATUS_RAW.FIFODEPTH寄存器修改。
如何编程I2C
1. 使能模块前先设置
- 使分频器产生约12MHz的I2C模块时钟(设置I2C_PSC=x,x的值需要根据系统时钟频率进行计算)
- 使I2C时钟产生100Kpbs(Standard Mode)或400Kbps(Fast Mode)(SCLL = x 及 SCLH = x,这些值也是需要根据系统时钟频率进行计算)
- 如果是FS模式,则配置自己的地址(I2C_OA = x)
- 重置I2C模块(I2C_CON:I2C_EN=1)
2. 初始化程序
- 设置I2C工作模式寄存器(I2C_CON)
- 若想用传输数据中断则使能中断掩码(I2C_IRQENABLE_SET)
- 如果在FS模式中,使用DMA传输数据的话,使能DMA(I2C_BUF及I2C_DMA/RX/TX/ENABLE_SET)且配置DMA控制器
3. 设置从地址和数据计数器
在主动模式中,设置从地址(I2C_SA = x),设置传输需要的字节数(I2C_CNT = x)
4. 初始化一次传输
在FS模式中。查询一下I2C状态寄存器(I2C_