当前位置: 首页 > news >正文

北京网站关键词排名公司国内视频培训网站建设

北京网站关键词排名公司,国内视频培训网站建设,学做网站的基本,电子代加工东莞网站建设目录 一、 I2C总线结构 1、I2C总线的特点 2、I2C总线通信协议 3、 STM32F407的I2C接口 二、 I2C的HAL驱动程序 1、 I2C接口的初始化 2、阻塞式数据传输 #xff08;1#xff09;函数HAL_I2C_IsDeviceReady() #xff08;2#xff09;主设备发送和接收数据 #…目录 一、 I2C总线结构 1、I2C总线的特点 2、I2C总线通信协议 3、 STM32F407的I2C接口 二、 I2C的HAL驱动程序 1、 I2C接口的初始化 2、阻塞式数据传输 1函数HAL_I2C_IsDeviceReady() 2主设备发送和接收数据 3从设备发送和接收数据 4I2C存储器数据传输 3、中断方式数据传输 4、 DMA方式数据传输 5、其它 I2C(Inter-Integrated Circuit)接口有时也写作IIC或I²C接口是一种串行数字总线接口。I2C接口只有2根信号线总线上可以连接多个设备硬件实现简单可扩展性强。I2C接口主要用于通信速率要求不高以及多个器件之通信的应用场景。 本文使用的开发板旺宝红龙STM32F407ZGT6 KIT V1.0。 一、 I2C总线结构 一个器件的I2C接口只有2根信号线即双向串行数据线SDA和时钟信号线SCL。I2C是种多设备总线一根I2C总线上可以挂载多个设备。 1、I2C总线的特点 I2C总线只有两根信号线SDA是双向串行数据线SCL是时钟信号线用于数据收发的同步。I2C总线上可以挂载多个设备一般有一个主设备、多个从设备。MCU一般作为主设备外围器件作为从设备。在I2C通信协议中主动发起通信的器件就是主设备被动进行响应的器件就是从设备。I2C总线上每个器件有一个7位或10位的地址主设备发起通信时会首先发送目标设备地址只有地址对应的从设备才会做出响应。I2C总线的两根信号线有上拉电阻。当I2C器件空闲时其输出接口是高阻态。当所有设备都空闲时I2C总线上是高电平。I2C通信有标准模式和快速模式标准模式传输速率为100kbit/s,快速模式传输速率为400kbit/s。 2、I2C总线通信协议 I2C通信总是由主机启动每个通信过程由起始信号开始由停止信号结束。一个数据包有8位每个数据包后有一个应答位(ACK)或非应答位(NACK)。例如主设备向从设备发送1字节数据的时序图 起始位当SCL是高电平时SDA的下跳沿就是起始位是启动一次I2C通信的起始信号。停止位当SCL为高电平时SDA的上跳沿就是停止位是停止一次I2C通信的结束信号。数据位在SCL的一个时钟周期内传输一个数据位当SCL为低电平时发送设备更新SDA的电平当SCL为高电平时接收设备读取SDA的电平就是有效的一位数据。数据包I2C数据通信一个数据包总是8位也就是1字节的数据。应答信号在发送完8位数据包后发送设备在第9个SCL时钟周期采集接收设备的应答信号。若在SCL的第9个周期采集的SDA为低电平就是应答信号ACK如果采集的SDA是高电平就是非应答信号NACK。 在一次I2C通信过程中可以传输多字节的数据。主机启动I2C通信后发送的第一个字节是目标设备地址后面再发送或接收的数据由具体器件的指令定义决定。I2C通信协议只是定义了基本的数据传输时序并且通信时序由MCU的硬件I2C接口实现。 3、 STM32F407的I2C接口 STM32F407芯片上有3个硬件I2C接口记作I2C1、I2C2和I2C3,均支持I2C标准模式和I2C快速模式还与系统管理总线(System Management Bus,SMBus)2.0兼容。STM32F407上的I2C接口具有如下特性。 同一个I2C接口既可以工作于主模式又可以工作于从模式。工作于从模式时可以设置两个从设备地址从而对两个从地址应答。使用7位或10位设备地址还可以进行广播呼叫。支持不同的通信速度标准模式传输速率为100kbit/s快速模式传输速率为400kbit/s。带DMA功能的1字节缓存。 二、 I2C的HAL驱动程序 I2C的HAL驱动程序头文件是stm32f4xx_hal_i2c.h和stm32f4xx_hal_i2c_ex.h。I2C的HAL驱动程序包括宏定义、结构体定义、宏函数和功能函数。I2C的数据传输有阻塞式、中断方式和DMA方式。  1、 I2C接口的初始化 对I2C接口进行初始化配置的函数是HAL_I2C_Init()其函数原型定义如下 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) 其中hi2c是I2C接口的对象指针是I2C_HandleTypeDef结构体类型指针。在STM32CubeIDE自动生成的文件i2c.c中会为启用的I2C接口定义外设对象变量例如为I2C1接口定义的变量如下 I2C_HandleTypeDef hi2c1; //I2C1接口的外设对象变量 结构体I2C_HandleTypeDef的成员变量主要是HAL程序内部用到的一些定义只有成员变量Init是需要用户配置的I2C通信参数是I2C_InitTypeDef结构体类型。 2、阻塞式数据传输 阻塞式数据传输使用方便且I2C接口的传输速率不高一般传输数据量也不大阻塞式传输是常用的数据传输方式。 函数名 功能描述 HAL_I2C_IsDeviceReady() 检查某个从设备是否准备好了I2C通信 HAL_I2C_Master_Transmit() 作为主设备向某个地址的从设备发送一定长度的数据 HAL_I2C_Master_Receive() 作为主设备从某个地址的从设备接收一定长度的数据 HAL_I2C_Slave_Transmit() 作为从设备发送一定长度的数据 HAL_I2C_Slave_Receive() 作为从设备接收一定长度的数据 HAL_I2C_Mem_Write() 向某个从设备的指定存储地址开始写入一定长度的数据 HAL_I2C_Mem_Read() 从某个从设备的指定存储地址开始读取一定长度的数据 1函数HAL_I2C_IsDeviceReady() 函数HAL_I2C_IsDeviceReady()用于检查I2C网络上一个从设备是否做好了I2C通信准备其函数原型定义如下 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint32_t Trials,uint32_t Timeout); 其中hi2c是I2C接口对象指针DevAddress是从设备地址Trials是尝试的次数Timeout是超时等待时间(单位是嘀嗒信号节拍数)当SysTick定时器频率为默认的1000Hz时Timeout的单位就是ms。 2主设备发送和接收数据 一个I2C总线上有一个主设备可能有多个从设备。主设备与从设备通信时必须指定设备地址。I2C主设备发送和接收数据的两个函数的原型定义如下 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint8_t *pData,uint16_t Size,uint32_t Timeout);HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint8_t *pData,uint16_t Size,uint32_t Timeout); 其中pData是发送或接收数据的缓冲区Size是缓冲区大小。DevAddress是从设备地址无论是发送还是接收这个地址都要设置为I2C设备的写操作地址。Timeout为超时等待时间单位是嘀嗒信号节拍数。 阻塞式操作函数在数据发送或接收完成后才返回返回值为HAL_OK时表示传输成功否则可能是出现错误或超时。 3从设备发送和接收数据 I2C从设备发送和接收数据的两个函数的原型定义如下 HAL_StatusTypeDef HAL_I2C_slave_Transmit(I2C_HandleTypeDef *hi2c,uint8_t *pData,uint16_t Size,uint32_t Timeout);HAL_StatusTypeDef HAL_I2C_slave_Receive(I2C_HandleTypeDef *hi2c,uint8_t *pData,uint16_t size,uint32_t Timeout) I2C从设备是应答式地响应主设备的传输要求发送和接收数据的对象总是主设备所以函数中无须设置目标设备地址。 4I2C存储器数据传输 对于I2C接口的存储器例如EEPROM芯片24C02有两个专门的函数用于存储器数据读写。向存储器写入数据的函数是HAL_I2C_Mem_Write()其原型定义如下 HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t*pData,uint16_t Size,uint32_t Timeout); 其中DevAddress是I2C从设备地址MemAddress是存储器内部写入数据的起始地址MemAddSize是存储器内部地址大小即8位地址或16位地址有两个宏定义表示存储器内部地址大小。 #define I2C_MEMADD_SIZE_8BIT 0x00000001U //8位存储器地址 #define I2C_MEMADD_SIZE_16BIT 0x000000100 //16位存储器地址 参数pData是待写入数据的缓冲区指针Size是待写入数据的字节数Timeout是超时等待时间。使用这个函数可以很方便地向I2C接口存储器一次性写入多字节的数据。从存储器读取数据的函数是HAL_I2C_Mem_Read)其原型定义如下 HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *pData,uint16_t Size,uint32_t Timeout); 使用I2C存储器数据传输函数的好处是可以一次性传递地址和数据函数会根据存储器的I2C通信协议依次传输地址和数据而不需要用户自己分解通信过程。 3、中断方式数据传输 一个I2C接口有两个中断号一个用于事件中断另一个用于错误中断。HAL_I2C_EV_IRQHandler()是事件中断ISR中调用的通用处理函数HAL_I2C_ER_IRQHandler()是错误中断ISR中调用的通用处理函数。 I2C接口的中断方式数据传输函数以及各个传输函数关联的回调函数如表 函数名 函数功能描述 关联的回调函数 HAL_I2C_Master_Transmit_IT() 主设备向某个地址的从设备发送一定长度的数据 HAL_I2C_MasterTxCpltCallback() HAL_I2C_Master_Receive_IT() 主设备从某个地址的从设备接收一定长度的数据 HAL_I2C_MasterRxCpltCallback() HAL_I2C_Master_Abort_IT() 主设备主动中止中断传输过程 HAL_I2C_AbortCpltCallback() HAL_I2C_Slave_Transmit_IT() 作为从设备发送一定长度的数据 HAL_I2C_SlaveTxCpltCallback() HAL_I2C_Slave_Receive_IT() 作为从设备接收一定长度的数据 HAL_I2C_SlaveRxCpltCallback() HAL_I2C_Mem_Write_IT() 向某个从设备的指定存储地址开始写入一定长度的数据 HAL_I2C_MemTxCpltCallback() HAL_I2C_Mem_Read_IT() 从某个从设备的指定存储地址开始读取一定长度的数据 HAL_I2C_MemRxCpltCallback() 所有中断方式传输函数 中断方式传输过程出现错误 HAL_I2C_ErrorCallback() 中断方式数据传输函数的参数定义与对应的阻塞式传输函数类似只是没有超时等待参数Timeout。例如以中断方式读写I2C接口存储器的两个函数的原型定义如下 HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *pData,uint16_t Size);HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,int16_t MemAddress,uint16_t MemAddSize,uint8_t *pData,uint16_t Size); 中断方式数据传输是非阻塞式的函数返回HAL_OK只是表示函数操作成功并不表示数据传输完成只有相关联的回调函数被调用时才表示数据传输完成。 4、 DMA方式数据传输 一个I2C接口有I2C_TX和I2C_RX两个DMA请求可以为DMA请求配置DMA流从而进行DMA方式数据传输。I2C接口的DMA方式数据传输函数以及DMA流发生传输完成事件(DMA_IT_TC)中断时的回调函数如表 函数名 函数功能描述 关联的回调函数 HAL_I2C_Master_Transmit_DMA() 向某个地址的从设备发送一定长度的数据 HAL_I2C_MasterTxCpltCallback() HAL_I2C_Master_Receive_DMA() 从某个地址的从设备接收一定长度的数据 HAL_I2C_MasterRxCpltCallback() HAL_I2C_Slave_Transmit_DMA() 作为从设备发送一定长度的数据 HAL_I2C_SlaveTxCpltCallback() HAL_I2C_Slave_Receive_DMA() 作为从设备接收一定长度的数据 HAL_I2C_SlaveRxCpltCallback() HAL_I2C_Mem_Write_DMA() 向某个从设备的指定存储地址开始写入一定长度的数据 HAL_I2C_MemTxCpltCallback() HAL_I2C_Mem_Read_DMA() 从某个从设备的指定存储地址开始读取一定长度的数据 HAL_I2C_MemRxCpltCallback() DMA传输函数的参数形式与中断方式传输函数的参数形式相同例如以DMA方式读写I2C接口存储器的两个函数的原型定义如下 HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *pData,uint16_t Size);HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *pData,uint16_t Size); DMA传输是非阻塞式传输函数返回HAL_OK时只表示函数操作完成并不表示数据传输完成。DMA传输过程由DMA流产生中断事件DMA流的中断函数指针指向I2C驱动程序中定义的一些回调函数。I2C的HAL驱动程序中并没有为DMA传输半完成中断事件设计和关联回调函数。 5、其它 一个I2C从设备有两个地址一个是写操作地址另一个是读操作地址。例如开发板上的EEPROM芯片24C02的写操作地址是0xA0,读操作地址是0xA1,也就是在写操作地址上加1。在I2C的HAL驱动程序中传递从设备地址参数时只需设置写操作地址函数内部会根据读写操作类型自动使用写操作地址或读操作地址。但是在软件模拟I2C接口通信时必须明确使用相应的地址。 IIC总线判断高低电平SPI总线判断边沿。
http://www.hkea.cn/news/14520939/

相关文章:

  • wordpress导入网站国内外优秀设计网站
  • 北京网站优化快速排名移动网站开发流行
  • 济南网站的优化宿迁建站网
  • 赣榆区住房和城乡建设局网站建设银行网站会员用户名格式
  • 网站后台不显示验证码seo优化关键词放多少合适
  • 网站推广有哪些手段企业简介比较好的范本
  • 知名手机网站泰安网络信息有限公司
  • 广州做网站服务国外扁平化网站设计欣赏
  • 做cp和网站运营游戏代理公司
  • 郑州做网站公司 汉狮网络专业i深建官方网站
  • 精诚时代 网站谁做的除了WordPress等
  • 网站做支付需要准备什么条件免费的网络营销方式有哪些
  • 酒店建设网站的意义海珠区手机版网站建设
  • 门户网站建设重要性怎么修改网站模版
  • 免费域名网站创建在那个网站找模具做
  • 服装网站的设计理念做网站目录
  • 公司微信网站开发平台长沙本地烟
  • ps做网站页面美工湘潭做网站优化
  • 长沙移动网站建设哪家好广州seo公司排名
  • 自己做的网站如何实现下载文件上海网站设计公司
  • h5招聘模板免费网站排名优化外包价钱
  • 天津开发区建设工程管理中心网站制作文字图片软件
  • 如何诊断网站seo网页qq登录保护怎么关
  • 班级网站设计wordpress与typecho
  • 网站2个页面做首页软文写作技巧有哪些
  • 土特产网站建设事业计划书网站建设公司开票开什么内容
  • 临沂外贸网站建设个人两字印章在线制作网站
  • 上海网站建设 迈wordpress 花园
  • 做网站编辑怎么样h5神兽平台正规的代理
  • 玉林网站建设公司淮北市官网