IIC协议之TH09传感器采样

IIC协议之TH09传感器采样

  • 0. 写在前面
  • 1.IIC协议
    • 1.1 BSP_I2C_Start
    • 1.2 BSP_I2C_Stop
    • 1.3 BSP_I2C_waitAck
    • 1.4 BSP_I2C_Send_Byte
    • 1.5 BSP_IIC_Read_Byte
  • 2. TH09
    • 2.1 Init
    • 2.2 时序图
  • 3.TH09 CRC
  • 4.采集结果

0. 写在前面

AT32F415+TH09+BSP库
实现需了解:
1.IIC协议的软件模拟。本文不多介绍,跟着这篇学)
IIC
2. 启动传感器采集
3. 传感器时序图的理解与代码实现
4. 传感器的CRC检验理解与代码实现

1.IIC协议

懒得复制,基于master,参考上面链接编写

1.1 BSP_I2C_Start

1.2 BSP_I2C_Stop

1.3 BSP_I2C_waitAck

1.4 BSP_I2C_Send_Byte

1.5 BSP_IIC_Read_Byte

2. TH09

2.1 Init

首先查手册获得两个地址,(1)IIC从机地址,即传感器设备的地址(2)传感器启动温湿度采集的寄存器地址

#define TH09_ADDR 0X43 
#define START_REG 0X22

还需明确,TH09_ADDR 只是7 bit ,最低位来确定操作是读(1)还是写(0)
0x43<<1 =0x86
read = 0x86 | 1
write = 0x86 |0
在这里插入图片描述

在这里插入图片描述
SENS_START 寄存器有2 bit,分别设置温度与湿度,需设置两个为1,即应该通过IIC接口向TH09(0X43)的SENS_START (0x22)的写入(0)data(0x03)来启动温湿度采集。

代码实现如下:

uint8_t BSP_IIC_writeReg(uint8_t i2cId, uint8_t addr, uint8_t reg, uint8_t *pData, uint16_t len)
{/* 发送起始信号 */BSP_I2C_Start(i2cId);/* 发送地址 W */BSP_I2C_Send_Byte(i2cId, addr | I2C_WR ); // 7位地址和1位写(0)if (BSP_I2C_waitAck(i2cId) == 0) {return (0);}/* 发送寄存器地址 */BSP_I2C_Send_Byte(i2cId, reg);if (BSP_I2C_waitAck(i2cId) == 0) {return (0);}/* 发送数据 */for (uint16_t i = 0; i < len; i++) {BSP_I2C_Send_Byte(i2cId, pData[i]);if (BSP_I2C_waitAck(i2cId) == 0) {return (0);}}// DEBUG("PData : %02x \r\n",pData[0]);// 03 没错BSP_I2C_Stop(i2cId);return (1);
}

2.2 时序图

在这里插入图片描述
这边是要去读取slave(TH09)采集的温湿度数据,看(b)。

在这里插入图片描述
读取事务首先从写寄存器开始,这个寄存器为存储采集温湿度数据的T_VAL和H_VAL寄存器。

在这里插入图片描述
在这里插入图片描述
写结束后有一个s表示sleep,需要给时间让传感器对采集数据进行处理,如果没有sleep可能得到的采集数据会出错。
之后就是一个字节读然后等ack,最后一帧不需要回复ack。
时序图实现就是对着图用IIC的代码进行看图写话。代码实现:

uint8_t BSP_IIC09_readData(uint8_t i2cId, uint8_t addr,uint8_t reg,uint8_t *pData, uint16_t len){/* 发送起始信号 */BSP_I2C_Start(i2cId);/* 发送地址  R */BSP_I2C_Send_Byte(i2cId, addr | I2C_WR); // DEBUG("slave addr : %02x \r\n",addr | I2C_WR);/* 等待应答 */if (BSP_I2C_waitAck(i2cId) == 0) {return (0);}/* 发送寄存器地址 */BSP_I2C_Send_Byte(i2cId, reg);// 写read reg的地址0x30// DEBUG("reg addr : %02x \r\n",reg); /* 等待应答 */if (BSP_I2C_waitAck(i2cId) == 0) {return (0); }/* 发送起始信号 */BSP_I2C_Start(i2cId);/* 发送地址  R */BSP_I2C_Send_Byte(i2cId, addr | I2C_RD);// I2C_RD 1 为读,设置读取位// DEBUG("slave addr : %02x \r\n",addr | I2C_RD);/* 等待应答 */if (BSP_I2C_waitAck(i2cId) == 0) {return (0);}for (uint16_t i = 0; i < len; i++) {if (i == (len - 1)) {pData[i] = BSP_IIC_Read_Byte(i2cId, 0); /* 最后一个字节不发送应答指令 */ // DEBUG("PData : %02x \r\n",pData[i]);} else {pData[i] = BSP_IIC_Read_Byte(i2cId, 1);}}BSP_I2C_Stop(i2cId);return (1);}

3.TH09 CRC

  1. 首先应该明确CRC检验的input和return。
  2. 其次应明确CRC的流程。从下图截取的TH09手册看,crc_result = crc7(val),若数据帧中的crc== crc_result,校验通过。
    在这里插入图片描述
  3. 接着介绍input和return使用到的参数。其中:
  • input 。val 为 17bit的payload,由1 bit valid和16 bit data 组成
    代码表示为:
data = ((uint16_t)i2c_receiver[1] << 8) | i2c_receiver[0];
val_tmp = (uint16_t)i2c_receiver[2]&0x1;
val = val_tmp<<16|data;
  • crc 。数据帧[2],但是0位为valid位,故使用crc_true = crc >> 1取得crc。最早在这里踩坑,导致检验一直没过·。
    在这里插入图片描述
  • return 。return就是使用crc7的公式对每bit进行运算,最终返回7 bit的crc_result。这边核心代码参考手册,我添加了一个判断crc?=crc_result的函数。
nt TH09_crc7_check(uint32_t data,uint32_t crc) {uint32_t crc_result =0 ;uint8_t crc_true = crc >> 1;  // 有一位是validcrc_result = crc7_compute(data); //使用data计算出crc。然后与原始比较// DEBUG("data: %02x\r\n", data);// DEBUG("crc: %02x\r\n", crc);// DEBUG("crc_result: %02x\r\n", crc_result);// 返回 CRC-7 结果 与 CRC比较if(crc_true == crc_result){return 1;}else{return 0;}}

crc7_compute部分参考TH09手册。

//CRC related
#define CRC7WIDTH 7
#define CRC7POLY 0x89 // 二项式
#define CRC7IVEC 0x7F // 0111 1111#define DATA7WIDTH 17
#define DATA7MASK ((1UL << DATA7WIDTH) - 1) // 0 1111 1111 1111 1111
#define DATA7MSB (1UL << (DATA7WIDTH - 1))  // 1 0000 0000 0000 0000uint32_t crc7_compute(uint32_t crcData){uint32_t bit = DATA7MSB; // 循环变量(指示要测试哪一位,从最高位开始)uint32_t pol = CRC7POLY;pol = pol << (DATA7WIDTH - CRC7WIDTH - 1); //设置多项式//留空间给crc valuecrcData = crcData << CRC7WIDTH; bit  = bit << CRC7WIDTH; //最高位为1pol = pol << CRC7WIDTH;// 插入初始向量crcData |= CRC7IVEC; //7位1加到低位// DEBUG("crcData2:%02x\r\n",crcData);// 这边crc算了24位// CRC 算法的主要循环while (bit & (DATA7MASK << CRC7WIDTH)) {// 如果位为1,执行异或操作if (bit & crcData){ //该位不为0crcData ^= pol;}// 位右移一位bit >>= 1;// 多项式右移一位pol >>= 1;}return crcData; //7位crc校验值}

4.采集结果

采集数据使用数码管显示。
在这里插入图片描述

使用SecureCRT在终端显示采集数据。为了采集数据的小数位输出,扩大了10倍。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/315743.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++面试宝典第12题:数组元素相除

题目 从控制台输入若干个整数作为数组,将数组中每一个元素除以第一个元素的结果,作为新的数组元素值。比如:可以先输入3,作为数组元素的个数;然后输入3个整数,作为数组元素的值。 解析 这道题本身并不复杂,但里面隐藏了不少“坑点”和“雷区”,主要考察应聘者全面思考问…

HTML语义化的理解

HTML语义化是指在编写HTML代码时&#xff0c;合理地选择适当的标签和属性来描述页面的结构和内容&#xff0c;使得代码更具有可读性、可维护性和可访问性。 可读性&#xff1a;通过使用语义化的标签&#xff0c;可以清晰地表达页面的结构和内容&#xff0c;使得代码更易于阅读和…

基于多元宇宙算法优化的Elman神经网络数据预测 - 附代码

基于多元宇宙算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于多元宇宙算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于多元宇宙优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

【工具】vscode搜索结果及工程目录的文件夹、文件的排除

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

windows2012 安装mysql5.7

windows2012 安装mysql5.7 1.安装1.解压文件夹2.把my文件拷入没有sql安装目录3.编辑my文件4.按照下方进行配置5.cmd进入bin目录6.出现丢失文件7.安装这个文件即可解决8.开始进行安装&#xff0c;输入mysqld install9.初始化mysql&#xff08;mysqld --initialize --console&…

RabbitMQ(七)ACK 消息确认机制

目录 一、简介1.1 背景1.2 定义1.3 如何查看确认/未确认的消息数&#xff1f; 二、消息确认机制的分类2.1 消息发送确认1&#xff09;ConfirmCallback方法2&#xff09;ReturnCallback方法3&#xff09;代码实现方式一&#xff1a;统一配置a.配置类a.生产者c.消费者d.测试结果 …

solidity显示以太坊美元价格

看过以太坊白皮书的都知道&#xff0c;以太坊比较比特币而言所提升的地方中&#xff0c;我认为最重要的一点就是能够访问外部的数据&#xff0c;这一点在赌博、金融领域应用会很广泛&#xff0c;但是区块链是一个确定的系统&#xff0c;包括里面的所有数值包括交易ID等都是确定…

【DevOps】你的网络,就是我的网络

文章目录 1、简述2、归纳3、三大共享网络特点3.1、AP频段3.1.1、功能区别3.1.2、设备区别3.1.3、2.4GHz优缺点 3.2、Wifi热点共享3.2.1、个人热点3.2.2、热点名称3.2.3、自定义设置 3.3、USB网络共享3.3.1、USB连接3.3.2、设置USB共享3.3.3、看是否成功 3.4、蓝牙网络共享3.4.1…

低代码开发平台未来发展前景和趋势

低代码开发平台是一种提供了简化应用程序开发的工具和环境的平台。它允许开发人员使用少量的编码和配置来创建应用程序&#xff0c;大大减少了传统开发过程中的时间和资源成本。 低代码开发平台在过去几年中取得了显著的发展&#xff0c;并且在未来几年中有着良好的发展前景。…

2024年01月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年01月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

我的CSDN 512天创作者纪念日总结:高效、高现

文章目录 512天创作者纪念日&#xff1a;2023年的12月31日CSDN的512天消息提醒第一篇文章&#xff0c;最后一篇文章总计847篇文章&#xff0c;每月发文分布512天&#xff0c;各专栏文章统计512天&#xff0c;互动总成绩 512天创作者纪念日&#xff1a;2023年的12月31日 2023年…

【2023年度总结】重生之我在CSDN写博客

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…