今天先來(lái)一篇使用RT1010驅(qū)動(dòng)SHT30讀取溫濕度的程序。
其中命令是16位長(zhǎng)度。
比較核心的命令是數(shù)值查詢(xún)。發(fā)送指令0x2C06,返回為6字節(jié)的數(shù)組:
1[溫度高八位]
2[溫度第八位]
3[溫度crc校驗(yàn)]
4[濕度高八位]
5[濕度第八位]
6[濕度crc校驗(yàn)]
手冊(cè)也給出了溫濕度單位轉(zhuǎn)換方式。
IO初始化部分
IOMUXC_SetPinMux(IOMUXC_GPIO_01_LPI2C1_SDA,1U);
/* GPIO_01 is configured as LPI2C1_SDA */
/* Software Input On Field: Force input path of pad GPIO_01 */
IOMUXC_SetPinMux(IOMUXC_GPIO_02_LPI2C1_SCL,1U);
/* GPIO_02 is configured as LPI2C1_SCL */
/* Software Input On Field: Force input path of pad GPIO_02 */
IOMUXC_SetPinConfig(IOMUXC_GPIO_01_LPI2C1_SDA,0xD8B0U);
/* GPIO_01 PAD functional properties : */
/* 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,0xD8B0U);
/* GPIO_02 PAD functional properties : */
/* 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讀寫(xiě)函數(shù)
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);
}
主函數(shù)
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)/*轉(zhuǎn)換實(shí)際溫度*/
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]));
效果