STM32中I2C协议时序和使用_第1页
STM32中I2C协议时序和使用_第2页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 STM32中I2C协议时序和使作为使前嵌式设备使最多的协议之,I2C和SPI都是要研究透的。在我使的开发板上,SPI协议集成了,只需要使3个GPIO引脚即可。但I2C协议没有集成,还得写I2C的时序驱动,I2C的时序图家可以百度到,专门的协议档也有。关于时序图我会贴到博客。1. I2C串总线的组成与作原理a. 组成:2根双向信息线,根数据线SDA,根时钟线SCLb. I2C总线上多个器件的挂接(注意,每个器件都有唯的地址)c. 数据的通讯式主从式。主机负责主动联系从机,从机被动回应主机(上图I2C设备都是从机)2. 作式:I2C总线通过上拉电阻接正电源,当总线空闲时,2根线均为电平,各期件的

2、SDA及SCL都是“线与”关系单器件输出低电平,整条总线的信号都拉低,I2C总线上的器件都可以读取到,主从机通讯就是这种机制3. 数据位的有效性规定(规定就是没有理由)SCL处于电平期间,这时对数据进操作,数据线上的数据必须保持稳定。只有SCL处于低电平期间,SDA状态才能变化4. I2C字节的传送与应答每位字节必须保持8位长度。数据传送时,先传送最位MSB, 每个被传送的字节最后必须跟随个应答位(及帧9位,应答位要于说明个字节已经传完,I2C总线重新置空闲态)5. 时序协议的驱动的理解要逻辑性良好(这点是对各个应答信号时序的理解与编程) 4个基本时序信号:起始信号, 终信号, 应答“0”,

3、应答“1”。(注意,定要严格按照时序图来编写程序,延时也有严格的要求)void I2C_Start()/*起始信号*/I2C_SDA_OUT(); /*先SDA输出模式,主机MCU负责主动联系从机,所以MCU是输出*/I2C_SDA_H;I2C_SCL_H;delay_us(5);I2C_SDA_L;delay_us(6);I2C_SCL_L;void I2C_Stop() /*终信号*/I2C_SDA_OUT(); /*先SDA输出模式,同理主机也负责切断与从机的通讯*/I2C_SCL_L;I2C_SDA_L;I2C_SCL_H;delay_us(6);I2C_SDA_H;delay_us(

4、6); void I2C_Ack() /*主机应答*/I2C_SCL_L;I2C_SDA_OUT(); /*SDA输出,主机应答函数,从机器件然内置相应的应答函数*/I2C_SDA_L;delay_us(2);I2C_SCL_H;delay_us(5);I2C_SCL_L;/*SDA在“0”时,SCL保持电平则作为读状态*/void I2C_NAck() /*主机应答*/I2C_SCL_L;I2C_SDA_OUT(); /*SDA输出*/I2C_SDA_H;delay_us(2);I2C_SCL_H;delay_us(5);I2C_SCL_L;/*同理*/这是这上的个基础时序程序。要使I2C协

5、议收,发数据还要研究6. I2C写数据,读数据驱动由图可知,发送的数据(地址和有效数据)不是只使低电平就可以的,2个字节的间隔区分,主从机是否接受到,数据的正确与否。都要求要有起始信号,终信号,应答,还有检测应答函数。 所以主机也要写检测应答函数(从机集成了不关,即使你想了解也和主机的检测应答函数样,只是它转成从机了) u8 I2C_Wait_ACK()/*主机应答函数,检测从机应答的*/u8 tempTime=0;I2C_SDA_IN();I2C_SDA_H;delay_us(1);I2C_SCL_H;delay_us(1);while(GPIO_ReadInputDataBit(GPIO_

6、I2C,I2C_SDA) /*GPIO_ReadInputBit读取GPIO_I2C:I2C_SDA的状态*/tempTime+;if(tempTime250)I2C_Stop();return 1;I2C_SCL_L;return 0;/前期主机释放SDA, SCL总线 void I2C_Send_Byte(u8 txd)/*发送个字节的数据: txd*/u8 i=0;I2C_SDA_OUT();I2C_SCL_L;/SDAfor(i=0;i0) /*这的发送与0,1电平的发送没什么区别。SCL电平保持段时间,SDA则传到从机哪了*/I2C_SDA_H;elseI2C_SDA_L;txd=1

7、;I2C_SCL_H;delay_us(2);I2C_SCL_L;delay_us(2);u8 I2C_Read_Byte(u8 ack) /*读取个字节的数据*/u8 i=0,receive=0;I2C_SDA_IN();/SDAfor(i=0;i8;i+)I2C_SCL_L;delay_us(2);I2C_SCL_H;receive250)I2C_Stop();return 1;I2C_SCL_L;return 0;void I2C_Send_Byte(u8 txd)u8 i=0;I2C_SDA_OUT();I2C_SCL_L;for(i=0;i0)I2C_SDA_H;elseI2C_SD

8、A_L;txd=1;I2C_SCL_H;delay_us(2);I2C_SCL_L;delay_us(2);u8 I2C_Read_Byte(u8 ack)u8 i=0,receive=0;I2C_SDA_IN();for(i=0;i8;i+)I2C_SCL_L;delay_us(2);I2C_SCL_H;receiveAT24C16)I2C_Send_Byte(0 xa0);I2C_Wait_ACK();I2C_Send_Byte(addr8);/ elseI2C_Send_Byte(0 xa0+(addr/256)AT24C16)I2C_Send_Byte(0 xa0);I2C_Wait_

9、ACK();I2C_Send_Byte(addr8);/ /AT24C16 8 elseI2C_Send_Byte(0 xa0+(addr/256)AT24C16)I2C_Send_Byte(0 xa0);I2C_Wait_ACK();I2C_Send_Byte(addr8);/ /AT24C16 8 elseI2C_Send_Byte(0 xa0+(addr/256)1); /+I2C_Wait_ACK();I2C_Send_Byte(addr%256); / I2C_Wait_ACK();I2C_Start(); /I2C_Send_Byte(0 xa1);I2C_Wait_ACK();/

10、+1temp=I2C_Read_Byte(1); /0 1tempAT24C16)I2C_Send_Byte(0 xa0);I2C_Wait_ACK();I2C_Send_Byte(addr8);/ /AT24C16 8 else I2C_Send_Byte(0 xa0+(addr/256)8); / / I2C_Wait_ACK();I2C_Send_Byte(dt&0 xff); / I2C_Wait_ACK();I2C_Stop();delay_ms(10);main.c件#include public.h#include Systick.h#include AT24Cxx.h#include printf.hint main()u16 wdata=16;u16 value=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论