一、概述

1.1多主机总线

1.2 发送器与接收器

1.3 IIC通信过程

1.4 主机发送第一个字节解析

二 通信接口与速度

三 数据帧格式

3.1 起始信号

3.2 数据位

3.3 应答位

3.4 停止信号

四 直接上代码了
#define IIC_SDA_OUT PBout(9) //输出SDA
#define IIC_SDA_IN PBin(9) //输入SDA
/**********************************************************************
*函数名:IIC_Init
*功 能:初始化IIC
*参 数:无
*返 回:无
*备 注:PB8 PB9
**********************************************************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体变量
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能PB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;//引脚选择
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //通用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //开漏
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //速度配置
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //浮空(无上下拉)
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
//空闲状态
IIC_SCL=1;
IIC_SDA_OUT=1;
}
/**********************************************************************
*函数名:IIC_Start
*功 能:起始信号
*参 数:无
*返 回:无
*备 注:
**********************************************************************/
void IIC_Start(void)
{
IIC_SDA_OUT=1;
IIC_SCL=1; //时钟线高电平
delay_us(2);
IIC_SDA_OUT=0;
delay_us(2);
IIC_SCL=0; //钳住I2C总线,准备发送或接收数据
}
/**********************************************************************
*函数名:IIC_Stop
*功 能:停止信号
*参 数:无
*返 回:无
*备 注:
**********************************************************************/
void IIC_Stop(void)
{
IIC_SCL=1;
IIC_SDA_OUT=0;
delay_us(2);
IIC_SDA_OUT=1;//发送I2C总线结束信号
delay_us(2);
}
/**********************************************************************
*函数名:IIC_Send_Ack
*功 能:发送应答
*参 数:send_ack
*返 回:无
*备 注:
**********************************************************************/
void IIC_Send_Ack(u8 send_ack)
{
IIC_SCL = 0;//低电平:主机准备数据
if(send_ack)
{
IIC_SDA_OUT = 1;
}
else
{
IIC_SDA_OUT = 0;
}
delay_us(2);
IIC_SCL = 1;//高电平:从机采集数据
delay_us(2);
IIC_SCL = 0;//保证完整周期
}
/**********************************************************************
*函数名:IIC_Recv_Ack
*功 能:接收应答
*参 数:无
*返 回:u8 0:应答 1:非应答
*备 注:
**********************************************************************/
u8 IIC_Recv_Ack(void)
{
u8 recv_ack = 0;
IIC_SDA_OUT = 1;//释放总线控制权
IIC_SCL = 0;//让从机准备数据
delay_us(2);
IIC_SCL = 1;//主机开始读取数据
if(IIC_SDA_IN)
{
recv_ack = 1;
}
else
{
recv_ack = 0;
}
delay_us(2);
IIC_SCL = 0;//完整周期
return recv_ack;
}
/**********************************************************************
*函数名:IIC_Send_Byte
*功 能:发送一个字节数据
*参 数:字节数据
*返 回:u8 0:应答 1:非应答
*备 注:
**********************************************************************/
u8 IIC_Send_Byte(u8 send_byte)
{
u8 i,ack;
for(i = 0;i < 8;i++)
{
IIC_SCL = 0;//主机准备数据
if(send_byte & (0x80 >> i))
{
IIC_SDA_OUT = 1;
}
else
{
IIC_SDA_OUT = 0;
}
delay_us(2);
IIC_SCL = 1;//从机读取数据
delay_us(2);
}
ack = IIC_Recv_Ack();//从机返回响应数据
return ack;
}
/**********************************************************************
*函数名:IIC_Recv_Byte
*功 能:发送一个字节数据
*参 数:u8 0:继续读取数据 1:不再读取数据
*返 回:u8 接收到的数据
*备 注:
**********************************************************************/
u8 IIC_Recv_Byte(u8 send_ack)
{
u8 i,data = 0;
IIC_SDA_OUT = 1;//主机释放总线控制权
for(i = 0;i < 8;i++)
{
IIC_SCL = 0;//从机准备数据
delay_us(2);
IIC_SCL = 1;//主机采集数据
data <<= 1;
data |= IIC_SDA_IN;
delay_us(2);
}
IIC_Send_Ack(send_ack);//接收完一个字节数据,主机给从机发送响应信号
return data;
}
在这里插入代码片
本文详细介绍了IIC通信协议的原理,包括多主机总线、发送器与接收器的工作方式,以及IIC通信的具体过程。通过解析主机发送第一个字节的过程,深入理解IIC通信流程。此外,还提供了IIC起始和停止信号的生成函数,以及发送和接收应答的函数。最后,展示了C语言实现的IIC初始化、数据发送和接收的函数,帮助读者掌握实际应用中的IIC通信操作。
801

被折叠的 条评论
为什么被折叠?



