完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
引子:
自完全放开后,问了一下朋友圈里的人,基本上全部沦陷,新冠的攻击能力太强了。最近,本人公司也居家办公居多。今天有时间把之前写的sht20 driver 拿出来移植到****N32G45XVL-STB开发板上。
主要修改特性如下:
1) 优化读取温湿度流程,采用非阻塞模式读数据,有效提高CPU的利用率
2)定义数据结构,存储sht20参数状态
sht20 特性
影响编程的参数:
转换时间参数,这个参数非常重要,必须等待转换完成后,在读取温湿度值,否则会一直取不到值。
命令参数:
对应代码实现:
如何读数据:
1) Hold master mode
2) Unhold master mode
温度转换公式:
代码实现:
湿度转换公式:
gitee 地址:
N32G45XVL-STB: 基于N32G45XVL-STB 开发板,开发与应用 (gitee.com)
采用非阻塞方式实现读取温湿度值:
typedef struct { uint8_t _step; uint8_t ret; uint8_t finish; //1: finished, 0: idle uint8_t dataValid; //1: valid, 0: invalid int32_t _tryCnt; int32_t value; float outVal; } shtdrv; typedef struct { shtdrv st_Temp; shtdrv st_RH; int32_t errorCode; }shtOpt; static void sht2xdrv_readVal(uint8_t cmd, shtdrv *pShtdrv ) { uint8_t checksum; //checksum uint8_t data[3] = {0, 0, 0}; //data array for checksum v uint8_t cmd_fail = 0; if( pShtdrv->finish ) return; pShtdrv->ret = SHT2x_STATUS_ERR_BAD_DATA; switch( pShtdrv->_step ) { default: case 0: i2c_Start(); i2c_SendByte( I2C_ADDRESS | I2C_WR ); // Device address if (i2c_WaitAck() != 0) { cmd_fail = 1; break; } pShtdrv->_step = 1; break; case 1: i2c_SendByte( cmd); if (i2c_WaitAck() != 0) { cmd_fail = 1; break; } pShtdrv->_step = 2; pShtdrv->_tryCnt = 0; break; case 2: i2c_Start(); i2c_SendByte(I2C_ADDRESS | I2C_RD); if (i2c_WaitAck() != 0) { pShtdrv->_tryCnt ++; if( pShtdrv->_tryCnt > 10 ) { cmd_fail = 1; break; } } pShtdrv->_step = 3; pShtdrv->_tryCnt = 0; break; case 3: // Notes: convert time must >= 4 ms i2c_Delay( 3 ); pShtdrv->_tryCnt ++; if( pShtdrv->_tryCnt > 4500 ) { pShtdrv->_tryCnt = 0; pShtdrv->_step = 4; } break; case 4: data[0] = i2c_ReadByte(); i2c_Ack(); data[1] = i2c_ReadByte(); i2c_Ack(); data[2] = i2c_ReadByte(); i2c_NAck(); i2c_Stop(); checksum = data[2]; pShtdrv->ret = sht2xdrv_CheckCrc(data, 2, checksum); if ( pShtdrv->ret != SHT2x_STATUS_OK) { pShtdrv->_step = 2; break; } pShtdrv->value = ((uint16_t)data[0] << 8) | data[1]; pShtdrv->_step = 0; pShtdrv->finish = 1; break; } if( cmd_fail ) { pShtdrv->finish = 1; pShtdrv->_tryCnt =0; pShtdrv->_step = 0; pShtdrv->ret = SHT2x_STATUS_ERR_BAD_DATA; i2c_Stop(); } }
只有小组成员才能发言,加入小组>>
449个成员聚集在这个小组
晒晒我的奖品 国民技术N32L436_EVB开发板
2471 浏览 0 评论
【国民技术N32项目移植】lorawan移植--接入腾讯云
2456 浏览 0 评论
【国民技术N32项目移植】半小时移植完成SPI1驱动代码&使用W5500模块进行UDP通信,十分甚至九分好用
3153 浏览 0 评论
【国民技术N32项目移植】基于N32G4FR和小度音响的智能家庭中枢控制系统
2935 浏览 0 评论
【国民技术N32项目移植】基于freeRTOS的CAN通信
3292 浏览 0 评论
2471浏览 0评论
电子发烧友网
电子发烧友开云(中国)官方
查看 »
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-4-9 05:11 , Processed in 0.686403 second(s), Total 70, Slave 54 queries .
Powered by 电子发烧友网
© 2015 www.ringvoyeur.com