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

上一篇上手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 上传

 

posted on 2022-06-19 17:48  张凌001  阅读(266)  评论(0编辑  收藏  举报

导航