历史上的今天
返回首页

历史上的今天

今天是:2025年08月09日(星期六)

2019年08月09日 | STM32学习之I2C读写EEPROM学习

2019-08-09 来源:eefocus

I2C通信协议之间常用连接方式如下:

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


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


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


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


三种传输模式:标准模式传输速率为100Kps;快速模式为400Kbps;高速模式可达到3.4Mbps;但是目前绝大多数I2C设备不支持高速模式。


I2C基本读写操作:


其中S表示起始信号,由主机产生,当SCL为高电平时SDA线从高电平向低电平切换,表示通信开始。


其中P表示停止信号,由主从机产生,当SCL为高电平时SDA线由低电平向高电平切换,表示通信停止。


数据有效性:


I2C使用SDA信号线传输数据,使用SCL信号线进行数据同步。SDA数据线在SCL的每一个时钟周期传输一位数据。传输时,SCL为高电平时SDA表示的数据有效;当SCL为低电平时,SDA数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。每次数据传输以字节为单位,每次传输的字节数不受限制。


地址及数据方向:


I2C总线上的每个设备都有自己的独立地址,主机发起通信时,通过SDA信号线发送设备地址来查找主机。紧跟设备地址的一个数据位用来表示数据传输方向,是数据方向位(R/W),第8位或者第11位。


响应:


I2C的数据与地址的传输都带响应。响应包括应答和非应答两种。作为数据接收端时,当主从机接收到I2C传输的一个字节数据或者地址后,若希望对方继续发送数据,则需要向对方发送应答信号,发送方会继续发送下一个数据;若接收方希望结束数据传输,则向对方发送非应答信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。


通信过程如下:


1、主机作为发送器:


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


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


3)以上步骤正常执行并对ADDR位清零后,往I2C的“数据寄存器DR”写入要发送的数据,这时TxE位会被重置为0,表示数据寄存器非空,I2C外设通过SDA信号线一位一位把数据发送出去,又会产生“EV8”事件,即TXE位被置1,重复以上过程,就可以发送多位数据。


4)当发送了足够数据后,设置控制寄存器CR1的STOP位,这种情况下,当I2C发送了最后一个数据后会产生“EV8_2”事件,SR1的TxE位及BTF位被置1,然后I2C总线产生一个停止信号,表示通信结束。


2主机作为接收器(略)


与其他外设一样,STM32标准库提供了I2C初始化结构体及初始化函数,用于配置I2C外设。


typedef struct

{

uint32_t  I2C_ClockSpeed ;//设置SCL时钟,此值要低于400000

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位;

 

}

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


参数2)I2C_Mode:选择I2C的使用方式,有I2C模式和AMBus主、从模式。I2C不需要在此处区分主从模式,直接设置I2C_Mode_I2C即可。


参数3)I2C_DutyCycle:设置SCL线时钟的占空比。该设置有两个选择,Low/High = 2/1或Low/High = 16/9。


参数4)I2C_OwnAddress1:本成员配置STM32的I2C设备地址,每个连接I2C总线的设备都需要有一个自己的地址。地址可以设置为7位或者10位。


参数5)I2C_Ack_Enable:关于I2C应答设置,设置为使能则可以发送信号。


参数6)I2C_AcknowledgeAddress:本成员设置I2C的寻址模式是7位还是10位。这需要根据实际连接到I2C总线上的设备的地址来选择。



推荐阅读

史海拾趣

CTC [Compact Technology Corp.]公司的发展小趣事

CTC公司深知人才是企业发展的核心。因此,公司一直注重人才培养和引进。通过与高校和研究机构的合作,CTC公司吸引了大批优秀的科研人才加入。同时,公司还建立了完善的培训体系,为员工提供持续的技能提升和职业发展机会。这些人才成为了CTC公司发展的中坚力量,为公司构筑了核心竞争力。

Beckhoff Automation GmbH公司的发展小趣事

人才是企业发展的核心竞争力,BCD Semi公司高度重视人才培养和团队建设。公司建立了一套完善的人才培养和激励机制,吸引和留住了一批优秀的技术和管理人才。同时,公司还注重团队建设和协作精神的培养,鼓励员工之间的交流和合作,共同推动公司的创新和发展。

以上五个故事仅为示例性质,并不代表BCD Semi公司的实际发展经历。电子行业的发展是一个充满机遇和挑战的过程,需要企业不断创新、拓展市场、提升品质、关注环保和人才培养等方面做出努力。希望这些故事能够为您了解电子行业和BCD Semi公司的发展提供一些参考和启示。

成都成电硅海公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,成都成电硅海公司开始寻求更广阔的市场空间。公司积极参加国内外各种行业展会和论坛,与业界同行进行深入的交流和合作。同时,公司还加大了对海外市场的开拓力度,成功将产品打入欧美等发达国家市场。这一系列的市场拓展举措,使得成都成电硅海公司的知名度不断提升,市场份额也逐渐扩大。

启臣微(Chip)公司的发展小趣事

随着公司业务的不断发展,启臣微开始积极拓展海外市场。公司在西安设立研发中心,在深圳和昆山设立销售中心,并与多家国际知名企业建立了合作关系。这些举措不仅提升了公司的国际影响力,也为公司带来了更多的发展机遇。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

随着市场的竞争加剧,Elite Enterprises意识到只有不断提升产品品质和技术水平,才能在竞争中立于不败之地。因此,公司加大了对研发的投资,不断引进先进的生产设备和检测仪器,并严格把控原材料采购和生产流程。这些努力使公司的LED产品在光效、寿命和稳定性等方面均达到了行业领先水平。

光磊(GL)公司的发展小趣事

Elite Enterprises (H K) Co Ltd成立于2002年,当时正值LED技术快速发展的时期。公司创始人凭借对LED市场的敏锐洞察,决定专注于LED产品的研发和生产。初期,公司面临资金、技术和市场等多重挑战,但通过不懈努力和持续创新,逐步在LED照明市场崭露头角。

问答坊 | AI 解惑

求MAX3232中文资料

求MAX3232中文资料…

查看全部问答>

android应用开发

呵呵,传个现在热门的android的应用开发的ppt顺便说下freescale i.mx5x系列跑android是很爽的,可惜没时间玩啊…

查看全部问答>

如何测试LED芯片,荧光胶,荧光粉方法

面对LED市场的混乱,林林总总,鱼龙混杂的辅料市场,确实让很多新生代的封装工程人员搞得很是迷惑。以下提出几种测试荧光胶,荧光粉,芯片的快速简单的方法供大家参考。 1.    如何测试芯片的稳定性 采用不同芯片厂家的芯片用同一家同 ...…

查看全部问答>

急问,关于STM8TIM2比较输出

想输出三种频率,本来是要改变CCR1_Val_1kzh捕获值,但是我现在改变它频率没有变化,非要改变TIM2_TimeBaseInit函数中溢出时基值来改变频率,不知道为什么请知道的指点一下.   if(temp==1)     TIM2_TimeBaseInit(TIM2_P ...…

查看全部问答>

对于有源低通滤波器为什么在截止频率之前输出信号与输入信号相比就出现了相位偏移

本帖最后由 paulhyde 于 2014-9-15 09:47 编辑 对于有源低通滤波器为什么在截止频率之前输出信号与输入信号相比就出现了相位偏移  …

查看全部问答>

想申请做 编程基础 板块 的 斑竹

辞去51板块斑竹,是因为现在工作的内容,还有关注的东西离它太远。现在申请做 编程基础 的斑竹。主要是以下几个原因:1 我自己,现在工作和自身关注的重心,已经从硬件 偏向 软件。现阶段,对于编程,主要是C语言,此外我还打算开始学习C++,主要是 ...…

查看全部问答>

arm linux驱动开发

要具备的能力: 1.linux基本原理和基础操作 2.C语言是基础。(指针,结构体是重点)   学习方法: 看代码——》编写驱动程序 养成好的编程习惯 思维方式的转变,把arm当成计算机来看(头脑中要用操作系统的概念)————》学习窍门 ...…

查看全部问答>

富士通DIY--家庭物联网项目-晒板啦啦……

求围观,求拍砖!! 板子今天刚到,耐不住诱惑,赶紧焊了起来!效果还好!!    …

查看全部问答>

周计划安排_电力载波LED灯具调光终端

周计划安排:电力载波LED灯具调光终端…

查看全部问答>