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

做食品怎样选网站上海网站备案号查询

做食品怎样选网站,上海网站备案号查询,热点新闻事件及评论,闵行建设机械网站文章目录 一. 前言二. 关于IIC通信三. IIC通信过程四. STM32实现硬件IIC通信五. 关于硬件IIC的Bug 一. 前言 最近正在DIY一款智能电池#xff0c;需要使用STM32F030F4P6和TI的电池管理芯片BQ40Z50进行SMBUS通信。SMBUS本质上就是IIC通信#xff0c;项目用到STM32CubeMXHAL库… 文章目录 一. 前言二. 关于IIC通信三. IIC通信过程四. STM32实现硬件IIC通信五. 关于硬件IIC的Bug 一. 前言 最近正在DIY一款智能电池需要使用STM32F030F4P6和TI的电池管理芯片BQ40Z50进行SMBUS通信。SMBUS本质上就是IIC通信项目用到STM32CubeMXHAL库使用硬件IIC完成MCU对芯片的寄存器数据的读取和改写。 整篇博客主要是梳理一下IIC的通信流程并记录一下项目实现的过程如有错的地方欢迎各位读者批评指正。 二. 关于IIC通信 总线又两条信号线构成一条是数据线SDA ,用于数据传输。另一条则是时钟线SCL 用于传输CLK信号始终由主设备控制主机Master 通过控制时钟信号可以实现对从机Slave 的控制与读写操作。各设备通过SDA、SCL接入总线每个连接到IIC总线上的器件都有一个唯一的地址如上图所示。 SDA和SCL需通过上拉电阻 接至VCC。由于连接到总线上的器件输出级必须是漏极开路或者集电极开路的因此只要有一个器件任意时刻输出低电平都将总线上的信号变低当IIC总线空闲时SDA和SCL两条线均为高电平即各器件的SDA和SCL都是线与的关系。 三. IIC通信过程 IIC通信过程由一系列的操作组成 起始信号 通信开始时主设备发送一个低电平的SCL时钟脉冲然后再发送一个低电平的SDA数据线脉冲。这个SDA的下降沿表示I2C总线上的一个开始信号。 从设备地址 主设备发送从设备地址到I2C总线。I2C地址由7Bit或10Bit组成取决于使用的设备。 读/写位传输 读写位占据 1bit 数据指定了数据传输的方向 a. 主设备发送数据从设备接受数据为 0 b. 主设备接收数据从设备发送数据为 1 仲裁机制和应答 应答位由1个Bit的数据组成。主设备通过检测应答位以确定从设备是否存在。若主设备收到的是NACK这会让主设备发生重启或停止流程 a. 如果从设备存在并正确收到地址从设备将SDA下拉产生应答信号 0 ACK。b. 如果从设备不存在或未正确收到地址导致SDA空闲产生非应答信号1NACK。数据传输 在确认通信目标后主设备将发送或接收数据。数据传输是在主机产生的每个时钟周期的上升沿或下降沿进行的。 a. 主设备发送数据 上图所示主设备 将要发送的数据位8位或更多依次发送到SDA线上并在每个时钟周期上升沿时更新数据。从设备在每个时钟周期下降沿时接收数据并在接收之后发送应答位来确认是否接收正确。 b. 主设备接收数据 上图所示当读/写传输位为1时到了数据传输时主机从发送变成接收从机从接收变成发送。从设备 将要发送的数据位8位或更多依次发送到SDA线上并在每个时钟周期上升沿时更新数据。主设备在每个CLK下降沿时接收数据并在接收之后发送应答位来确认是否接收正确。 停止信号Stop Signal 通信完成后主设备发送一个停止信号由一个高电平的SCL时钟脉冲和一个高电平的SDA数据线脉冲组成。这个SDA的上升沿表示I2C总线上的一个停止信号。 四. STM32实现硬件IIC通信 本项目用的是STM32F030F4P6通过Smbus通信和TI的电池管理芯片BQ40Z50通信读取电池内部的电压、电流及电量信息并且通过改写电池内部寄存器控制输入输出的Mos管。Smbus本质上就是IIC通信下面通过访问BQ40Z50内部的电压寄存器的例子来说明模拟IIC的实现过程 STM32CubeMX配置如下 1. 主设备 STM32F030F4P6 2. 从设备 BQ40Z50 3. 通信频率 10-100KHz 4. 从设备地址 0x16 5. 电压寄存器地址 0x09 读取寄存器数据 主机STM32首先产生Start信号。然后紧跟着发送从机设备地址0x16此时读写位为0表明是向从机写命令这时候主机等待从机BQ40Z50的应答信号(ACK)。当主机收到应答信号时发送要访问的寄存器地址0x09继续等待从机的应答信号当主机收到应答信号后主机要改变通信模式主机将由发送变为接收从机将由接收变为发送。接着主机重新发送一个开始Start信号然后紧跟着发送从机地址0x16注意此时读写位为1表明将主机设置成接收模式开始读取数据。这时候主机等待从机的应答信号当主机收到应答信号时就可以接收从机发送来的寄存器数据。主机产生停止信号结束传送过程。 虽然通信过程比较复杂但是实现非常简单。因为大部分步骤HAL库已经封装好。直接调用现成的接口即可 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)/** * brief Read an amount of data in blocking mode from a specific memory address * param hi2c Pointer to a I2C_HandleTypeDef structure that contains * the configuration information for the specified I2C. * param DevAddress Target device address: The device 7 bits address value * in datasheet must be shifted to the left before calling the interface * param MemAddress Internal memory address * param MemAddSize Size of internal memory address * param pData Pointer to data buffer * param Size Amount of data to be sent * param Timeout Timeout duration * retval HAL status */比如读取BQ40Z50的电压 Uint8_t Rxbuffer[2];//用于接受数据的数组HAL_I2C_Mem_Read(hi2cx,0x16,0x09,I2C_MEMADD_SIZE_8BIT,Rxbuffer,2,OxFF);//IIC接受从机数据voltage Rxbuffer[1]8|Rxbuffer[0];//对接受数据进行解析同样的写入寄存器数据 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) /*** brief Write an amount of data in blocking mode to a specific memory address* param hi2c Pointer to a I2C_HandleTypeDef structure that contains* the configuration information for the specified I2C.* param DevAddress Target device address: The device 7 bits address value* in datasheet must be shifted to the left before calling the interface* param MemAddress Internal memory address* param MemAddSize Size of internal memory address* param pData Pointer to data buffer* param Size Amount of data to be sent* param Timeout Timeout duration* retval HAL status*/比如向0x00写入0x270C和0x430D可以关闭BQ40Z50的Mos管 uint8_t Mos_off [2]; Mos_off [0] 0x0C; Mos_off [1] 0x27; if(HAL_I2C_Mem_Write(hi2cx,0x16,0x00,I2C_MEMADD_SIZE_8BIT,Mos_off ,2,0xFF)HAL_OK) {Mos_off [0] 0x3D;Mos_off [1] 0x04;HAL_I2C_Mem_Write(hi2cx,0x16,0x00,I2C_MEMADD_SIZE_8BIT,Mos_off ,2,0xFF); }五. 关于硬件IIC的Bug 在开发过程中IIC经常会遇到很多莫名其妙的Bug比如反复超时陷入I2C_WaitOnFlagUntilTimeout()死循环中或者是一直处于HAL_I2C_STATE_BUSY_RX直接卡死看了网络上很多的帖子但是都没有找到好的解决办法。 这里的解决方式非常简单粗暴就在卡死的地方直接对硬件IIC进行重置重新初始化亲测有效。 各位有什么更好的方法欢迎在评论区留言一起探讨。 void User_I2C_ErrorInit(I2C_HandleTypeDef *hi2c) {HAL_I2C_DeInit(hi2c);hi2c-Instance I2C1;hi2c-Init.Timing 0x2000090E;hi2c-Init.OwnAddress1 0;hi2c-Init.AddressingMode I2C_ADDRESSINGMODE_7BIT;hi2c-Init.DualAddressMode I2C_DUALADDRESS_DISABLE;hi2c-Init.OwnAddress2 0;hi2c-Init.OwnAddress2Masks I2C_OA2_NOMASK;hi2c-Init.GeneralCallMode I2C_GENERALCALL_DISABLE;hi2c-Init.NoStretchMode I2C_NOSTRETCH_DISABLE;hi2c-Instance-CR1 | I2C_CR1_SWRST;hi2c-Instance-CR1 ~I2C_CR1_SWRST;if (HAL_I2C_Init(hi2c) ! HAL_OK){User_Error_Handler();}/** Configure Analogue filter*/if (HAL_I2CEx_ConfigAnalogFilter(hi2c, I2C_ANALOGFILTER_ENABLE) ! HAL_OK){User_Error_Handler();}/** Configure Digital filter*/if (HAL_I2CEx_ConfigDigitalFilter(hi2c, 0) ! HAL_OK){User_Error_Handler();} }static void User_Error_Handler(void) {/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */ }各位有什么更好的方法欢迎在评论区留言一起探讨。
http://www.pierceye.com/news/47227/

相关文章:

  • 福田建网站外包湖南软件开发
  • 徐州市城乡建设局官方网站北京市建设网站首页
  • 温州微网站用户体验的重要性
  • 快速建站费用网站设计报告总结
  • 国内做免费视频网站有哪些用jsp做的网站的代码
  • 网站怎么宣传网站首页psd
  • 建设安全工程信息网站没有网站怎么做排名优化
  • 宣传广告设计图片杭州谷歌seo公司
  • 一个网站怎么建设公司法人变更的基本流程
  • 受欢迎的购物网站建设昆明网络推广服务
  • 建网站 选安全网络营销的未来发展趋势
  • 北京西站到大兴机场下载免费素材库
  • 网站后台怎么做飘窗天津关键词优化专家
  • 域名注册后怎么建设网站瓷器网站源码
  • 高校建设网站的特色竞价托管推广公司
  • 协助别人做网站犯法么杭州网站优化推荐
  • 请seo的人帮做网站排名wordpress小工具样式
  • 中职网站建设在rds上安装wordpress
  • 搭建网站西宁建一个网站公司
  • 企业网站开发外包公司网站资质证书
  • 网站建设需求确定影视网站建设目的
  • 交易所网站建设电商运营培训课程
  • 网站图表怎么做的上海羚凯网站建设
  • 网站建设费 什么科目上海做淘宝网站
  • 北京网站建设可选兴田德润重庆第一门户网站
  • 佛山做网站公司哪家好郑州做网站建设
  • 戈韦思网站建设怎样进入12345的公众号
  • 上海千途建站wordpress app接口
  • 网站文章不显示做游戏下载网站赚钱
  • 上海营销网站推广多长沙专业做网站公司哪家好