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.

[参考译文] TMAG5170-Q1:TMAG5170

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/937812/tmag5170-q1-tmag5170

器件型号:TMAG5170-Q1
主题中讨论的其他器件:TMAG5170ADS1262ADS1220

你(们)好

您是否有一些示例 C 代码来读取/写入 TMAG5170的寄存器?
32位帧不允许使用库 SPI 来使用标准选项。

此致、

亚历山大

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

    亚历山大

    感谢您的提问。  目前我们没有任何可用的源 C 代码。  我们可以在它可用时通知您。  在此之前、请参阅数据表中的格式。

    与该器件通信时的一个注意事项是、默认情况下它需要 CRC。  该器件的 CRC 公式为 X^4+X+1。  起始种子将为0b1111。  

    以下文档确实提供了一些有关 CRC 算法如何工作的详细信息、但请注意、对于所引用的器件、该公式是不同的。

    https://www.ti.com/lit/ug/slau398f/slau398f.pdf?ts=1599237839798&ref_url=https%253A%252F%252Fwww.google.com%252F

    CRC 在通信中提供错误校验、但寄存器0x0F 中有一个选项允许将其禁用。  选择该选项需要写入以下序列:

    通过 SPI 发送的 MSB 到 LSB:x0F000407

    谢谢、

    Scott

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

    您好、Scott。

    感谢你的帮助。 但为什么最后一个数字是7而不是5?

    4^4 + 4 + 1 = 261、261 - 256 = 5

    还是计算 CRC 错误?

    此致、

    亚历山大

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

    我找到了 CRC4-ITU C 实施/https://github.com/mozram/CRC4-ITU/blob/master/crc4_itu.c/、但不确定它是否正确。

    希望看到 TI 的这个功能。

    此致、

    亚历山大

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

    CRC 不是通过减法实现的。  相反、该公式指定了一个二进制模式、该模式将被迭代用于针对其余数据传输执行计算。  在 X^4+X+1的情况下、转换为0b10011。

    具有较长多项式的器件的代码可在此处作为参考:

    https://www.ti.com/lit/an/sbaa456/sbaa456.pdf

    请注意、对于 TMAG5170、CRC 结果的初始值为0b1111。  

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

    好的。

    使用 TMAG5170时 SPI 的模式是什么?

    0、1、2、3?

    我在手册中看不到它。

    2.我 应用了代码

    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    // CRC 生成单元-线性反馈移位寄存器实现
    //(c) Kay Gorontzi,GHSi.de,根据 LGPL 条款分发
    //========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    char * MakeCRC (char * bitstring)
    {
    static char Res[5]; // CRC 结果
     char crc[4];
    int i;
    char DoInvert;
    
    对于(i=0;i<4;++I)、CRC[i]= 0; //计算前初始化
    
    对于(i=0;i 对于(i=0;i<4;++I)、RES[3-i]= CRC[i]? '1':'0';//将二进制转换为 ASCII
    Res[4]= 0; //设置字符串终结
    
    器返回(Res);
    }
    
    
    //简单的测试驱动程序:
    
    #include 
    
    int main()
    {
     char *Data,*result; //声明两个字符串
    
    Data ="1101000101000111";
    结果= MakeCRC (Data); //计算 CRC
    
    printf ("[%s]的 CRC 是[%s]、P=[10011]\n"、数据、结果);
    
    返回(0);
    }
    

    当然还有0b1111

    我看不到 x0F00040中的 CRC"7"

    您 制作了一个新的微电路、模拟 Melexis MLX90395/https://www.melexis.com/en/product/MLX90395/Triaxis-3D-micropower-magnetometer/

    但为什么不给用户提供 C 代码(无 SPI、仅 C 代码)来快速了解您的芯片?
    只需读取和写入寄存器即可。

    自2017年以来、我一直在使用一个优秀的32位 ADS1262、并且没有发现任何问题(有 CRC 作为一个选项)、但这里的困难是不可避免的。

    此致、

    亚历山大

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

    亚历山大

    TMAG5170目前处于早期发布阶段。  支持此器件的材料仍在开发中、但我们已提前将其提供给客户、以便在其最终上市之前对其进行样片和评估。 我们目前正在更新数据表、以提供有关 CRC 实现的更多详细信息。

    该器件的 SPI 模式可通过上面随附的数据表中提供的时序图来确定。  当 CS 驱动为低电平(非反相)时、时钟为低电平、传入数据在上升沿锁存。  这对应于 SPI 模式0。

    查看您的代码时、您似乎需要调整此行

    对于(i=0;i<4;++I)、CRC[i]= 0;//计算前初始化

    到此

    对于(i=0;i<4;++I)、CRC[i]= 1;//计算前初始化

    此外、在运行计算之前、您应该用"0000"填充位字符串的末尾、以将其强制为32位。

    如果我正确遵循了您的代码、我认为您当前从 x0F00040的输入获取 b01011作为输出、但随着 CRC 计算的这些变化、我相信您应该得到 b00111。

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

    Scott、

    再次感谢您的帮助和耐心。

    是的、通过 在 x0F00040中添加"0000"(crcinit、当然是"1111") 、我们最终使用 Gorontzi 博士的函数获得了所需的数字"7"。

    现在、让我们尝试执行一些操作。

     1、读取"寄存器4" 2次(8400000E)。

    一读:       40 7D 83 01

    还不错、PREV_CRC_STAT = 0、ERROR_STAT = 0、 RESET = 0x7D83、 尽管 Gorontzi 博士的 CRC 为"0"、而不是"1"

    二读:   60 7D 83 81

    更糟糕的是 、ERROR_STAT = 1 ("ERROR_STAT 指示器件中是否有任何错误位翻转")。

    您能解释一下这意味着什么("  器件中的错误位翻转")吗?

    --

     2.读取"寄存器4"(8400000E)和 "寄存器0"(8000000F)。

    一读:       40 7D 83 01 (如第一种情况)

    二读:    E0 7D 83 81

    为什么 0x7D83、而不是0x000 (对于 "寄存器0" 复位= 0x0)?

    --

    好 的、让我们尝试禁用 CRC 并读取 "寄存器4"。

    0f 00 04 07         SPI 返回40 00 00 0A (使用 Gorontzi 博士提供的函数 CRC 正常)

    84 00 00 0E         SPI 返回40 00 00 0A

    --

    在发送第一个32位命令 SPI (真正的4x8)后、似乎需要更多的操作。

    我在 mbed OS 中尝试过这些示例、但我认为这不是必要的。

    此致、

    亚历山大

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

    亚历山大

    在您的第二次读取中、我们看到 ERROR_STAT 位变为高电平、ALRT_STATUS1位变为高电平。  ALRT_STATUS 位对应于 CONV_STATUS 寄存器的 D[ 1:0]。  该位表示 SYS 状态错误、该错误可能由 SPI 错误等事件引起。   此外、在第一次读取时、我们已经将 CFG_RESET 位设为高电平。  您似乎通过强制电源电压过低导致了硬件复位。  

    当我尝试使用与使用 EVM 相同的模式时、我看到:

    84 00 00 00 0E、生产00 7d 83 03  

    后跟

    80 00 00 00 0F、生产00 00 00 09  

    我使用逻辑分析仪捕获了两个事件以进行确认。  如果您尚未尝试、我建议您检查 SPI 波形、以确保一切看起来整洁并满足器件的时序要求。  在每种情况下、我为 CRC 手动计算的代码与器件生成的代码相匹配。 我希望您在第一次读取时观察到的错误 CRC 代码与器件报告的 SYS 状态错误相关。

    此外、在您的情况下、当您尝试读取寄存器0时、CRC_ERROR 位将启用。  但是、您的输入命令是正确的。  这也意味着传输可能无法正确接收。

    您还可以尝试读取寄存器0xD 以获取有关 AFE 状态的信息、并读取0xE 以获取有关导致 SYS 错误的原因的更多信息。

    谢谢、

    Scott

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

    您好、Scott。

    我弄清楚问题是什么。

    我之前使用的是 ADS1220和 ADS1262、为此允许将 CS 信号接地。

    对于 TMAG5170、无法实现这一点、该芯片需要强制将 CS 从零切换到一、反之亦然。

    我写入了32位 big-bang (不带 SPI)、现在我可以无误地读取所有寄存器。

    读取寄存器 D 以清除标志 CFG_RESET 需要第一条命令。

    感谢你的帮助。 我学到了一些关于 CRC 的知识,一周以来,我的头脑一直在忙于解决这个问题:)

x 出现错误。请重试或与管理员联系。