前言

在前人代码上,移植SHT30驱动,遇到很玄学的问题,安装手册给的时序读回温度和湿度,要不就是检验通过不了,要不就是读回FF,读回的通讯时序如下,比较简单

先说结论:

祖传代码中IIC通讯中的应答函数问题,程序问题,原来是这样

INT8S I2C_ReadOneByte(INT8U Ack)  //读取一个字节并响应
{SDA_IN();INT8U I2C_ReadByte_i=8;INT8S I2C_ReadByte_Receive=0;while(I2C_ReadByte_i--){IIC_SCL_SetLow();Delay_us(1);IIC_SCL_SetHigh();Delay_us(1);if(gpio_input_bit_get(GPIOB,IIC_SDA)){I2C_ReadByte_Receive<<=1;I2C_ReadByte_Receive|=0x01;}else {I2C_ReadByte_Receive<<=1;}//Delay_us(1);}// IIC_SCL_SetLow();if(Ack){I2C_NAck(); }else{I2C_Ack();}IIC_SCL_SetLow();return I2C_ReadByte_Receive;
}
**********************************************************************
*函 数 名:I2C_Ack
*说    明:产生ACK信号
*入口参数:无
*出口参数:无
*********************************************************************
*/
void I2C_Ack(void)  //产生Ack
{SDA_OUT();IIC_SCL_SetLow();Delay_us(1);IIC_SDA_SetLow();Delay_us(1);IIC_SCL_SetHigh();Delay_us(1);IIC_SCL_SetLow();
}

改成这样,

INT8S I2C_ReadOneByte(INT8U Ack)  //读取一个字节并响应
{SDA_IN();INT8U I2C_ReadByte_i=8;INT8S I2C_ReadByte_Receive=0;while(I2C_ReadByte_i--){IIC_SCL_SetLow();Delay_us(1);IIC_SCL_SetHigh();Delay_us(1);if(gpio_input_bit_get(GPIOB,IIC_SDA)){I2C_ReadByte_Receive<<=1;I2C_ReadByte_Receive|=0x01;}else {I2C_ReadByte_Receive<<=1;}//Delay_us(1);}IIC_SCL_SetLow();if(Ack){I2C_NAck(); }else{I2C_Ack();}return I2C_ReadByte_Receive;
}

就能很稳定读回数据

排查过程

首先怀疑,硬件问题,因为IIC总线上挂了不止一个设备,测量波形

一开始没有看出异常,

总所周知,很多通讯协议都是靠时钟的边缘信号锁入数据的,但是IIC是靠电平状态锁入数据的,即当SCL为高电平是,锁入当前数据,所有要求在SCL跳变前,SDA保持稳定。

一开始以为是SDA稳定时间没有完全包含SCL的问题,改了一下,发现还是不行,很玄学。

查了半天,最后发现在读SHT30的时候,第8个时钟有点长,然后去查原因,最终查到了,第八个时钟SCL没有拉低时,单片机开始切换的SDA引脚为输出,此时SHT30正在使用SDA输出,两者电平冲突造成,SHT30异常。

附最后正常时序的图

SHT30 温湿度传感器,检验不通过,通讯不稳定(经常读到FF)问题处理相关推荐

  1. CRC校验——以SHT30温湿度传感器为例(内附SHT30的驱动代码)

    文章目录 1. 基本原理 2. 计算方法 3. c语言代码实现 4. SHT30代码 4.1 drv.c 4.2 test.c 4.3 Makefile 1. 基本原理  循环冗余校验码(CRC)的基 ...

  2. 模拟IIC读取SHT30温湿度传感器数据

    文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...

  3. 传感器:SHT30温湿度传感器检测环境温湿度实验(底部附代码)

    一.导言 SHT30温湿度传感器模块是通过IIC驱动,所以大家使用该模块时,需要具备IIC的基本知识,这篇文章带领大家一起使用SHT30模块进行温湿度的测量,当然DHT10/DHT10原理都一样,好了 ...

  4. STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...

  5. sht30温湿度传感器中文手册_【STM32Cube_16】使用硬件CRC校验数据(以SHT30为例)...

    寻求更好的阅读体验,请移步Mculover666的个人博客: Mculover666的个人博客​www.mculover666.cn 本篇详细的记录了如何使用STM32CubeMX配置STM32L43 ...

  6. 【STM32】【STM32CubeMX】STM32CubeMX的使用之四:IIC总线协议驱动SHT30温湿度传感器

    文章目录 0.前言 1.传感器介绍 1.1.传感器简介 1.2.传感器板原理图 1.3.传感器引脚定义 1.4.数据采集工作流程 1.4.1.单次数据采集模式 1.4.2.周期型数据采集模式 1.5. ...

  7. 读取寄存器值_温湿度传感器与S7-1200 PLC通讯读取温湿度案例

    1 硬件组态 添加S7-1200CPU(1214C DC/DC/DC) 添加通信板CB1241(RS485) 2 MODBUS通讯指令介绍 2.1 主站初始化指令 EN----使能端(仅需在第一个扫描 ...

  8. STM32模拟IIC驱动sht30温湿度传感器

    最近有在使用sht30这个传感器,相比于新手常用的dht11传感器,sht30更精确,自己花了半小时调好了 所以拿出来分享给大家. sht30外观 驱动不是自己写的, 是采用CSDN上的一位朋友的 , ...

  9. SHT30温湿度传感器应用笔记

    芯片介绍 SHT30是一款温湿度传感器,使用IIC通信接口.可根据命令设置其测量频率.测量时间:测量持续时间有三种可选(见芯片手册2.2): HIGH:12.5ms: medium:4.5ms: lo ...

最新文章

  1. 利用链式存储结构实现线性表
  2. 魔改GPT自动写网文,速度一秒十字,还能给太监作品无限续更 | 开源
  3. Tableau实战系列如何在阿里云Linux服务器上安装 Tableau Server
  4. VMware View 与 Citrix Xendesktop 管理大比拼
  5. State(状态)--对象行为型模式
  6. C语言课程设计报告输出杨辉三角,C语言学习:在屏幕上输出杨辉三角
  7. Comet 反Ajax: 基于jQuery与PHP实现Ajax长轮询(LongPoll)
  8. Linux Hugetlbfs内核源码简析-----(二)Hugetlbfs挂载
  9. Bailian2926 算术运算【水题】
  10. modal verbs(一)
  11. mysql如何用sql增加字段和注释?
  12. 基于Ansible和CodeDeploy的DevOps解决方案
  13. 我的毕业设计后端技术栈
  14. 手把手教你制作手机离线地图
  15. Game Engine on Vulkan 01-preface [Vulkan游戏引擎开发 01-引言]
  16. 《机器学习》学习笔记
  17. 《Real-Time Rendering 4th Edition》全文翻译 - 第6章 纹理化(上)6.1 ~ 6.3
  18. 毕业一年经历两次大裁员......
  19. 推荐系统论文重要的三个指标——Recall、NDCG、RMSE
  20. JS中children与childNodes的区别

热门文章

  1. android刷步工具,位移精灵1.51(安卓10刷步数)
  2. java实现回文数算法
  3. 中国人民大学与加拿大女王大学金融硕士-作为金融人你深知,投资学习是一本万利的
  4. tcpTrace的使用
  5. (NSMenu,NSMenuItme)如何在菜单栏添加新的菜单
  6. FIN_WAIT_2状态解释
  7. NumPy的数组对象:ndarray
  8. 罗克韦尔L85E plc程序下载和上载
  9. selenium java自动化测试
  10. 【机器学习必备知识】NumPy线性代数详解