您好!欢迎来到信盈达产学合作协同育人平台|校企合作|嵌入式培训|解决方案|

登录 注册 微信快速登录

扫一扫看效果 关闭

好文章,欢迎分享给朋友

xydxx

01-16 16:49    浏览6082

1.1 IIC的基本概念
IIC是一种通讯协议(通讯机制),IIC是用芯片和芯片之间进行数据传输。串口也用于芯片和芯片之间的数据传输。简单来说,“串口”可以理解“汉语”,“IIC”可以理解“英语”,汉语和英语是都有语法,在交流时,需要按照语法来进行交流。在嵌入式中,每一种通讯机制都有其特定的“语法”,在进行数据传输时,必须按照其语法来进行传输。
通过一个例子来学习IIC”的语法:
IIC通讯对象有两个:一个是主机、一个是从机。IIC的从机是有“设备地址”的。
IIC的信号有四个,这四个信号都有站在主机的角度来理解的:
1) 起始信号
2) 数据信号:主机发出数据信号,主机读取数据信号。
3) 应答信号:主机发出应答信号,主机读取应答信号。
4) 结束信号。
IIC主机和IIC从机进行数据交互式,是有“时钟”来控制的,即每一个时钟脉冲,传输1位数据。“时钟”
是由“主机”发出。
生活中的情景
IIC
两个大活人,有心跳
时钟脉冲控制数据传输,一个时钟脉冲输出1位数据
老王说:早上好
主机:发出“起始信号”
老王说:老曾
主机:发出从机的“设备地址”
老曾:嘿
从机:给“应答信号”
在嵌入式当中,应该理解为:
主机:读取从机发出“应答信号”
老王说:吃早餐了吗?
主机:发出“数据信号”
老曾说:吃了
从机:给“应答信号”
在嵌入式当中,应该理解为:
主机:读取从机发出“应答信号”
老王说:吃了什么?
主机:发出“数据信号”
老曾说:吃了包子
从机:给“应答信号”
在嵌入式当中,应该理解为:
主机:读取从机发出“应答信号”
老曾说:你吃了吗
从机:发出“数据信号”
在嵌入式当中,应该理解为:
主机:读取从机发出“数据信号”
老王说:我没吃
主机:给“应答信号”
老王说:先聊到这
主机:发出“结束信号”
1.2 IIC设备的接线图
IIC通讯线有两根,分别是:
1) SCK/SCLserial clock ,串行时钟
2) SDAserial data,串行数据。
SCL主要是用于输出“时钟脉冲”,时钟脉冲是由主机来发出。
SDA用于传输数据,传输方向是双方向的。
SCLSDA都是STM32IO口,要注意的是,SDA所在的IO口既可以输出也可以输入
普及概念:
   IIC总线:IIC总线就是SCLSDA
IIC总线必须挂载上拉电阻,常用上拉电阻的阻值是4.7K10K。上拉电阻的作用:可以通过调节VCC的电压值以及调节上拉电阻的阻值来调节驱动电流。
1.3 IIC的基本时序
1) 起始信号:SCL输出高电平,在SCL管脚为高电平时,SDA由高电平向低电平跳变,则该跳变沿为“起始信号”。IIC通讯过程的第一个信号是IIC起始信号。
2) 结束信号:SCL输出高电平,在SCL管脚为高电平时,SDA由低电平向高电平跳变,则该跳变沿为“结束信号”。IIC通讯过程的最后一个信号是IIC结束信号。
3) IIC传输数据,每次传输都是8位,也就是一个字节,在传输时,先传输高位,依次从高位到低位传输,最后传输最低位。
4) 1位数据传输的过程:SDA在时钟低电平时准备数据(如果需要发送的数据位是1,则将SDA管脚输出高电平;如果需要发送的数据位是0,则将SDA管脚输出低电平),数据在时钟上升沿时发送出去,数据在时钟高电平时,数据需要保持稳定,也就是电平保持稳定。重复8次“位传输过程”即可完成一个字节的数据的发送。
5) 应答信号分为:应答信号和非应答信号。
6) IIC在传输数据时,每传输完8位数据,必须要传输1位应答位。在第9个时钟时,SDA为低电平则表示“应答”;在第9个时钟时,SDA为高电平则表示“非应答”。IIC从机若处于“故障状态”或者“忙碌状态”,会给主机“非应答”。
普及概念:
   IIC总线空闲:IIC总线就是SCLSDAIIC总线空闲是指SCL/SDA的电平都为高电平。
1) IIC通讯的第一个信号是:IIC起始信号
2) IIC起始信号之后,紧接着需要传递“设备地址”,设备地址 = 7位设备地址+最低位1位方向位。最低位为0表示“写地址”,即SDA的数据流向:主机→从机;最低位为1表示“读地址”,即SDA的数据流向:从机→主机。举例:假如一个IIC设备,其7位地址010 1101,其“写地址”是0101 1010,“读地址”0101 1011
3) 主机发出“设备地址”,从机需要应答。
4) 在传送了“设备地址”之后,就是数据传输。发送方每传输1个字节的数据,接收方需要传输一个应答位。
5) IIC设备的数据交互的过程以“结束信号”结束。
1.4 GPIO口配置开漏输出,输出高电平,可切换为输入
GPIO口配置开漏输出,可以输出高低电平,注意:输出高电平需要挂上拉电阻。
GPIO口配置开漏输出,输出高电平,也可切换为输入,直接读取IDR寄存器可获知管脚输入的电平是高电平还是低电平。
1.5 IIC的时钟频率
IIC的时钟频率常用的有两种频率:100KHZ400KHZIIC时钟频率要求不是很严格,允许时钟频率偏差。
如果IIC的时钟频率为100KHZ,一个时钟周期 = 1/100000 s=  1/100000 *10^6 = 10us 。高低电平各5us
如果IIC的时钟频率为400KHZ,一个时钟周期 = 1/400000 s =  1/400000 *10^6 = 2.5us。高低电平各1.25us
滴答延时函数无法实验小数延时,1.25us是无法实现的,只能是延时1us或者延时 2us
当高低电平各为1us,时钟频率是 = 1/T = 1/2us = 500KHZ
当高低电平各为2us,时钟频率是 = 1/T = 1/4us  = 250KHZ
1.6 IIC相关伪代码
在调试IIC的时序时,一定要用逻辑分析仪。什么是逻辑分析仪:逻辑分析仪内部有一个单片机,单片机内部又有定时器,定时器配置为输入捕获,就可以捕获脉冲方波,再通过上位机显示。
1.6.1 IIC管脚初始化
//        IIC_SCL连接在PB8,IIC_SDA连接在PB9。
void IIC_PinInit(void)
{
       //PB8配置为开漏输出
       //PB9配置为开漏输出
       //SCL、SDA需要输出高电平,使得总线空闲。
}
1.6.2 IIC起始信号
void IIC_Start(void)
{
       //延时5us
       SCL_H;  //SCL拉高电平
       SDA_H;  //SDA拉高电平
       //延时5us
       SDA_L;  //SDA拉低电平
       //延时5us
       SCL_L;  //SCL拉低电平
}
1.6.3 IIC时钟信号
void  IIC_Clock(void)
{
       u8 i = 0xFF;
       for(i=0;i<8;i++)
       {
               //延时5us
               //SCL拉高电平
               //延时5us
               //SCL拉低电平
       }
}
1.6.4 主机发送数据(带读取应答功能)
data: 待发送的数据
返回值:应答,0表示应答,1表示非应答。
u8  IIC_WriteByte(u8 data)
{
       u8 i = 0xFF;
       for(i=0;i<8;i++)
       {
               //准备位数据,先传输高位,依次从高位到低位传输,最后传输最低位。
               //延时5us
               //SCL拉高电平
               //延时5us
               //SCL拉低电平
       }
       //SDA输出高电平,使得SDA切换为输入
       //延时5us
       //SCL拉高电平
       //延时5us
       //读取SDA的输入电平,低电平表示应答,高电平表示非应答
       //SCL拉低电平
}
1.6.5 主机读取数据(带发送应答功能)
ack : 代表主机给从机的应答,0:表示应答,1表示非应答
返回值:读取到的8位数据
u8  IIC_ReadByte(u8 ack)
{
       u8 i = 0xFF;
       //SDA输出高电平,使得SDA切换为输入
       for(i=0;i<8;i++)
       {
               //延时5us
               //SCL拉高电平
               //延时5us
               //读数据位,最先读到的是最高位,最后读到是最低位
               //SCL拉低电平
       }
       //延时5us
       //准备应答位,ack为1则SDA输出高电平,ack为0,则输出SDA低电平
       //SCL拉高电平
       //延时5us
       //SCL拉低电平
}
1.6.6 结束信号
void IIC_Stop(void)
{
       SDA_L;   //SDA输出低电平
       //延时5us
       SCL_H;   //SCL输出高电平
       //延时5us
       SDA_H;   //SDA输出高电平
       //延时5us
}


评论0 0
评论
内容加载中……,请稍候!

手指长按二维码,快速关注

给TA留言
留言
返回
评论