【NXP FRDM-MCXA156 开发板测评】温度计
本文介绍了恩智浦 FRDM-MCXA156 开发板 P3T1755DPJ 板载传感器的相关测试方案,实现环境温度的串口打印;进一步采用LabVIEW上位机实现温度采集和保存。
1.介绍
FRDM-MCXA156 开发板板载 P3T1755DPJ (I3C/I²C)高精度温度传感器。
P3T1755 是一款温度范围为 -40 °C 至 +125 °C 的温度数字转换器。它使用片上带隙温度传感器和具有超温检测功能的 A-D 转换技术。该设备包含一个用于存储器件设置的配置和数据寄存器的数量,例如器件操作模式,以及一个温度寄存器用于存储数字温度读数,该读数可由控制器通过 2 线串行 I3C(高达 12.5 MHz)和 I2C(高达 3.4 MHz)接口。
I2C 接口支持多达 32 个目标地址和警报功能,当温度超过编程限值。
I3C 接口支持 IBI(带内中断),其中 P3T1755 将其地址发送到仲裁地址 I3C 总线上的标头,以通知控制器中断。它不需要额外的中断引脚。
P3T1755 可以针对不同的运行条件进行配置。它可以在正常模式下设置为定期监控环境温度,或在关闭模式下以最大限度地降低功耗。温度寄存器始终存储 12 位 2 补码数据,温度分辨率为 0.0625 °C。
特征
温度精度
±0.5°C 精度温度传感器
内部 12 位模数转换器(分辨率 0.0625°C)
可编程温度过低和过温警报
性能
工作电压为 1.4 V 至 3.6 V
低静态电流:6 μA (最大值)
市场细分
消费/工业:P3T1755DP
汽车:P3T1755DP/Q900 (AEC-Q100)
包装
TSSOP:3.0 mm x 3.0 mm
应用
汽车
通信基础设施
消费者
工业
外围电路
温漂曲线
测量范围内的温度精度极高,且稳定性较好。
时序图
I3C 通信时序图
读数据配置
详见:P3T1755DP 数据手册 .
I3C 原理图
开发板上 I3C 传感器的原理图如下
2.工程测试
使用 IDE 打开工程目录,构建、编译、调试、上传至开发板,使用串口助手软件读取温度数据。
打开 Demo 例程 SDK\boards\frdmmcxa156\driver_examples\i3c\master_read_sensor_p3t1755
代码
#include <string.h> /* SDK Included Files */ #include "fsl_debug_console.h" #include "fsl_p3t1755.h" #include "fsl_i3c.h" #include "board.h" #include "app.h" /******************************************************************************* * Definitions ******************************************************************************/ #define I3C_TIME_OUT_INDEX 100000000U #define SENSOR_ADDR 0x08U #define CCC_RSTDAA 0x06U #define CCC_SETDASA 0x87 #ifndef EXAMPLE_I2C_BAUDRATE #define EXAMPLE_I2C_BAUDRATE 400000 #endif #ifndef EXAMPLE_I3C_OD_BAUDRATE #define EXAMPLE_I3C_OD_BAUDRATE 1500000 #endif #ifndef EXAMPLE_I3C_PP_BAUDRATE #define EXAMPLE_I3C_PP_BAUDRATE 4000000 #endif /******************************************************************************* * Prototypes ******************************************************************************/ static void i3c_master_callback(I3C_Type *base, i3c_master_handle_t *handle, status_t status, void *userData); /******************************************************************************* * Variables ******************************************************************************/ volatile status_t g_completionStatus; volatile bool g_masterCompletionFlag; i3c_master_handle_t g_i3c_m_handle; p3t1755_handle_t p3t1755Handle; const i3c_master_transfer_callback_t masterCallback = { .slave2Master = NULL, .ibiCallback = NULL, .transferComplete = i3c_master_callback}; /******************************************************************************* * Code ******************************************************************************/ static void i3c_master_callback(I3C_Type *base, i3c_master_handle_t *handle, status_t status, void *userData) { if (status == kStatus_Success) { g_masterCompletionFlag = true; } g_completionStatus = status; } status_t I3C_WriteSensor(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize) { status_t result = kStatus_Success; i3c_master_transfer_t masterXfer = {0}; uint32_t timeout = 0U; masterXfer.slaveAddress = deviceAddress; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.subaddress = regAddress; masterXfer.subaddressSize = 1; masterXfer.data = regData; masterXfer.dataSize = dataSize; masterXfer.flags = kI3C_TransferDefaultFlag; g_masterCompletionFlag = false; g_completionStatus = kStatus_Success; result = I3C_MasterTransferNonBlocking(EXAMPLE_MASTER, &g_i3c_m_handle, &masterXfer); if (kStatus_Success != result) { return result; } while (!g_masterCompletionFlag) { timeout++; if ((g_completionStatus != kStatus_Success) || (timeout > I3C_TIME_OUT_INDEX)) { break; } } if (timeout == I3C_TIME_OUT_INDEX) { result = kStatus_Timeout; } result = g_completionStatus; return result; } status_t I3C_ReadSensor(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize) { status_t result = kStatus_Success; i3c_master_transfer_t masterXfer = {0}; uint32_t timeout = 0U; masterXfer.slaveAddress = deviceAddress; masterXfer.direction = kI3C_Read; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.subaddress = regAddress; masterXfer.subaddressSize = 1; masterXfer.data = regData; masterXfer.dataSize = dataSize; masterXfer.flags = kI3C_TransferDefaultFlag; g_masterCompletionFlag = false; g_completionStatus = kStatus_Success; result = I3C_MasterTransferNonBlocking(EXAMPLE_MASTER, &g_i3c_m_handle, &masterXfer); if (kStatus_Success != result) { return result; } while (!g_masterCompletionFlag) { timeout++; if ((g_completionStatus != kStatus_Success) || (timeout > I3C_TIME_OUT_INDEX)) { break; } } if (timeout == I3C_TIME_OUT_INDEX) { result = kStatus_Timeout; } result = g_completionStatus; return result; } status_t p3t1755_set_dynamic_address(void) { status_t result = kStatus_Success; i3c_master_transfer_t masterXfer = {0}; uint8_t g_master_txBuff[1]; /* Reset dynamic address. */ g_master_txBuff[0] = CCC_RSTDAA; masterXfer.slaveAddress = 0x7E; masterXfer.data = g_master_txBuff; masterXfer.dataSize = 1; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.flags = kI3C_TransferDefaultFlag; result = I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer); if (result != kStatus_Success) { return result; } /* Assign dynmic address. */ memset(&masterXfer, 0, sizeof(masterXfer)); g_master_txBuff[0] = CCC_SETDASA; masterXfer.slaveAddress = 0x7E; masterXfer.data = g_master_txBuff; masterXfer.dataSize = 1; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.flags = kI3C_TransferNoStopFlag; result = I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer); if (result != kStatus_Success) { return result; } memset(&masterXfer, 0, sizeof(masterXfer)); g_master_txBuff[0] = SENSOR_ADDR << 1; masterXfer.slaveAddress = SENSOR_SLAVE_ADDR; masterXfer.data = g_master_txBuff; masterXfer.dataSize = 1; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.flags = kI3C_TransferDefaultFlag; return I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer); } /*! * @brief Main function */ int main(void) { status_t result = kStatus_Success; i3c_master_config_t masterConfig; p3t1755_config_t p3t1755Config; double temperature; BOARD_InitHardware(); PRINTF("\r\nI3C master read sensor data example.\r\n"); I3C_MasterGetDefaultConfig(&masterConfig); masterConfig.baudRate_Hz.i2cBaud = EXAMPLE_I2C_BAUDRATE; masterConfig.baudRate_Hz.i3cPushPullBaud = EXAMPLE_I3C_PP_BAUDRATE; masterConfig.baudRate_Hz.i3cOpenDrainBaud = EXAMPLE_I3C_OD_BAUDRATE; masterConfig.enableOpenDrainStop = false; masterConfig.disableTimeout = true; I3C_MasterInit(EXAMPLE_MASTER, &masterConfig, I3C_MASTER_CLOCK_FREQUENCY); /* Create I3C handle. */ I3C_MasterTransferCreateHandle(EXAMPLE_MASTER, &g_i3c_m_handle, &masterCallback, NULL); result = p3t1755_set_dynamic_address(); if (result != kStatus_Success) { PRINTF("\r\nP3T1755 set dynamic address failed.\r\n"); } p3t1755Config.writeTransfer = I3C_WriteSensor; p3t1755Config.readTransfer = I3C_ReadSensor; p3t1755Config.sensorAddress = SENSOR_ADDR; P3T1755_Init(&p3t1755Handle, &p3t1755Config); while (1) { result = P3T1755_ReadTemperature(&p3t1755Handle, &temperature); if (result != kStatus_Success) { PRINTF("\r\nP3T1755 read temperature failed.\r\n"); } else { PRINTF("\r\nTemperature:%f \r\n", temperature); } SDK_DelayAtLeastUs(1000000, CLOCK_GetCoreSysClkFreq()); } }
效果
串口打印
3.LabVIEW 数据采集
使用 LabVIEW 上位机软件实现串口数据提取、绘图、采集和保存
同时获取当前时间,
数据存储
时刻与温度数据合并为二维数组,并保存为 dat 格式文件
LabVIEW 框图
4.总结
本文介绍了恩智浦 FRDM-MCXA156 开发板 P3T1755DPJ 板载传感器的相关测试方案,烧录官方Demo例程,实现串口打印温度数值;进一步采用LabVIEW上位机实现温度采集和保存,为该系列芯片的相关实际应用提供参考。
开发板工程及LabVIEW工程见附件 I3C_labview.zip。