【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。
我要赚赏金
