ARM(IMX6ULL)——通信(IIC/I2C)
相关概念
线与特性
定义:在两个芯片连接的对应引脚上,任何一端输出高电平,则实际电平的高低,由另一端决定
【若任一输出为低电平(或无效状态),总输出则被拉为低电平】
推挽 / 开漏
推挽:两个互补的有源器件(如晶体管、MOS 管)交替工作,实现对输出信号的 “推”(源电流输出)和 “挽”(灌电流输出),从而直接驱动负载并输出高低电平
【电流流向的两种动作:推和挽】
【对应示例图:表格中的(1)、(2)两种情况】
(1)MOS1导通,MOS2截止:电流从 3.3V 电源通过导通的 MOS1流向输出端(pad),将输出端的电平拉高到接近 3.3V,此时 LED 会点亮。这就相当于MOS1把输出信号“推”向高电平==》推
(2)MOS1截止,MOS2导通:输出端(pad)通过导通的 MOS2连接到地,电平被拉低到接近 0V,LED 熄灭。这就相当于 MOS2把输出信号 “拉” 向低电平==》挽
开漏:指器件的输出端仅连接到一个有源器件(如 N 沟道 MOS 管)的漏极,漏极处于 “开路” 状态,源极接地,无直接接电源的有源器件。
【对应示例图:表格中的(2)、(3)两种情况】
(2)MOS1截止,MOS2导通:输出端(pad)通过导通的 mos2 连接到地,输出低电平,LED 熄灭。
(3)MOS1截止,MOS2截止:输出端(pad)处于悬空状态(高阻态) ,无法主动输出高电平。此时,需要依靠外接的上拉电阻将输出端的电平拉高到 3.3V,LED 点亮。
I2C通讯最基本时序
- I2C通讯是多对多通信,至少需要两根线(数据线SDA和时钟线SCL),使用的是主从应答方式(即主机发送数据,从机接收数据后发出应答标志ACK/NACK)
- I2C是同步半双工串行通信方式
start信号
:在总线空闲状态下,想要发起一次通讯的设备A,在时钟线(SCL)为高电平时,数据线(SDA)产生一个下降沿,称之为起始信号。总线规定
:
(1)数据在发送时遵循MSB优先【UART通信遵循LSB优先】;
(2)在时钟线(SCL)为低电平时,只允许设备(发送方)改变数据线(SDA),接收方不得采样;
(3)在时钟线(SCL)为高电平时,只允许设备(接收方)采样数据线(SDA),发送方需要保持SDA的稳定。应答位
:数据总线的控制权由发送方转移给(发送方在clock9切换为高电平)了接收方,接收方就可以改变数据总线。
(1)ACK:应答(低电平)
(2)NACK:非应答(保持高电平)stop信号
:在总线空闲状态下,想要发起一次通讯的设备A,在时钟线(SCL)为高电平时,数据线(SDA)产生一个上升沿,称之为结束信号。
地址帧结构: 从机地址占用7个bit位,第八位为数据流向位(0用于规定主机和从机谁发送谁接收)
I2C主机向从机发送数据
AT24C08(EEPROM 存储器)作为主机发送数据使用的I2C相关寄存器及寄存器功能
//I2CR
#define I2CR_IEN (1 << 7) //I2C使能位(1-使能;0-失能)
#define I2CR_MSTA (1 << 5) //主从模式选择位(0->1,主机模式,产生start;1->0,从机模式,产生stop)
#define I2CR_MTX (1 << 4) //发送/接收模式选择位(1-发送)
#define I2CR_TXAK (1 << 3) //应答类型(0-应答ACK,1-应答NACK)
#define I2CR_RSTA (1 << 2) //重发start信号(0->1:repeat start)
//I2SR
#define I2SR_ICF (1 << 7) //数据传输位(0-正在传输;1-传输完成)
#define I2SR_IBB (1 << 5) //总线忙碌状态(0-空闲;1-忙碌)
#define I2SR_IAL (1 << 4) //仲裁丢失标志(0-正常;1-丢失)
#define I2SR_IIF (1 << 1) //中断标志(0-未产生;1-产生)写0清零
#define I2SR_RXAK (1 << 0) //接收到的应答类型(0-ACK;1-NACK)
//复用功能引脚配置时,SION位要置1
//SION位置1:开启SION位内部线路可以直接检测物理引脚实际电平
问题解答:
问题:I2C_IIEN标志位置0(中断失能),为什么还能使用中断标志位I2C_IIF作为发送(从机地址、寄存器地址、数据等)已经结束的标志位?
答:即使 I2C 的中断功能整体被关闭(IIEN为 0),通过轮询IIF标志位的方式,使得IIF标志位依然能够反映 I2C 模块内部的操作状态,它本质上是I2C模块内部的一种状态指示,而非单纯依赖于中断功能。