OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5109|回复: 8

STM32F7 软件模拟I2C读取SHT85传感器,湿度部分一直为255全高

[复制链接]

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2021-6-19
在线时间
67 小时
发表于 2021-10-12 11:05:40 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 啾啾啾 于 2021-10-12 14:45 编辑

大家好!想请问一下大家使用软件模拟i2c的问题。我在使用原子的i2c例程驱动SHT85,在读取温湿度时发现湿度高八位低八位均为255,全高。下面是我的代码,可以麻烦大家帮忙看看吗
  1. void CMD_Write(etSingleMeasureModes command)
  2. {
  3.         IIC_Start();
  4.         IIC_Send_Byte(SHT85_I2C_ADDR << 1);
  5.         while (IIC_Wait_Ack());
  6.         IIC_Send_Byte(command >> 8);
  7.         while (IIC_Wait_Ack());
  8.         IIC_Send_Byte(command & 0xFF);
  9.         while (IIC_Wait_Ack());
  10.         IIC_Stop();
  11.         delay_ms(5);
  12. }

  13. float SHT85_Read(void)
  14. {
  15.         uint8_t i;
  16.         CMD_Write(SINGLE_MEAS_MEDIUM);            //发送测量命令
  17.         delay_ms(1);
  18.         IIC_Start();
  19.         IIC_Send_Byte(SHT85_I2C_ADDR << 1 | 0x01);        //发送写命令
  20.         while (IIC_Wait_Ack());
  21.         delay_us(5);
  22.         for (i = 0; i < 6; i++)
  23.         {
  24.                 if (i == 5) { *(rxbufsht31 + i) = IIC_Read_Byte(0); }
  25.                 else { *(rxbufsht31 + i) = IIC_Read_Byte(1); }
  26.         }
  27.         IIC_Stop();
  28.         BUFt[0] = rxbufsht31[0];                                                                                  //温度部分
  29.         BUFt[1] = rxbufsht31[1];

  30.         BUFh[0] = rxbufsht31[3];                                                                                  //湿度部分
  31.         BUFh[1] = rxbufsht31[4];
  32.         printf("%d %d %d %d \r\n", rxbufsht31[0], rxbufsht31[1], rxbufsht31[3], rxbufsht31[4]);
  33.         hum = 100 * (BUFh[0] * 256 + BUFh[1]) / 65535;
  34.         return hum;
  35. }
复制代码
串口打印的结果

SHT85 单次模式的时序图

最佳答案

查看完整内容[请看2#楼]

谢谢原子哥!我昨天修改了延时函数,现在能够成功读取了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2021-6-19
在线时间
67 小时
 楼主| 发表于 2021-10-12 11:05:41 | 显示全部楼层
正点原子 发表于 2021-10-14 00:54
尝试读写某个寄存器,看正常不?

谢谢原子哥!我昨天修改了延时函数,现在能够成功读取了
回复

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2021-6-19
在线时间
67 小时
 楼主| 发表于 2021-10-12 15:33:16 | 显示全部楼层
我发现在单步调试的时候是有正确的湿度值的,但是串口打印的全是255,请问一下这是哪里出了问题吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2021-10-13 02:00:30 | 显示全部楼层
很可能是时序问题,继续调试下吧
回复

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2021-6-19
在线时间
67 小时
 楼主| 发表于 2021-10-13 09:13:58 | 显示全部楼层
正点原子 发表于 2021-10-13 02:00
很可能是时序问题,继续调试下吧

;好的谢谢!请问这个时序问题是要如何调试呢,是不是和延时函数的延时时间有关?我昨天翻了很多帖子,有提到时序,也有提到在应答后拉高SDA。我看的有点懵
回复

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2021-6-19
在线时间
67 小时
 楼主| 发表于 2021-10-13 09:22:59 | 显示全部楼层
C:\Users\lenovo\Desktop
回复

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2021-6-19
在线时间
67 小时
 楼主| 发表于 2021-10-13 09:34:30 | 显示全部楼层
大家好,我参照时序,重新修改了代码,但是还是只有温度有效值
  1. float SHT85_Read1(void)
  2. {
  3.         uint8_t i;
  4.         CMD_Write(SINGLE_MEAS_MEDIUM);            //写入单次测量命令
  5.         delay_ms(5);
  6.         IIC_Start();
  7.         IIC_Send_Byte(SHT85_I2C_ADDR << 1 | 0x01);
  8.         while (IIC_Wait_Ack());
  9.         IIC_Stop();
  10.         delay_ms(5);
  11.         IIC_Start();
  12.         IIC_Send_Byte(SHT85_I2C_ADDR << 1 | 0x01);
  13.         while (IIC_Wait_Ack());
  14.         delay_us(5);
  15.         for (i = 0; i < 6; i++)
  16.         {
  17.                 if (i == 5) { *(rxbufsht31 + i) = IIC_Read_Byte(0); }
  18.                 else { *(rxbufsht31 + i) = IIC_Read_Byte(1); }
  19.         }
  20.         IIC_Stop();
  21.         BUFt[0] = rxbufsht31[0];                                                                                  //温度
  22.         BUFt[1] = rxbufsht31[1];

  23.         BUFh[0] = rxbufsht31[3];                                                                                  //湿度
  24.         BUFh[1] = rxbufsht31[4];
  25.         printf("%d %d %d %d %d %d \r\n", rxbufsht31[0], rxbufsht31[1], rxbufsht31[2], rxbufsht31[3], rxbufsht31[4], rxbufsht31[5]);
  26.         hum = 100.0f * (float)(BUFh[0] * 256 + BUFh[1]) / 65535.0f;
  27.         //printf("%.2f\r\n",175.0f * (float)(BUFt[0]*256+BUFt[1]) / 65535.0f - 45.0f);
  28.         return hum;
  29. }
复制代码


屏幕截图 2021-10-13 092000.jpg
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2021-10-14 00:54:46 | 显示全部楼层
啾啾啾 发表于 2021-10-13 09:34
大家好,我参照时序,重新修改了代码,但是还是只有温度有效值

尝试读写某个寄存器,看正常不?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2021-6-19
在线时间
67 小时
 楼主| 发表于 2021-10-15 10:22:54 | 显示全部楼层
正点原子 发表于 2021-10-14 00:54
尝试读写某个寄存器,看正常不?

我修改了延时函数,现在可以正确读取数据了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 20:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表