IIC是什么?
IIC的中文名是集成电路总线,它是一种串行通信总线。
IIC协议用来干什么?
IIC是一种通信协议,是为了能让主板,或者嵌入式系统等与其他外设模块进行通信而进行开发的。
I2C,两线式串行总线,它是由数据线SDA和时钟SCL构成的串行总线,可以发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。
IIC是半双工通信方式。
I2C协议:
- 空闲状态
- 开始信号
- 停止信号
- 应答信号
- 数据的有效性
- 数据传输
1)空闲状态
I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。
2)起始信号与停止信号
硬件IIC与软件IIC的区别:
硬件IIC主要是通过STM32内部的IIC控制器实现的,它利用CPU的时钟信号来控制数据传输和时序。
软件模拟IIC则是通过CPU的GPIO(通用输入输出)引脚来模拟IIC的时序和数据传输。
从代码方面分析IIC的底层驱动
写的话是0,读的话是1
代码示例:
以HT6017芯片为例:
1. 首先对芯片进行端口初始化:
/*******************************************************************************
功能描述: IIC总线初始化
*******************************************************************************/
void Init_I2CPort(void)
{
if (((HT_GPIOC->IOCFG & 0x6000) != 0x0000)//端口功能配置寄存器1
|| ((HT_GPIOC->AFCFG & 0x6000) != 0x0000))//端口功能配置寄存器2
{
EnWr_WPREG();//关闭写保护
HT_GPIOC->IOCFG &= ~0x6000;
HT_GPIOC->AFCFG &= ~0x6000;
DisWr_WPREG();//开启写保护
}
if ((HT_GPIOC->PTOD & 0x6000) != 0x2000)//端口开漏配置寄存器
{
HT_GPIOC->PTOD |= 0x2000;
HT_GPIOC->PTOD &=~0x4000;
}
if ((HT_GPIOC->PTUP & 0x6000) != 0x0000)//端口上拉配置寄存器
{
HT_GPIOC->PTUP &=~0x6000;
}
if ((HT_GPIOC->PTDIR & 0x6000) != 0x0000)//端口方向配置寄存器
{
HT_GPIOC->PTDIR &=~0x6000;
}
}
2. 功能描述: IIC总线起始条件
/*******************************************************************************
功能描述: IIC总线起始条件
*******************************************************************************/
static void I2C_Start(void)
{
HIGH_SCL();//SCL为高电平
HIGH_SDA();//SDA为高电平
I2C_Delay();
I2C_Delay();
LOW_SDA();
I2C_Delay();
I2C_Delay();
LOW_SCL();
I2C_Delay();
}
3. 功能描述:IIC总线结束条件
/*******************************************************************************
功能描述: IIC总线结束条件
*******************************************************************************/
static void I2C_Stop(void)
{
LOW_SDA();//SDA为低电平
I2C_Delay();
I2C_Delay();
HIGH_SCL();//SCL为高电平
I2C_Delay();
I2C_Delay();
HIGH_SDA();//SDA为高电平
I2C_Delay();
I2C_Delay();
}
4. 功能描述:IIC总线发送1字节
/*******************************************************************************
功能描述: IIC总线发送1字节
*******************************************************************************/
static Bool I2C_TxByte(uint8_t byte)
{//布尔类型,返回值为TRUE或FALSE
uint8_t i;
//逐位发送数据
for(i=0; i<8; i++)
{
LOW_SCL();//SCL为低电平时,数据线上的高低电平才允许变化
if(byte &0x80)//检查当前最高位是否为1
{
HIGH_SDA();
}
else
{
LOW_SDA();
}
I2C_Delay();
I2C_Delay();
HIGH_SCL();//拉高SCL,要求数据稳定,此时SDA上的数据被读取
I2C_Delay();
I2C_Delay();
byte <<=1;//左移一位,处理下一比特
}
//从设备应答数据
LOW_SCL();//SCL设置为低电平,等待从设备应答
for(i=0; i<32;i++)//循环32次
{
if(!PIN_SDA)//检查SDA线是否为低电平
{
HIGH_SCL();
I2C_Delay();
I2C_Delay();
LOW_SCL();
return TRUE;//收到应答,返回TRUE
}
}
//如果在规定时间没有收到应答
HIGH_SCL();
I2C_Delay();
I2C_Delay();
LOW_SCL();
I2C_Stop();//发送停止条件
return FALSE;//未收到应答,返回FALSE
}
5. 功能描述:IIC总线接收1字节
/*******************************************************************************
功能描述: IIC总线接收1字节
*******************************************************************************/
static uint8_t I2C_RxByte(Bool enAck)
{
uint8_t byte = 0x00;//初始化接收到的字节为0
uint8_t i;
for (i=0; i<8; i++)
{
byte <<= 1;
HIGH_SCL();//SCL拉高,允许设备在SDA上放置数据
if (PIN_SDA)//检查SDA的状态
{
byte |= 0x01;//如果是高,按位或,设置成1
}
else
{
I2C_Delay();//如果为低,延时
}
LOW_SCL();
I2C_Delay();
I2C_Delay();
}
//发送应答
if (FALSE != enAck)//如果需要发送应答
{
LOW_SDA();//拉低SDA,发送数据
}
HIGH_SCL();
I2C_Delay();
I2C_Delay();
LOW_SCL();
return byte;//返回接收到的byte位
}
标签:通信协议,总线,HT,Delay,GPIOC,IIC,I2C
From: https://blog.csdn.net/m0_64982857/article/details/143595965