如何做网站模特,东莞寮步最新通知,网站的建设技术有哪些,关键词推广公司【STM32 HAL库】IIC通信与CubeMX配置 前言理论IIC总线时序图IIC写数据IIC读数据 轮询模式CubeMX配置应用示例AHT20初始化初始化函数读取说明读取函数 中断模式CubeMX配置状态机图fsm.caht20.c DMA模式CubeMX配置代码 前言
本文为笔者学习 IIC 通信的总结#xff0c;基于keysk… 【STM32 HAL库】IIC通信与CubeMX配置 前言理论IIC总线时序图IIC写数据IIC读数据 轮询模式CubeMX配置应用示例AHT20初始化初始化函数读取说明读取函数 中断模式CubeMX配置状态机图fsm.caht20.c DMA模式CubeMX配置代码 前言
本文为笔者学习 IIC 通信的总结基于keysking的视频内容如有错误欢迎指正
理论 IIC总线时序图 IIC写数据 IIC读数据 通信流程以AHT20为例
STM32主机)发送 IIC 启动信号STM32 发送 AHT20(从机)地址AHT20 识别地址并发送 ACK 信号AHT20 发送数据至 STM32(发送完1 字节后结束STM32 发送 ACK 信号表示接收完成STM32重复接收下一个字节直至AHT20数据发送完成STM32 发送 IIC 结束信号
IIC vs 串口通信 IIC为半双工串口为全双工 IIC 可支持多设备通信: IIC通信为总线协议总线上每个从机都有唯一的地址主机IIC通信先发送从机地址非目标从机会忽略数据 同步通信: STM32 的晶振提供统一时钟源为IIC总线上的从机提供统一时钟信号尤其可为无晶振提供精确时钟信号的小型传感器提供精确的同步时钟信号 轮询模式CPU持续搬运数据程序执行被阻塞 中断模式CPU只在搬运数据时介入正常情况下不阻塞程序 DMA模式DMA自动搬运数据无需CPU介入节省资源
轮询模式
以AHT20温湿度传感器为例
CubeMX配置 应用示例
AHT20初始化 初始化函数
#include aht20.h
#define AHT20_ADDRESS 0x70void AHT20_Init() {uint8_t readBuffer; //定义读缓冲器HAL_Delay(40); // 上电后等待40msHAL_I2C_Master_Receive(hi2c1, AHT20_ADDRESS, readBuffer, 1, HAL_MAX_DELAY); // 读取AHT20 1字节状态字 判断AHT20当前状态if ((readBuffer 0x08) 0x00) { // 检查状态字的 Bit[3] 是否为 1uint8_t sendBuffer[3] {0xBE, 0x08, 0x00}; // 初始化命令初始化指令初始化参数HAL_I2C_Master_Transmit(hi2c1, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY); // 发送初始化命令}
}ps 1.AHT20 地址定义为 0x70实际为 7 位地址左移 1 位后补 1 位用于区分读/写操作0 表示写1 表示读。 2.I²C 的发送与接收函数先发送从机地址待从机应答后再发送发送或接收请求。因此初始化函数中的接收操作是在发送 AHT20 地址后接收其状态字。
读取说明 AHT20数据存放形式 除去IIC硬件地址外一共6个字节的数据1字节状态字3.5字节湿度数据3.5字节温度数据 信号转换
读取函数
AHT20读取温湿度数据函数
void AHT20_Read(float *Temperature, float *Humidity) {uint8_t sendBuffer[3] { 0xAC, 0x33, 0x00 }; //发送缓冲区存放触发测量命令参数uint8_t readBuffer[6]; //定义接收缓冲区(6个字节6*8bits分别对应状态、湿度数据1、湿度数据2、湿度和温度数据3、温度数据4、温度数据5.共6字节HAL_I2C_Master_Transmit(hi2c1, AHT20_ADDRESS, sendBuffer, 3, HAL_MAX_DELAY); //发送触发测量命令AHT20开始测量HAL_Delay(75);//等待75ms待测量完成HAL_I2C_Master_Receive(hi2c1, AHT20_ADDRESS, readBuffer, 6, HAL_MAX_DELAY);//判断状态字(readbuffer[0]的Bit[7]是否为0也即状态字的第八位(最高位)是否为0)if ((readBuffer[0] 0x80) 0x00) {uint32_t data 0; //32位data用来存放20位的湿度数据和温度数据// 计算湿度(位运算拼接数据)data ((uint32_t)readBuffer[3] 4) ((uint32_t)readBuffer[2] 4) ((uint32_t)readBuffer[1] 12);*Humidity data * 100.0f / (1 20); //相对湿度转换// 计算温度(位运算拼接数据)data (((uint32_t)readBuffer[3] 0x0F) 16) ((uint32_t)readBuffer[4] 8) (uint32_t)readBuffer[5];*Temperature data * 200.0f / (1 20) - 50; //温度转换}
}中断模式
基本原理同串口的中断模式发送 但因为I2C通信协议的复杂性和多步骤的工作流程使得状态机成为管理I2C中断与DMA模式的有效手段 仅依赖发送和接收完成的中断嵌套没有标志位的参与也难以完成逻辑处理所以状态机是必须的
CubeMX配置 以AHT20温湿度传感器为例
状态机图 状态机标志位
// 0: 初始状态 发送测量命令 1: 正在发送测量命令 2: 测量命令发送完成 等待75毫秒后读取AHT20数据 3: 读取中 4: 读取完成 解析并展示数据然后恢复到初始状态
uint8_t aht20State 0; //定义并初始化aht20初始状态为初始状态fsm.c
void fsm(void)
{switch(aht20State)case 0: //向aht20发送测量命令并切换状态为发送中aht20_measure();aht20State 1;break;case 1: //发送中状态不执行任何操作待发送完成后在中断回调函数中切换状态break;case 2: //发送完成状态下延时75ms后发送获取aht20温湿度数据开始接收aht20的温湿度数据并切换状态为读取中HAL_Delay(75);aht20_get();aht20State 3;break;case 3: //读取中状态不执行任何操作待读取完成后在中断回调函数中切换状态break; case 4: //读取完成状态时进行aht20的温湿度数据解析并发送给上位机。延时1s后切换状态为初始状态AHT20_Analysis(temperature, humidity);sprintf(message, 温度: %.1f ℃, 湿度: %.1f %%\r\n, temperature, humidity);HAL_UART_Transmit(huart2, (uint8_t*)message, strlen(message), HAL_MAX_DELAY);HAL_Delay(1000);aht20State 0;break;
}void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) {if (hi2c hi2c1) {aht20State 2; //在发送完成中断中实现状态切换}
}void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) {if (hi2c hi2c1) {aht20State 4; //在接收完成中断中实现状态切换}
}aht20.c
将AHT20的逻辑代码拆分为最基本的功能模块以便状态机在各个状态下执行相应任务
void aht20_measure() {static uint8_t sendBuffer[3] { 0xAC, 0x33, 0x00 };HAL_I2C_Master_Transmit_IT(hi2c1, AHT20_ADDRESS, sendBuffer, 3);
}void aht20_get() {HAL_I2C_Master_Receive_IT(hi2c1, AHT20_ADDRESS, readBuffer, 6);
}void aht20_analysis(float *Temperature, float *Humidity) {if ((readBuffer[0] 0x80) 0x00) {uint32_t data 0;data ((uint32_t)readBuffer[3] 4) ((uint32_t)readBuffer[2] 4) ((uint32_t)readBuffer[1] 12);*Humidity data * 100.0f / (1 20);data (((uint32_t)readBuffer[3] 0x0F) 16) ((uint32_t)readBuffer[4] 8) (uint32_t)readBuffer[5];*Temperature data * 200.0f / (1 20) - 50;}
}DMA模式
CubeMX配置 代码
只需将上述I2C中断模式收发的函数改为DMA模式收发即可 也即 IT — DMA