目录
STM32-IIC
1. 基本概念
半双工同步通信的串行通信接口
2. 引脚说明
SDA
SCK/SCL
IIC 总线只需要两根引脚就可以实现通信,一根是数据线(SDA Serial Data),
另一根是时钟线(SCL Serial Clock)
在空闲状态下所有器件的时钟线(SCL)和数据线(SDA)都被总线的上拉电阻拉高,这样就可以把SDA引脚和SCL引脚设置为开漏模式即可,好处是防止短路。
思考:如果IIC总线上挂载了多个外围器件,如何与某一个器件进行单独通信?
器件地址
3. 传输方向
1. 在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。
2. 如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送。
3. 如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。
4. 通信过程
1. 空闲状态
点击查看代码
//3.空闲状态下SDA和SCL都为高电平
IIC_SCL_WRITE(1);
IIC_SDA_WRITE(1);
指的是不传输任何数据的时候就被称为空闲状态,IIC总线规定SDA数据线和SCL时钟线在不传输数据的时候都应该设置高电平,表示空闲。
2. 开始信号
点击查看代码
//IIC总线开始信号
void IIC_StartSignal(void)
{
//1.设置SDA引脚为输出模式
IIC_SDAOutputMode();
//2.确保SDA和SCL为高电平
IIC_SCL_WRITE(1);
IIC_SDA_WRITE(1);
Delay_us(5); //提高程序可靠性
//3.把SDA引脚拉低
IIC_SDA_WRITE(0);
Delay_us(5); // IIC总线的通信速率为100KHZ 1000000us = 100000HZ 10us = 1HZ
//4.把SCL引脚拉低,表示准备通信
IIC_SCL_WRITE(0);
}
开始信号由主机发出,表示打算和所有的从器件进行通信,IIC总线规定在SCL时钟线保持高电平期间,把SDA数据线拉低,表示开始信号。
3. 数据发送
在主机发送开始信号后,就可以发送数据或者地址,IIC总线规定数据的收发都是MSB(高位先出),由于只有一个数据线,所以IIC采用串行方式把数据的每个bit位发出去。
点击查看代码
//主机发送数据(从机读取数据)
void IIC_SendBytes(uint8_t Data)
{
uint8_t i= 0;
//1.设置SDA引脚为输出模式
IIC_SDAOutputMode();
//2.确保SDA和SCL为低电平
IIC_SCL_WRITE(0);
IIC_SDA_WRITE(0);
//3.循环发送bit
for(i=0;i<8;i++)
{
//MSB 高位先出 主机准备数据
if ( Data & 1<<(7-i) )
{
IIC_SDA_WRITE(1);
}
else
IIC_SDA_WRITE(0);
Delay_us(5);
//SCL为高电平 主机发送数据
IIC_SCL_WRITE(1);
Delay_us(5);
//SCL为低电平 主机准备数据
IIC_SCL_WRITE(0);
Delay_us(5);
}
由于SCL提供的脉冲周期是有规律的,所以IIC总线规定只能在SCL脉冲周期的高电平期间进行数据的读取或者写入,在SCL脉冲周期的低电平期间可以进行数据的修改。
4. 应答信号
IIC总线增加了应答机制,在主机发送一个字节数据之后,从机在第9个脉冲周期进行应答,如果SDA为0,则表示应答,如果SDA=1,则表示无应答,如果从机没有应答,则主机应该发送停止信号,表示停止通信。
5. 数据接收
在主机发送开始信号后,就可以发送数据或者地址,IIC总线规定数据的收发都是MSB(高位先出),由于只有一个数据线,所以IIC采用串行方式把数据的每个bit位发出去。
由于SCL提供的脉冲周期是有规律的,所以IIC总线规定只能在SCL脉冲周期的高电平期间进行数据的读取或者写入,在SCL脉冲周期的低电平期间可以进行数据的修改。
6. 停止信号
停止信号由主机发出,表示不打算和从器件继续通信,IIC总线规定在SCL时钟线保持高电平期间,把SDA数据线拉高,表示停止信号。