This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMP422-Q1:读取 TMP422-Q1寄存器的全部三个温度

Guru**** 1641220 points
Other Parts Discussed in Thread: TMP422-Q1, TMP422, DXP
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/874664/tmp422-q1-reading-all-three-temperatures-of-the-tmp422-q1-registers

器件型号:TMP422-Q1
主题中讨论的其他器件: TMP422DXP

尊敬的支持团队:

我尝试使用 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  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、这些是我的预定义变量:  

    /*私人定义------------------------------------------------------- *
    /* USER CODE BEGIN PD */
    #define I2C2_RX_FieldSize ((uint8_t) 2)

    /*用户代码末尾 PD */

    /*私有宏------------------------------------------------------- *
    /*用户代码 begin PM */

    /*用户代码结束 PM */

    /*私有变量------------------------------------------------------- *

    I2C_HandleTypeDef hi2c2;

    /*用户代码 begin PV */

    /*用户代码末尾 PV */

    /*私有函数原型------------------------------------------------------- *
    void SystemClock_Config (void);
    静态空 MX_GPIO_Init (空);
    静态空 MX_I2C2_Init (空);
    /*用户代码 begin PFP */

    /*用户代码末尾 PFP */

    /*私人用户代码------------------------------------------------------- *
    /*用户代码开始0 */
    uint8_t a[10]={0};
    uint8_t cnt = 0;

    uint8_t I2CRx_LOC[I2C2_RX_FieldSize]={0};
    双 TempLoc = 0;

    uint8_t I2CRx_DSP[I2C2_RX_FieldSize]={0};
    双温度= 0;

    uint8_t I2CRx_DSP2[I2C2_RX_FieldSize]={0};
    双温度2 = 0;

    uint8_t I2CRx_CNF_RGY_1[1]={0};
    uint8_t I2CRx_CNF_RGY_2[1]={0};

    uint8_t PTR_RGY_0 = 0x00;
    uint8_t PTR_RGY_1 = 0x01;
    uint8_t PTR_RGY_2 = 0x02;

    uint8_t CNF_RGY_1 = 0x09;
    uint8_t CNF_RGY_2 = 0x0A;

    uint8_t CONVRATE_RGY = 0x0B;

    uint8_t CNF_RGY_2_SETUP =(0x1F << 2);//(0xF << 2);//激活所有可能的通道+电阻校正使能

    _Bool KS_TLOC = 0;
    _Bool KS_TR1 = 0;
    _Bool KS_TR2 = 0;

    _Bool OK_TLOC = 0;
    _Bool OK_TR1 = 0;
    _Bool OK_TR2 = 0;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sebastian、

    时序设置看起来不错、但如果没有示波器波形、我无法确认所有时序都正确执行。
    对于本地、远程1和远程2温度、您得到的十六进制值是多少? 您的结果是否在当地也是开放的?

    您还可以检查 DXP 引脚、以查看它们是否是不同电流注入的信号。

    您能否向我发送原理图以供参考?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sebastian、

    您在这一问题上是否取得了任何进展?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于不活动而关闭此线程。  如果您需要进一步的帮助、请随时重新打开此帖子或创建新帖子。

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    很抱歉耽误你的回答。

    本地温度的十六进制值为  :0x21 和0x70 => 33.4375°C 如果我尝试稍微加热系统、这些值也会发生变化。  

    远程1温度的十六进制值为:0x23 - 0x24和0x10 - 0xB0。 =>~ 35-37°C 这些值也会随应用的热源而变化。  

    远程2温度的十六进制值为:0x09和0x0A、应为开路。  

    我在3个不同的完全相同的构建板上测试了这些器件、以确保我至少有一个功能传感器。 在所有三块电路板上、远程2温度似乎冻结了。   

    在下面、可以看到原理图:  

    然后、DSP1/2_THD+/-信号直接馈送到相应的 DSP 二极管。 它似乎可以完美地与 DSP1配合使用、但遗憾的是不能与 DSP2配合使用。 DSP2距离 TMP422传感器和 DSP1仅10cm、这是唯一的区别。  

    我不理解您对 DXP 引脚的评论。  

    谢谢、此致

    Sebastian  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还能够直接在相应的 DSP2引脚上测量来自 TMP422的注入信号。 如果我将 DSP 引脚快捷,该值将更改为-64°C,这似乎是正确的。 。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Schoeli、

    您能否给我发送一个 DX3和 DX4引脚的示波器波形?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    下面是 DX3和 DX4的晶圆。 绿色应为 DX3、黄色为 DX4。  

    相比之下、DX1和2可以在下面看到。 我似乎无法发挥作用、而且我还能够直接在相应的 DSP 引脚上测量这些信号。  

    感谢您的帮助和亲切问候

    Sebastian  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sebastian、

    波形应该是可以的。  我对远程2温度读取的值0x09和0x0A 持怀疑态度。 MSB 和0x09以及 LSB 0x0A 吗?  这将指示也将在远程 LSB 上设置的 UVLO。  这些也是 uint8_t CNF_RGY_1 = 0x09和 uint8_t CNF_RGY_2 = 0x0A 的值、但这可能只是巧合。  

    您能否在读取远程2温度时检查 I2C 流量以确保其保持一致 的0x09、0x0A?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    事实上,我认为(并已在前一条消息中说明),它表示 UVLO。 CNF_RGY 的值取自器件的数据表。  
    这些值在0x09、0x0A 之间保持一致。 如果我在 DSP2或 TMP 处将引脚快捷、这些值将更改为数据表中给出的相应短切值。

    唯一可能的解释是、如果 I2C 总线的信号和时序看起来正常、DSP2可能无法正确焊接到焊盘上?  

    此致

    Sebastian  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sebastian、

    您能否在读取远程2温度时检查 I2C 流量?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sebastian、

    您是否有机会读取远程2温度寄存器的 I2C 流量波形?

    谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于不活动而关闭此线程。  如果您需要进一步的帮助、请随时重新打开此帖子或创建新帖子。

    谢谢、

    David