STM32学习之I2C读写EEPROM学习

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总线上的设备的地址来选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值