详解STM32 IIC
知晓编程 2022-09-28

1、IIC定义

IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司(后被NXP收购)在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。多主多从的通讯协议。

下文将结合NXP官方的IIC手册讲解IIC协议。下载链接见文末。

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。速率最高400Kbit/s。

在1998年的修订中增加了高速模式,速率高达3.4Mbit/s。(这里不讲,只说快速模式)。


2、IIC协议规范 2.1 SDA和SCL信号

连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能,当总线空

闲时这两条线路都是高电平。SDA 和SCL 都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压。一般情况下我们都采用上拉电阻的方式

2.2 数据有效性

在SCL高电平的时候采样,也就是有效。低电平的时候切换数据

2.3 开始和结束信号

起始条件:SCL线是高电平时,SDA线从高电平向低电平切换。

停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。

动画展示启动信号

代码实现


















void I2C_Start(void){ //IO输出 SDA_OUT();  SCL_OUT();  I2C_DELAY(); //IO置高 SDA_SET();  SCL_SET();  //延时 I2C_DELAY();  //为低 SDA_CLR(); I2C_DELAY(); I2C_DELAY(); SCL_CLR();}

结束信号时类似的方式(不是动图)

代码实现




















void I2C_Stop(void){ //IO输出 SDA_OUT();  SCL_OUT(); //IO置0 SDA_CLR();  SCL_CLR();  I2C_DELAY(); SCL_SET(); //延时 I2C_DELAY();  I2C_DELAY(); I2C_DELAY(); //SDA置1 SDA_SET(); I2C_DELAY(); I2C_DELAY();}
2.4 字节格式

SDA数据线上的每个字节必须是8位,每次传输的字节数量没有限制。每个字节后必须跟一个响应位(ACK)。首先传输的数据是最高位(MSB),SDA上的数据必须在SCL高电平周期时保持稳定,数据的高低电平翻转变化发生在SCL低电平时期。

每一个字节后面跟着一个ACK,有ACK就可以继续写或读。NACK,就停止

ACK:主机释放总线,传输完字节最后1位后的SCL的高电处,从机拉低电平。

NACK:主机释放总线,传输完字节最后1位后的SCL的高电处,从机无响应,总线为高电平。

动画描述写入的过程

代码实现


















































































uint8_t I2C_Send_byte(uint8_t data){ uint8_t k; //发送8bit数据 for(k=0;k<8;k++){  I2C_DELAY(); if(data&0x80){ SDA_SET(); } else{ SDA_CLR(); } data=data<<1; I2C_DELAY(); SCL_SET(); I2C_DELAY(); I2C_DELAY(); SCL_CLR(); } //延时读取ACK响应 I2C_DELAY(); SDA_SET(); //置为输入线 SDA_IN(); I2C_DELAY(); SCL_SET();  I2C_DELAY(); //这里出现了问题,延时变的无限大 //读数据 k=SDA_READ(); if(k){ ////NACK响应 return 0; } I2C_DELAY(); SCL_CLR(); I2C_DELAY(); SDA_OUT(); if(k){ ////NACK响应 return 0; } return 1;} uint8_t I2C_Receive_byte(uint8_t flg){ uint8_t k,data; //接收8bit数据 //置为输入线  SDA_IN(); data=0; for(k=0;k<8;k++){ I2C_DELAY(); SCL_SET(); I2C_DELAY(); //读数据 data=data |SDA_READ(); data=data<<1; I2C_DELAY(); SCL_CLR(); I2C_DELAY();  } data=data>>1; //往回移动1次 //返回ACK响应 //置为输出线 SDA_OUT(); if(flg){ SDA_SET(); //输出1-NACK }else{ SDA_CLR();//输出0-ACK } I2C_DELAY(); SCL_SET(); I2C_DELAY(); I2C_DELAY(); SCL_CLR(); I2C_DELAY(); SDA_OUT(); //返回读取的数据 return (uint8_t)data;}
2.5 从机地址和读写位

开始信号—>地址—>读写位—>ACK—>数据—>ACK.............—>停止位

这里只说7位地址,前7位为地址,最后一位为读写位,1表示读操作,0表示写操作

主机发给从机数据,也就是写,没有数据转向时

主机立即读从机数据,从第一个字节

(Combined)综合数据格式


3、计算IIC的频率


通信频率由主机掌控,也就是代码中的延时函数决定的

从上面,我们得知最高速为400Kbit/s。我们设计300Kbit/s。

速率300Kbit/s,对应周期1/300ms=10/3us3us,4分频就是3/4us。

我们使用的延时是,1/120MHZ*3*30 =3/4us

也就是频率是300Kbit/s

和SPI类似,时钟下降沿时,数据转换,时钟上升沿时,采样数据。也就是时钟高电平数据有效。

4、PCF8536


4.1 Acknowledge

这个地方能看到关于2.4节关于ACK和NACk的说明

4.2 Addressing

这里直接给出读地址和写地址,也就是最后一位的区别

4.3 读写时序

其实就是按照IIC协议的

读指定器件的指定寄存器

主机设置完寄存器地址之后,再去读写

注意:读取多个字节,最后一个字节的回包应该是NACK

主机立即从机第一个字节读取

注意:读取多个字节,最后一个字节的回包应该是NACK


本文源自微信公众号:知晓编程,不代表用户或本站观点,如有侵权,请联系nick.zong@aspencore.com 删除!

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 电源
  • DC
  • AC
  • 稳压
  • 浪涌电压的产生原因

    电路在遭雷击和在接通、断开电感负载或大型负载时常常会产生很高的操作过电压,这种瞬时过电压(或过电流)称为浪涌电压(或浪涌电流),是一种瞬变干扰。例如直流6V继电

    7小时前
  • 单片机开关机的实现

    [导读]很多时候我们需要实现设备的开关机,而比较常用的方法有硬件开关的开关机和纯粹的软件开关机。硬件开关机一般都是用拨码式的硬件开关实现,缺点是占用空间比较大,

    前天
  • 大功率IGBT开关特性、驱动要求的分析和讨论

    引言绝缘门极双极型晶体管是复合了功率场效应管和电力晶体管的优点而产生的一种新型复合器件,具有输入阻抗高、工作速度快、热稳定性好、驱动电路简单、饱和压降低、耐压高

    前天
  • 电力电子系统中驱动器对IGBT保护的分析

    1引言为确保电力电子组件在非允许工作的条件影响下得到可靠的保护,需要快速和可靠的错误检测及有效的保护措施。在功率模块中,即可通过系统控制器或者通过IGBT驱动器

    前天
  • USB Type-C电源PD方案解析

    标准是好的,但有时您需要更多。例如USBType-C就是这样一个例子;USB Type-C旨在创建一个用于高速数据传输和电力传输的标准接口,仅需一根电缆,取代需

    前天
  • 过电压保护器损坏的原因

    一、可能引起事故的原因过电压保护器的损坏说明它起不到保护作用了,就是说过电压能量超出了它所应承受的能力,而在正常运行情况下,过电压保护器根本就不会动作,也不会发

    前天
  • 电脑DIY必修课,电源接口详解

    前言电源的功率一直是玩家们关注的焦点,可对于刚涉足DIY领域的用户来说,自己组装DIY一台电脑拿才是最令人兴奋的事情。组装电脑少不了要接各种各样的线材,那么如何

    11-29
  • 总结了5个LED驱动电源设计中的应用技巧

    一、LED电流大小LED电流的大小直接影响着使用寿命,建议降额使用,因此尽量控制小点,特别是LED散热效果不好的话,LED一定要留足余量。二、芯片发热这主要针对

    11-29
  • 过充电怎么修复

    1过充电和过放电在铅酸蓄电池制造的过程中是经常使用的。我们知道,铅酸蓄电池在制造期间,正极板阿尔法氧化铅和贝塔氧化铅是均匀混合的,而不是类似于树枝和树叶的状态。

    11-29
  • LDO数据手册中的PSRR是什么?

    低压差线性稳压器(LDO)最大的优点之一是它们能够衰减开关模式电源产生的电压纹波。这对锁相环(PLL)和时钟等信号调节器件在内的数据转换器尤为重要,因为噪声电源

    11-29
  • 降压是选择DC-DC还是LDO

    LDO是Low Dropout Regulator,意为低压差线性稳压器,是相对于传统的线性稳压器来说的。传统的线性稳压器,如78xx系列的芯片都要求输入电压要

    11-29
下载排行榜
更多
广告