请选择 进入手机版 | 继续访问电脑版
查看: 1229|回复: 1

[原创] RT1010SDK上手I2C,GXHT30温湿度传感器

[复制链接]
  • TA的每日心情
    慵懒
    2023-1-31 09:34
  • 签到天数: 202 天

    [LV.7]常住居民III

    7

    主题

    1515

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3802
    最后登录
    2024-2-19
    发表于 2021-8-10 23:12:20 | 显示全部楼层 |阅读模式
    本帖最后由 zhangt0713 于 2021-8-10 23:39 编辑

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

    EVB接口,直接把温湿度传感器接在此处即可 2021-08-10_17-13-27.png

    直接在SDK上修改,
    1.首先是温湿度传感器的地址更改为0x44,
    2021-08-10_22-53-14.png

    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; 2021-08-10_22-29-05.png

    4.根据温湿度传感器的规格书,写温湿度函数的实现函数
    2021-08-10_22-42-53.png
    2021-08-10_22-43-55.png
    2021-08-10_22-48-00.png
    2021-08-10_22-45-58.png

    温湿度函数的实现如下:(本来打算用,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),打印出温湿度数据,用手触摸温湿度传感器让温湿度产生变化

    打印结果如下:

    2021-08-10_23-09-09.png







    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
    发表于 2021-8-11 10:13:05 | 显示全部楼层
    可以可以
    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 14:41 , Processed in 0.105886 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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