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

用什么软件做动漫视频网站好注册公司的七个步骤

用什么软件做动漫视频网站好,注册公司的七个步骤,hph网站模板,怎么做网站搜索关键词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库版本)

目录

  • 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->Instance==I2C1){// 配置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.h"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[]里面对应的数据发送给主机
}// 测试用例:初始化把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://www.yayakq.cn/news/568482/

相关文章:

  • 平面设计素材网站推荐芷江建设工程招投标网站
  • 购物网站建设咨询wordpress管理地址在哪里
  • 湛江模板建站定制网站wordpress插件残留怎么删除
  • 什么网站百度收录好如何查询一个网站的空间
  • 一个高端的网站设计茶叶网站建设策划方案 u001f
  • 效果图参考网站android studio下载官网
  • 医疗网站专题怎样做北城旺角做网站的
  • pc主页网站建设网站营销如何做
  • 商务网站建设的一般流程惠州微网站推广方案
  • 辽 icp 大连 网站建设app制作
  • 衡阳网站建设步骤微信微网站是什么
  • 手机微网站建设案例及报告用adsl做网站备案
  • 手机网站开发学习关键词查询工具软件
  • 网站降权wordpress 企业网站制作
  • 苏州网站建设优化过哦做网站产品搜索展示实现
  • 服务器在国外未备案网站网页制作基础教程第二版葛艳玲
  • 浙江建设网站公司招聘网站建设人员
  • 建设个人银行网站网站开发晋升空间 路径
  • 手工艺品网站建设方案苏州网站建设渠道
  • 公司网站怎么做才能吸引人怎么用dw做网站
  • 做网站和做app西地那非片能延时多久
  • 网站全局搜索如何做制作一个网站怎么做
  • 建个网站大概需要多久一个网站同时做竞价和seo
  • 广西地矿建设集团网站网站 规划
  • 首都博物馆 网站建设常见的网络营销的方式有哪些
  • 能在线做初中题的网站用校园网如何搭建WordPress
  • 网站页面设计公司电话网站开发技术可行性分析怎么写
  • 网站建设论文选题谷歌推广外包
  • 长沙个人做网站广告设计公司产品
  • 网站建设优化推广排名清远新闻最新