历史上的今天
返回首页

历史上的今天

今天是:2024年09月28日(星期六)

2019年09月28日 | 再造STM32---第十九部分:I2C—读写 EEPROM

2019-09-28 来源:eefocus

       本章参考资料:《STM32F4xx 参考手册》、《STM32F4xx 规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》及《I2C 总线协议》。


       若对 I2C 通讯协议不了解,可先阅读《I2C 总线协议》文档的内容学习。若想了解SMBUS,可阅读《smbus20》文档。


       关于 EEPROM 存储器,请参考“ 常用存储器介绍”章节, 实验中的 EEPROM,请参考其规格书《AT24C02》来了解。


19.1 I2C协议简介:

       I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、 CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。


① I2C物理层:

I2C物理层的特点

• 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。

• 一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

• 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。

• 总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

• 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。

• 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。

• 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。


② I2C的协议层:

I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

1. I2C基本读写过程:

主机写数据到从机:

主机由从机中读数据:

通讯复合格式:

2.通讯的起始和停止信号:

• 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。

• 当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。

• 起始和停止信号一般由主机产生。


3.数据有效性:

I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。SDA数据线在SCL的每个时钟周期传输一位数据。

• SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。

• 当SCL为低电平时, SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。

4.地址及数据方向:


• I2C总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。设备地址可以是7位或10位。

• 紧跟设备地址的一个数据位R/W用来表示数据传输方向, 数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。

5.响应:

I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。

传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。

 

19.2 STM32的I2C特性及架构:

        软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。

        硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来, CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。

        STM32的I2C外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、 10位设备地址,支持DMA数据传输,并具有数据校验功能。


19.3 STM32的I2C架构剖析:

• 通讯引脚

• 时钟控制逻辑

• 数据控制逻辑

• 整体控制逻辑



1.通讯引脚:

        STM32芯片有多个I2C外设,它们的I2C通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,以《STM32F4xx规格书》 为准。

2.时钟控制逻辑:

SCL线的时钟信号,由I2C接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率。

• 可选择I2C通讯的“标准/快速”模式,这两个模式分别I2C对应100/400Kbit/s的通讯速率。

• 在快速模式下可选择SCL时钟的占空比,可选Tlow/Thigh=2或Tlow/Thigh=16/9模式。

• CCR寄存器中12位的配置因子CCR,它与I2C外设的输入时钟源共同作用,产生SCL时钟。 STM32的I2C外设输入时钟源为PCLK1。

3.数据控制逻辑:

        I2C的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、 PEC寄存器以及SDA数据线。

• 当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去;

• 当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。

4.整体控制逻辑:

         整体控制逻辑负责协调整个I2C外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变。

        在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR1和SR2)” ,只要读取这些寄存器相关的寄存器位,就可以了解I2C的工作状态。



19.4 STM32的I2C通讯过程:

       使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。

1.主发送器

① 主发送器通讯过程

• 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;

• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1, ADDR 为1表示地址已经发送, TXE为1表示数据寄存器为空;


• 往I2C的“数据寄存器DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空, I2C外设通过SDA信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE位被置1,重复这个过程,可以发送多个字节数据;

• 发送数据完成后,控制I2C设备产生一个停止信号(P),这个时候会产生EV2事件, SR1的TXE位及BTF位都被置1,表示通讯结束。

② 主接收器

• 起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;

• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。

• 从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件, SR1寄存器的RXNE被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。 此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;

• 发送非应答信号后,产生停止信号(P),结束传输。


19.5 I2C初始化结构体详解

typedef struct {

uint32_t I2C_ClockSpeed; /*!< 设置 SCL 时钟频率,此值要低于 40 0000*/

uint16_t I2C_Mode; /*!< 指定工作模式,可选 I2C 模式及 SMBUS 模式 */

uint16_t I2C_DutyCycle; /*指定时钟占空比,可选 low/high = 2:1 及 16:9 模式*/

uint16_t I2C_OwnAddress1; /*!< 指定自身的 I2C 设备地址 */

uint16_t I2C_Ack; /*!< 使能或关闭响应(一般都要使能) */

uint16_t I2C_AcknowledgedAddress; /*!< 指定地址的长度,可为 7 位及 10 位 */

} I2C_InitTypeDef;

• I2C_ClockSpeed

        设置I2C的传输速率,在调用初始化函数时,函数会根据我们输入的数值经过运算后把时钟因子写入到I2C的时钟控制寄存器CCR。而我们写入的这个参数值不得高于400KHz。

        实际上由于CCR寄存器不能写入小数类型的时钟因子,影响到SCL的实际频率可能会低于本成员设置的参数值,这时除了通讯稍慢一点以外,不会对I2C的标准通讯造成其它影响。

• I2C_Mode

       选择I2C的使用方式,有I2C模式(I2C_Mode_I2C )和SMBus主、从模式(I2C_Mode_SMBusHost、 I2C_Mode_SMBusDevice ) 。I2C不需要在此处区分主从模式,直接设置I2C_Mode_I2C即可。

• I2C_DutyCycle

       设置I2C的SCL线时钟的占空比。该配置有两个选择,分别为低电平时间比高电平时间为2: 1 ( I2C_DutyCycle_2)和16: 9(I2C_DutyCycle_16_9)。其实这两个模式的比例差别并不大,一般要求都不会如此严格,这里随便选就可以了。

• I2C_OwnAddress1

       配置STM32的I2C设备自己的地址,每个连接到I2C总线上的设备都要有一个自己的地址,作为主机也不例外。地址可设置为7位或10位(受下面I2C_AcknowledgeAddress成员决定),只要该地址是I2C总线上唯一的即可。STM32的I2C外设可同时使用两个地址,即同时对两个地址作出响应,这个结构成员I2C_OwnAddress1配置的是默认的、 OAR1寄存器存储的地址,若需要设置第二个地址寄存器OAR2,可使用I2C_OwnAddress2Config函数来配置, OAR2不支持10位地址。

• I2C_Ack_Enable

        配置I2C应答是否使能, 设置为使能则可以发送响应信号。 一般配置为允许应答(I2C_Ack_Enable),这是绝大多数遵循I2C标准的设备的通讯要求,改为禁止应答(I2C_Ack_Disable)往往会导致通讯错误。

• I2C_AcknowledgeAddress

        选择I2C的寻址模式是7位还是10位地址。这需要根据实际连接到I2C总线上设备的地址进行选择,这个成员的配置也影响到I2C_OwnAddress1成员,只有这里设置成10位模式时,I2C_OwnAddress1才支持10位地址。

推荐阅读

史海拾趣

Crystek公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Crystek公司积极拓展国际市场,与全球多家知名企业建立了合作关系。通过与这些企业的深入合作,Crystek公司的产品得以广泛应用于无线、微波无线电、电信、工业、企业、航空航天和政府部门等各个领域。同时,公司还积极参加国际电子展览和技术交流会议,与全球同行交流学习,不断提升自身的技术水平和市场竞争力。

法思特(FAST)公司的发展小趣事
通过有序地控制电热水器的启动时间,可以避免同时启动多个电热水器造成的电网负载急剧增加。
ESTEK公司的发展小趣事

在电子行业竞争日益激烈的背景下,ESTEK公司也面临着诸多挑战和危机。然而,公司始终保持着清醒的头脑和坚定的信心。在面对市场波动、原材料价格上涨等挑战时,ESTEK公司迅速调整战略、优化生产流程、降低成本等措施,成功度过了危机。在危机中,ESTEK公司展现出了强大的韧性和生命力,为公司未来的发展奠定了坚实基础。

Blaze Display Technology Co Ltd公司的发展小趣事

自1982年起,Blaze Display Technology Co., Ltd.(以下简称“Blaze公司”)以其前瞻性的视野和坚定的决心,踏入了LCD显示屏领域。创立初期,公司面临着资金短缺、技术瓶颈以及市场竞争的诸多挑战。然而,凭借创始团队对技术的深刻理解和对市场的敏锐洞察,Blaze公司逐步攻克难关,研发出了一系列具有竞争力的LCD显示屏产品。

Cosel公司的发展小趣事

随着全球化进程的加速,Cosel公司开始将目光投向国际市场。1990年,公司成立了U.S.ELCO INC.(现名为COSEL U.S.A.,INC.),正式进入美国市场。随后,公司又设立了欧洲常驻办事处,进一步拓展了欧洲市场。这些举措使得Cosel公司的产品和服务能够覆盖更广泛的地区,为公司带来了更多的商机和发展空间。

乔光电子(FTR)公司的发展小趣事

在电子行业,技术创新是企业发展的关键。Cosel公司深知这一点,因此在发展过程中不断引进先进的技术和管理理念。1979年,公司引进了质量控制圈(QC circle)活动,通过全员参与的方式提高产品质量和客户满意度。随后,公司又引进了TQC(全面质量管理)和方针管理,进一步提升了企业的运营效率和产品质量。这些举措使得Cosel公司的产品在市场上获得了良好的口碑。

问答坊 | AI 解惑

本科课程数字信号处理期末考试试卷求解答

期末考试在即,小弟因事耽误学业,一筹莫展之中。现有试卷一份,哪位大侠能出手相助,给予解答,事成有重谢。课程采用教材为清华大学程佩青《数字信号处理》,具体情况可加QQ:43950093详谈…

查看全部问答>

求问SIM300模块通过GPRS发送彩信的问题,谢谢!!!

求问SIM300模块通过GPRS发送彩信的问题,谢谢!!! 现在是这样的情况 我买了一块SIM300的板子,用串口与电脑连接。在电脑上用超级终端进行操作 看了网上很多的连接GPRS网关的例子, AT+CGDCONT=l,\"IP”,“CMWAP” 返回OK 再进行拨号 AT ...…

查看全部问答>

初学者请大家推荐书籍:关于Linux的使用,Linux下的c编程,ARM编程等方面

我是个初学者,请大家推荐几本有口皆碑的关于 1。Linux的安装 ,使用,shell命令,makefile的基础入门使用类书籍 2。Linux下的c编程,gcc的编程 3。ARM下的编程 包括ARM指令集,thumb指令集,ADS编程等等 要求:适合初学者,易学好懂,比如,在 ...…

查看全部问答>

新手求教

各位能否提供一款好用的电子仿真机呀。 我用Electronics Workbench V5.0c,那里面找不到AT89S51等其它的一些芯片.…

查看全部问答>

atof()函数怎么用?

我写了一些代码:如下 TCHAR sAlarm[10]; m_alarmCo.GetWindowText(sAlarm,10); double alarm; alarm=atof(sAlarm); 编译报错。 --------------------Configuration: DJS - Win32 (WCE x86) Debug-------------------- Compiling... Alarm. ...…

查看全部问答>

我在VB6.0中使用Set picfile = CreateObject("FileCtl.File")会提示不能创建对象,怎么解决呀?请高手指点,谢谢!

我在VB6.0中使用Set picfile = CreateObject(\"FileCtl.File\")会提示不能创建对象,怎么解决呀?请高手指点,谢谢!…

查看全部问答>

显示屏用LED红绿蓝封装技术指标要求

replyreload += \',\' + 765662;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

遇到的一个不知怎么解决的问题,求助!!

assembling STM32F10x.s...compiling stm32f10x_it.c...compiling main.c...linking...1.axf: Error: L6967E: Entry point (0x08000000) points to a THUMB instruction&nb ...…

查看全部问答>

关于那个团购430开发板~

上面的东西真是诱人。。。68块钱挺便宜正好前一段报名ti的430比赛了,刚好拿来用用~结果发现团购开始的时间我刚好上课,晚上才能上网,希望不要悲剧,不要抢完了…

查看全部问答>

啊啊啊啊,刚才实验课考试,我纠结到爆了。

现在的我好像吐槽啊 ,吐啊吐啊 吐啊。刚才电路分析基础实验课考试,题目是测时间常数t=RC,我调好波形,叫老师过来看,我就忘记了是0.632倍的Vpp经过的时间就是时间常数嘛,测的时候用了0.7,老师看了,直接被骂了一顿,然后我看还有40分钟时间考试 ...…

查看全部问答>