ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RT1010SDK上手I2C,GXHT30温湿度传感器

2022-06-19 18:05:57  阅读:200  来源: 互联网

标签:LPI2C I2C tem 10 温湿度 uint8 transfer RT1010SDK


上一篇上手SDK的GPIO,串口,以及MCUXpresso Config Tools ,接着上期的内容,测试I2C的使用,手上只有这个温湿度传感器,虽然用了几次了,下次一定换个IC测试。
直接在SDK中导入evkmimxrt1010_lpi2c_polling_b2b_master工程,本工程是采用查询的方式。
步骤如下:
<ignore_js_op> <ignore_js_op>
<ignore_js_op>

EVB接口,直接把温湿度传感器接在此处即可 <ignore_js_op>

直接在SDK上修改,
1.首先是温湿度传感器的地址更改为0x44,
<ignore_js_op>

2.I2C的初始化

  1. void I2C_Init(void)
  2. {
  3.     lpi2c_master_config_t masterConfig;
  4.     /*Clock setting for LPI2C*/
  5.         CLOCK_SetMux(kCLOCK_Lpi2cMux, LPI2C_CLOCK_SOURCE_SELECT);
  6.         CLOCK_SetDiv(kCLOCK_Lpi2cDiv, LPI2C_CLOCK_SOURCE_DIVIDER);
  7.     /* 获取默认配置 */
  8.         LPI2C_MasterGetDefaultConfig(&masterConfig);
  9.     /* 配置LPI2C速度100k */
  10.         masterConfig.baudRate_Hz = LPI2C_BAUDRATE;
  11.     /* Initialize the LPI2C master peripheral */
  12.         LPI2C_MasterInit(EXAMPLE_I2C_MASTER, &masterConfig, LPI2C_MASTER_CLOCK_FREQUENCY);
  13. }
复制代码
3.读写函数

  1. bool I2C_WriteBuffer(uint8_t SalveAddr,uint8_t RegAddr,uint8_t *DateByte,uint32_t DataNum)
  2. {
  3.     lpi2c_master_transfer_t transfer;
  4.     status_t err_flag;
  5.     /*
  6.     * @data         :要发送的数据
  7.     * @datasize     :发送的数据个数
  8.     * @direction    :读写模式选择
  9.     * @flags        :传输失败的标志位
  10.     * @slaveAaddress:从机地址
  11.     * @subaddress   :寄存器/内存地址
  12.     * @subaddressSize:地址寄存器大小
  13.     */
  14.     transfer.data = DateByte;
  15.     transfer.dataSize = DataNum;
  16.     transfer.direction = kLPI2C_Write;
  17.     transfer.flags = kLPI2C_TransferDefaultFlag;
  18.     transfer.slaveAddress =SalveAddr;
  19.     transfer.subaddress = RegAddr;
  20.     transfer.subaddressSize = 0x00;
  21.     err_flag = LPI2C_MasterTransferBlocking(LPI2C1,&transfer);
  22.     if(err_flag != kStatus_Success)  return false;
  23.     return true;
  24. }
  25. bool I2C_ReadBuffer(uint8_t SalveAddr,uint8_t RegAddr,uint8_t *DateByte,uint32_t DataNum)
  26. {
  27.     lpi2c_master_transfer_t transfer;
  28.     status_t err_flag;
  29.     /*
  30.     * @data         :发送、接受的数据
  31.     * @datasize     :读取的数据个数
  32.     * @direction    :读写模式选择
  33.     * @flags        :传输失败的标志位
  34.     * @slaveAaddress:从机地址
  35.     * @subaddress   :寄存器/内存地址
  36.     * @subaddressSize:地址寄存器大小
  37.     */
  38.     transfer.data = DateByte;
  39.     transfer.dataSize = DataNum;
  40.     transfer.direction = kLPI2C_Read;
  41.     transfer.flags = kLPI2C_TransferDefaultFlag;
  42.     transfer.slaveAddress =SalveAddr;
  43.     transfer.subaddress = RegAddr;
  44.     transfer.subaddressSize = 0x00;
  45.     err_flag = LPI2C_MasterTransferBlocking(LPI2C1,&transfer);
  46.     if(err_flag != kStatus_Success)  return false;
  47.     return true;
  48. }
复制代码 代码中的 transfer.subaddress, transfer.subaddressSize 都设置为0; <ignore_js_op>

4.根据温湿度传感器的规格书,写温湿度函数的实现函数
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

温湿度函数的实现如下:(本来打算用,printf来打印的,SDK上需要修改一些地方,连PRINTF("℃  ;")PRINTF("\%\r\n"); 这两个符号有没能输出,省略了,后期研究好了再来更新)

  1. bool GXHT30_Signal_Convert(void)
  2. {
  3.         bool reval;
  4.         uint8_t buff[6];
  5.         uint16_t tem,hum,TEM,HUM;
  6.         uint8_t tem_buf[6];
  7.         uint8_t tem_buf1[5];
  8.         reval = I2C_WriteBuffer(LPI2C_MASTER_SLAVE_ADDR_7BIT,0,GXHT30_CMD_BUF,2);
  9.         Delay_ms(20);
  10.         reval = I2C_ReadBuffer (LPI2C_MASTER_SLAVE_ADDR_7BIT,0,buff,6);
  11.         tem = ((buff[0]<<8) | buff[1]);//温度拼接
  12.         hum = ((buff[3]<<8) | buff[4]);//湿度拼接
  13.         Temperature =(175.0 * (float)tem/65535.0 -45.0); //温度计算
  14.         Humidity=  (100.0*hum/65535.0);
  15.         if (Temperature < 0.0) //如为负数,首位为1
  16.                 TEM = (uint16_t) (Temperature * (-10.0)) + 0x8000; //10倍储存
  17.             else
  18.                 TEM = (uint16_t) (Temperature * 10.0); //10倍储存
  19.             HUM = (uint16_t) (Humidity * 10.0); //10倍储存
  20.         if(TEM&0x8000)
  21.                  tem_buf[0]='-';
  22.                  else
  23.                  tem_buf[0] = '+';
  24.                  tem_buf[1] = TEM/100+'0';
  25.                  tem_buf[2] = (TEM%100)/10+'0';
  26.                  tem_buf[3] = '.';
  27.                  tem_buf[4] = TEM%10+'0';
  28.                  tem_buf[5] = '\0';
  29.                  tem_buf1[0] = HUM/100+'0';
  30.                  tem_buf1[1] = (HUM%100)/10+'0';
  31.                  tem_buf1[2] = '.';
  32.                  tem_buf1[3] = HUM%10+'0';
  33.                  tem_buf1[4] = '\0';
  34.         PRINTF("Temperature=");
  35.         PRINTF(tem_buf);
  36. //        PRINTF("℃  ;");
  37.         PRINTF(" Humidity= ");
  38.         PRINTF(tem_buf1);
  39.         //PRINTF("\%\r\n");
  40.         return reval;
  41. }
复制代码
5.直接在主函数中调用:bool GXHT30_Signal_Convert(void),打印出温湿度数据,用手触摸温湿度传感器让温湿度产生变化

打印结果如下:

<ignore_js_op>

2021-08-10_23-09-09.png (100.39 KB, 下载次数: 1)

下载附件

2021-8-10 23:10 上传

 

标签:LPI2C,I2C,tem,10,温湿度,uint8,transfer,RT1010SDK
来源: https://www.cnblogs.com/zhugeanran/p/16390956.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有