在线时间590 小时
UID3469866
注册时间2018-4-19
NXP金币3237
TA的每日心情 | 慵懒 2024-2-8 09:39 |
---|
签到天数: 217 天 [LV.7]常住居民III
版主
- 积分
- 7796
- 最后登录
- 2024-5-6
|
今天先来一篇使用RT1010驱动SHT30读取温湿度的程序。
其中通信方式使用的是IIC,框图如下:
其中命令是16位长度。
比较核心的命令是数值查询。发送指令0x2C06,返回为6字节的数组:
1[温度高八位]
2[温度第八位]
3[温度crc校验]
4[湿度高八位]
5[湿度第八位]
6[湿度crc校验]
手册也给出了温湿度单位转换方式。
IO初始化部分
- IOMUXC_SetPinMux(
- IOMUXC_GPIO_01_LPI2C1_SDA, /* GPIO_01 is configured as LPI2C1_SDA */
- 1U); /* Software Input On Field: Force input path of pad GPIO_01 */
- IOMUXC_SetPinMux(
- IOMUXC_GPIO_02_LPI2C1_SCL, /* GPIO_02 is configured as LPI2C1_SCL */
- 1U); /* Software Input On Field: Force input path of pad GPIO_02 */
- IOMUXC_SetPinConfig(
- IOMUXC_GPIO_01_LPI2C1_SDA, /* GPIO_01 PAD functional properties : */
- 0xD8B0U); /* Slew Rate Field: Slow Slew Rate
- Drive Strength Field: R0/6
- Speed Field: fast(150MHz)
- Open Drain Enable Field: Open Drain Enabled
- Pull / Keep Enable Field: Pull/Keeper Enabled
- Pull / Keep Select Field: Keeper
- Pull Up / Down Config. Field: 22K Ohm Pull Up
- Hyst. Enable Field: Hysteresis Disabled */
- IOMUXC_SetPinConfig(
- IOMUXC_GPIO_02_LPI2C1_SCL, /* GPIO_02 PAD functional properties : */
- 0xD8B0U); /* Slew Rate Field: Slow Slew Rate
- Drive Strength Field: R0/6
- Speed Field: fast(150MHz)
- Open Drain Enable Field: Open Drain Enabled
- Pull / Keep Enable Field: Pull/Keeper Enabled
- Pull / Keep Select Field: Keeper
- Pull Up / Down Config. Field: 22K Ohm Pull Up
- Hyst. Enable Field: Hysteresis Disabled */
复制代码
IIC初始化部分
- const lpi2c_master_config_t ACCEL_I2C_masterConfig = {
- .enableMaster = true,
- .enableDoze = true,
- .debugEnable = false,
- .ignoreAck = false,
- .pinConfig = kLPI2C_2PinOpenDrain,
- .baudRate_Hz = 100000,
- .busIdleTimeout_ns = 0,
- .pinLowTimeout_ns = 0,
- .sdaGlitchFilterWidth_ns = 0,
- .sclGlitchFilterWidth_ns = 0,
- .hostRequest = {
- .enable = false, .source = kLPI2C_HostRequestExternalPin, .polarity = kLPI2C_HostRequestPinActiveHigh}};
- lpi2c_master_handle_t ACCEL_I2C_masterHandle;
- LPI2C_MasterInit(LPI2C1, &ACCEL_I2C_masterConfig, 60000000UL);
- LPI2C_MasterTransferCreateHandle(LPI2C1, &ACCEL_I2C_masterHandle, NULL, NULL);
复制代码
IIC读写函数
- status_t BOARD_LPI2C_Send(LPI2C_Type *base,
- uint8_t deviceAddress,
- uint32_t subAddress,
- uint8_t subAddressSize,
- uint8_t *txBuff,
- uint8_t txBuffSize)
- {
- lpi2c_master_transfer_t xfer;
- xfer.flags = kLPI2C_TransferDefaultFlag;
- xfer.slaveAddress = deviceAddress;
- xfer.direction = kLPI2C_Write;
- xfer.subaddress = subAddress;
- xfer.subaddressSize = subAddressSize;
- xfer.data = txBuff;
- xfer.dataSize = txBuffSize;
- return LPI2C_MasterTransferBlocking(base, &xfer);
- }
- status_t BOARD_LPI2C_Receive(LPI2C_Type *base,
- uint8_t deviceAddress,
- uint32_t subAddress,
- uint8_t subAddressSize,
- uint8_t *rxBuff,
- uint8_t rxBuffSize)
- {
- lpi2c_master_transfer_t xfer;
- xfer.flags = kLPI2C_TransferDefaultFlag;
- xfer.slaveAddress = deviceAddress;
- xfer.direction = kLPI2C_Read;
- xfer.subaddress = subAddress;
- xfer.subaddressSize = subAddressSize;
- xfer.data = rxBuff;
- xfer.dataSize = rxBuffSize;
- return LPI2C_MasterTransferBlocking(base, &xfer);
- }
复制代码
主函数
- SDK_DelayAtLeastUs(1000*1000, 600*1000*1000);
- BOARD_LPI2C_Receive(LPI2C1, 0x44, 0x2C06, 2, sht30_buff, 6);
- uint16_t tem = ((sht30_buff[0]<<8) | sht30_buff[1]);//温度拼接
- float Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)/*转换实际温度*/
- uint16_t hum = ((sht30_buff[3]<<8) | sht30_buff[4]);//湿度拼接
- float Humidity= (100.0*(float)hum/65535.0);
- uint8_t shi = Temperature/10;
- uint8_t ge = Temperature - shi*10;
- uint8_t sound[] = {'0'+shi, '0'+ge, 'C', ' '};
- shi = Humidity/10;
- ge = Humidity - shi*10;
- uint8_t sound1[] = {'0'+shi, '0'+ge, '%', '\r', '\n'};
- LPUART_WriteBlocking(LPUART1, sound, sizeof(sound) / sizeof(sound[0]));
- LPUART_WriteBlocking(LPUART1, sound1, sizeof(sound1) / sizeof(sound1[0]));
复制代码 效果
|
|