主题中讨论的其他器件: TMP422、 DXP
尊敬的支持团队:
我尝试使用 STM32微控制器通过 I2C 从 TMP422-Q1寄存器值读取本地、远程1和2温度。
在下面、可以找到我的时序配置。
在下面、可以找到我的代码:
/*扫描 I2C 地址*/
HAL_DELAY (500);
for (uint8_t i =0;i <255;i++)
{
if (HAL_I2C_IsDeviceReady (&hi2c2、I、1、10)=HAL_OK)
{
a[cnt]=i;
CNT ++;
}
}
//设置外部 TMP422传感器的配置寄存器2
uint8_t CNF_RGY_2_Tx[2];
CNF_RGY_2_Tx[0]= CNF_RGY_2;
CNF_RGY_2_Tx[1]= CNF_RGY_2_SETUP;
if (HAL_I2C_Master_transmit (&hi2c2、0x98、CNF_RGY_2_Tx、2、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 1;
}
}
//获取外部 TMP422传感器的配置寄存器1
if (HAL_I2C_Master_transmit (&hi2c2、0x98、&CNF_RGY_1、1、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 2;
}
if (HAL_I2C_Master_Receive (&hi2c2、0x99、(uint8_t *) I2CRx_CNF_RGY_1、1、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 3;
}
}
}
//获取外部 TMP422传感器的配置寄存器2
if (HAL_I2C_Master_transmit (&hi2c2、0x98、&CNF_RGY_2、1、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 4;
}
if (HAL_I2C_Master_Receive (&hi2c2、0x99、(uint8_t *) I2CRx_CNF_RGY_2、1、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 5;
}
}
}
/*用户代码末尾2 */
/*无限循环*/
/*用户代码在*/时开始
while (1)
{
//获取本地温度
if (HAL_I2C_Master_transmit (&hi2c2、0x98、&PTR_RGY_0、1、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 6;
}
if (HAL_I2C_Master_Receive (&hi2c2、0x99、(uint8_t *) I2CRx_LOC、I2C2_RX_FieldSize、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 7;
}
//只能快速且脏
if (I2CRx_LOC[0]>=0xC0){
TempLoc =-256 + I2CRx_LOC[0]-(双精度) I2CRx_LOC[1]/256;
}否则{
TempLoc =(双精度) I2CRx_LOC[0]+(双精度) I2CRx_LOC[1]/256;
}
//误差分析
if (TempLoc =-64){
KS_TLOC = 1;
}
if (I2CRx_LOC[0]& 0x01){
OK_TLOC = 1;
}
}
}
//将 PTR 寄存器设置为远程1并接收数据
if (HAL_I2C_Master_transmit (&hi2c2、0x98、&PTR_RGY_1、1、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 8;
}
if (HAL_I2C_Master_Receive (&hi2c2、0x99、(uint8_t *) I2CRx_DSP、I2C2_RX_FieldSize、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 9;
}
//只能快速且脏
if (I2CRx_DSP[0]>=0xC0){
温度=-256 + I2CRx_DSP[0]-(双精度) I2CRx_DSP[1]/256;
}否则{
温度=(双精度) I2CRx_DSP[0]+(双精度) I2CRx_DSP[1]/256;
}
//误差分析
if (TempLoc =-64){
KS_TR1 = 1;
}
if (I2CRx_DSP[0]& 0x01){
OK_TR1 = 1;
}
}
}
if (HAL_I2C_Master_transmit (&hi2c2、0x98、&PTR_RGY_2、1、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 10;
}
if (HAL_I2C_Master_Receive (&hi2c2、0x99、(uint8_t *) I2CRx_DSP2、I2C2_RX_FieldSize、100)== HAL_OK)
{
while (HAL_I2C_GetState (&hi2c2)!= HAL_I2C_State_Ready)
{
CNT = 11;
}
//只能快速且脏
if (I2CRx_DSP2[0]>=0xC0){
TEMP2 =-256 + I2CRx_DSP2[0]-(双精度型) I2CRx_DSP2[1]/256;
}否则{
TEMP2 =(双精度) I2CRx_DSP2[0]+(双精度) I2CRx_DSP2[1]/256;
}
//误差分析
if (TempLoc =-64){
KS_TR2 = 1;
}
if (I2CRx_DSP2[0]& 0x01){
OK_TR2 = 1;
}
}
}
/*用户代码结束,同时*/
/*用户代码 begin 3 */
}
/*用户代码结束3 */
}
TMP 以这样的方式连接、地址应为0x98/0x99、具体取决于读取/写入值。 这些地址是我的准则所发现的,所以这似乎是正确的。
我设法读取本地和远程1温度值、但是远程2温度值被冻结。 结果似乎是开路。 如果我强制短路、该值也会更改为右侧短路值-64。
我只是想澄清一下、没有时序问题/软件错误、错误似乎与硬件有关。
谢谢、此致
Sebastian