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.
https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/937812/tmag5170-q1-tmag5170
器件型号:TMAG5170-Q1你(们)好
您是否有一些示例 C 代码来读取/写入 TMAG5170的寄存器?
32位帧不允许使用库 SPI 来使用标准选项。
此致、
亚历山大
亚历山大
感谢您的提问。 目前我们没有任何可用的源 C 代码。 我们可以在它可用时通知您。 在此之前、请参阅数据表中的格式。
与该器件通信时的一个注意事项是、默认情况下它需要 CRC。 该器件的 CRC 公式为 X^4+X+1。 起始种子将为0b1111。
以下文档确实提供了一些有关 CRC 算法如何工作的详细信息、但请注意、对于所引用的器件、该公式是不同的。
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 的知识,一周以来,我的头脑一直在忙于解决这个问题:)