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

亚当学院网站视频建设教程成都网站建设q479185700棒

亚当学院网站视频建设教程,成都网站建设q479185700棒,宁夏网站建设怎么样,推广团队在哪里找STM32设置为I2C从机模式#xff08;HAL库版本#xff09; 目录 STM32设置为I2C从机模式#xff08;HAL库版本#xff09;前言1 硬件连接2 软件编程2.1 步骤分解2.2 测试用例 3 运行测试3.1 I2C连续写入3.2 I2C连续读取3.3 I2C单次读写测试 4 总结 前言 我之前出过一篇关于…STM32设置为I2C从机模式HAL库版本 目录 STM32设置为I2C从机模式HAL库版本前言1 硬件连接2 软件编程2.1 步骤分解2.2 测试用例 3 运行测试3.1 I2C连续写入3.2 I2C连续读取3.3 I2C单次读写测试 4 总结 前言 我之前出过一篇关于STM32设置为I2C从机的博客现在应粉丝要求出一篇HAL库版本的I2C从机编程。 基于官方库版本的可以看下我之前发的文章STM32设置为I2C从机模式 1 硬件连接 测试芯片STM32F103RCT6 测试方法用一个USB转I2C的工具接到STM32的I2C引脚上通过上位机工具进行读写操作。如果没有这个工具也可以用另外一组I2C作为主机或者其他设备测试通讯同时也可以借助示波器或者逻辑分析仪来辅助调试。 硬件连接 STM32这边使用硬件I2C1(PB6、PB7)并外接上拉电阻。 本次测试中使用的USB转I2C的工具如下图所示 2 软件编程 2.1 步骤分解 1、初始化I2C配置 注除了最后的HAL_I2C_EnableListen_IT()函数其他代码都可以用STM32CubeMX自动生成 参考代码 static void MX_I2C1_Init(void) {hi2c1.Instance I2C1; // 配置I2C1 hi2c1.Init.ClockSpeed 100000; // 时钟频率100k hi2c1.Init.DutyCycle I2C_DUTYCYCLE_2; // 占空比1/2 hi2c1.Init.OwnAddress1 0x80; // 本机地址0x80若作为从设备则是从机地址 hi2c1.Init.AddressingMode I2C_ADDRESSINGMODE_7BIT; // 地址模式7位 hi2c1.Init.DualAddressMode I2C_DUALADDRESS_DISABLE; // 禁止双地址 hi2c1.Init.OwnAddress2 0; // 第二地址 hi2c1.Init.GeneralCallMode I2C_GENERALCALL_DISABLE; // 禁止广播 hi2c1.Init.NoStretchMode I2C_NOSTRETCH_DISABLE; // 禁止时钟拉伸 if (HAL_I2C_Init(hi2c1) ! HAL_OK) // I2C1初始化 { Error_Handler(); } HAL_I2C_EnableListen_IT(hi2c1); // 使能I2C1的侦听中断 }2、初始化I2C引脚和中断 参考代码 注这个代码可以用STM32CubeMX自动生成 void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {GPIO_InitTypeDef GPIO_InitStruct {0};if(hi2c-InstanceI2C1){// 配置GPIO__HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode GPIO_MODE_AF_OD;GPIO_InitStruct.Pull GPIO_NOPULL;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate GPIO_AF4_I2C1;HAL_GPIO_Init(GPIOB, GPIO_InitStruct);// 配置I2C中断/* Peripheral clock enable */__HAL_RCC_I2C1_CLK_ENABLE();/* I2C1 interrupt Init */HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0); // 事件中断必须有HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0); // 错误中断非必须HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);} }3、配置I2C中断服务函数 参考代码 注这个代码可以用STM32CubeMX自动生成 // I2C1事件中断服务函数必须有 void I2C1_EV_IRQHandler(void) {HAL_I2C_EV_IRQHandler(hi2c1); }// I2C1错误中断服务函数非必须 void I2C1_ER_IRQHandler(void) {HAL_I2C_ER_IRQHandler(hi2c1); }4、配置I2C从机回调处理函数 参考代码 static uint8_t ram[256]; // 模拟I2C从机数据寄存器主机读写的数据都放在这块内存 uint8_t offset; // 从机寄存器当前偏移地址 static uint8_t first_byte_state 1; // 是否收到第1个字节,也就是偏移地址0已收到1没有收到// 侦听完成回调函数完成一次完整的i2c通信以后会进入该函数 void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) {// 完成一次通信清除状态first_byte_state 1;offset 0;HAL_I2C_EnableListen_IT(hi2c); // slave is ready again }// I2C设备地址回调函数地址匹配上以后会进入该函数 void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) {if(TransferDirection I2C_DIRECTION_TRANSMIT) {// 主机发送从机接收if(first_byte_state) {// 准备接收第1个字节数据HAL_I2C_Slave_Seq_Receive_IT(hi2c, offset, 1, I2C_NEXT_FRAME); // 每次第1个数据均为偏移地址} } else {// 主机接收从机发送HAL_I2C_Slave_Seq_Transmit_IT(hi2c, ram[offset], 1, I2C_NEXT_FRAME); // 打开中断并把ram[]里面对应的数据发送给主机} }// I2C数据接收回调函数在I2C完成一次接收时会关闭中断并调用该函数因此在处理完成后需要手动重新打开中断 void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {if(first_byte_state) {// 收到的第1个字节数据偏移地址first_byte_state 0;} else {// 收到的第N个字节数据offset; // 每收到一个数据偏移1}// 打开I2C中断接收,下一个收到的数据将存放到ram[offset]HAL_I2C_Slave_Seq_Receive_IT(hi2c, ram[offset], sizeof(ram), I2C_NEXT_FRAME); // 接收数据存到ram[]里面对应的位置 }// I2C数据发送回调函数在I2C完成一次发送后会关闭中断并调用该函数因此在处理完成后需要手动重新打开中断 void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) {offset; // 每发送一个数据偏移1HAL_I2C_Slave_Seq_Transmit_IT(hi2c, ram[offset], sizeof(ram), I2C_NEXT_FRAME); // 打开中断并把ram[]里面对应的数据发送给主机 }2.2 测试用例 1、测试方法 使用USB转I2C的工具接入到MCU的I2C上面然后使用上位机工具进行读写操作最后通过串口把I2C通讯过程中的几个重要节点打印出来验证结果是否正确。 2、测试程序 其实和上面讲解的代码是一样的只是初始化时先把ram[]赋初值。 参考测试代码 #include stm32f1xx_hal.hstatic uint8_t ram[256]; // 模拟I2C从机数据寄存器主机读写的数据都放在这块内存 uint8_t offset; // 从机寄存器当前偏移地址 static uint8_t first_byte_state 1; // 是否收到第1个字节,也就是偏移地址0已收到1没有收到// 侦听完成回调函数完成一次完整的i2c通信以后会进入该函数 void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) {// 完成一次通信清除状态first_byte_state 1;offset 0;HAL_I2C_EnableListen_IT(hi2c); // slave is ready again }// I2C设备地址回调函数地址匹配上以后会进入该函数 void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode) {if(TransferDirection I2C_DIRECTION_TRANSMIT) {// 主机发送从机接收if(first_byte_state) {// 准备接收第1个字节数据HAL_I2C_Slave_Seq_Receive_IT(hi2c, offset, 1, I2C_NEXT_FRAME); // 每次第1个数据均为偏移地址} } else {// 主机接收从机发送HAL_I2C_Slave_Seq_Transmit_IT(hi2c, ram[offset], 1, I2C_NEXT_FRAME); // 打开中断并把ram[]里面对应的数据发送给主机} }// I2C数据接收回调函数在I2C完成一次接收时会关闭中断并调用该函数因此在处理完成后需要手动重新打开中断 void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) {if(first_byte_state) {// 收到的第1个字节数据偏移地址first_byte_state 0;} else {// 收到的第N个字节数据offset; // 每收到一个数据偏移1}// 打开I2C中断接收,下一个收到的数据将存放到ram[offset]HAL_I2C_Slave_Seq_Receive_IT(hi2c, ram[offset], sizeof(ram), I2C_NEXT_FRAME); // 接收数据存到ram[]里面对应的位置 }// I2C数据发送回调函数在I2C完成一次发送后会关闭中断并调用该函数因此在处理完成后需要手动重新打开中断 void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) {offset; // 每发送一个数据偏移1HAL_I2C_Slave_Seq_Transmit_IT(hi2c, ram[offset], sizeof(ram), I2C_NEXT_FRAME); // 打开中断并把ram[]里面对应的数据发送给主机 }// 测试用例初始化把ram设置为从0到255的数 void i2c_test(void) {for (uint16_t i 0; i 256; i){ram[i] i;} }3 运行测试 3.1 I2C连续写入 通过上位机工具写入 通过逻辑分析仪抓取波形 3.2 I2C连续读取 通过上位机工具连续读取256字节 通过逻辑分析仪抓取波形 3.3 I2C单次读写测试 通过上位机工具读取原值再写入新值最后再读取新值 通过逻辑分析仪抓取波形 4 总结 通过上位机工具的测试以及逻辑分析仪的解析STM32的硬件I2C从机通信正常且稳定读写速度测试了100k和400k没有发现问题至此测试完成。 好了关于STM32如何设置从机模式就介绍到这里如果你们有什么问题欢迎评论区留言。 需要完整源码工程的同学可以自行下载源码下载地址 如果这篇文章能够帮到你就…懂的。
http://wiki.neutronadmin.com/news/168977/

相关文章:

  • 晋城网站建设电话好一点的网站
  • 如何让百度收录网址云南昆明网站建设快速优化
  • 成都网站制作scgckj小程序拉新推广平台
  • 九江网站推广wordpress视频教程
  • 驻马店专业网站建设Django可以做门户网站吗
  • 如何搭建网站后台技术支持广州网站建设
  • 网站集群建设价格如何注册网上商城
  • 已有域名如何在花生壳网站做二级域名托管网页视频下载慢怎么办
  • 区块链技术做网站网址域名是什么
  • 保亭住房和城乡建设局网站网站建设视频教程免费下载
  • 怎么网站代备案屏蔽 wordpress 插件下载
  • 公司网站建设备选方案评价标准百度网站收录
  • 杭州拱墅区网站建设网站建设与管理实验目的
  • 双语版网站引导页wordpress seo plugin
  • 免费个人网站+上传网络营销方案怎么写
  • 公司做网站app入什么科目有奖竞猜网站建设
  • 大区直播间网站开发制作用logo做ppt模板下载网站
  • 万州网站建设公司站长之家查询网站
  • 贵阳市城乡建设厅网站外贸网站怎么做谷歌搜索
  • 2017网站建设费用个人品牌网站设计
  • 新建的网站百度搜不到外贸在哪个网站做
  • 深圳住房和建设局网站免费设计装修公司
  • 嘉兴云建站模板seo优化搜索引擎网站优化推广网络关键词优化-乐之家网络科技
  • 第二课强登陆网站新型智库建设的意见免费发布信息网站平台
  • 世界知名网站王烨诡异复苏的漫画叫什么
  • 安徽省建设厅网站工程师查询东莞网吧
  • 在国外做网站网站犯法吗哪个网站可以上传设计的作品
  • 网站直播间 是怎么做的企业网站建设方案范文
  • 网站建设 ui设计公司网站活动页面设计
  • 如果有域名和空间怎么做网站中小学网站建设