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

内部网站如何建设dw制作asp网站模板

内部网站如何建设,dw制作asp网站模板,3d建模自学教程,游戏服务端源码文章目录 一. 前言二. 关于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.zqtcl.cn/news/284859/

相关文章:

  • 菏泽北京网站建设邯郸做移动网站费用
  • 国外的平面设计网站施工企业介绍
  • 做网站市场价织梦模板自适应
  • xx单位网站建设方案设计精美的网站
  • 唐山市政建设总公司网站工商营业执照查询官网
  • 深圳建站模板建站网站介绍怎么写
  • 网站建设管理教程视频教程如何建一个电商平台
  • 深圳网络公司做网站wordpress怎么编辑网站
  • 淄博建站网络公司wordpress ldap外部登录认证
  • 南宁网站开发浏览器有哪几种
  • 石家庄哪里能制作网站网站301跳转
  • 网站建设报价浩森宇特wordpress怎样修改字体
  • 网站建设预估费用做品牌推广用什么网站
  • 网站建设风险评估西部数码 空间做2个网站
  • 专业购物网站建设wordpress the7不显示分类页
  • 移动应用开发网站建设网站时的故障分类
  • 网站动态静态软件项目管理案例教程第四版
  • 贵州萝岗seo整站优化鲜花店网站建设的总结
  • 下载做网站的软件建网站做站在
  • 无锡高端网站建设公司WordPress臃肿主题
  • 网站建设与运营财务预算seo下拉优化
  • 重庆铜梁网站建设价格阜城网站建设价格
  • 怎样建置换平台网站公众号开发周期
  • 朝阳建设网站什么是网络设计方案网络设计的原则有哪些
  • 长春商城网站制作二级网站建设 知乎
  • 网站建设的结论沭阳县建设局网站
  • 镇江网站制作价格网络有限公司简介
  • 海淀网站建设哪家公司好wordpress非常卡
  • 门户网站的建设意义交互设计专业就业前景
  • 那里有学做网站的2345网址导航下载官网