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.
您好!
我编写了自己的小代码、将来自 Infineon TLE9869QXA0的 SPI 消息发送 到 TCAN4550。
我想读取一个简单寄存器并发送以下数组:{0x41、0x00、0x00、0x02}。 但作为输出、我始终只获得"0x88、0x00、0x00、0x00"。
我在论坛中查看了、当 CS 在传输过程中变为高电平时、有些人会出现此错误。 但我不是这样、我附上了两张示波器图片、显示了我的问题。 可以帮帮我吗?
非常感谢您的参与。
此致
蒂莫祝福
您好!
问题是您的 SPI 读取事务不完整、并且您在它有机会返回值之前将其终止。 您需要使时钟保持运行、以处理您请求的数据字。 单个寄存器读取需要8个字节。
前4个示例与您所示的一样、除了长度字节、对于单个寄存器读取、该字节将为0x1。
然后接下来的4个字节只是为要返回的数据提供32个时钟周期。 TCAN4550忽略您正在写入的数据、但它要求 SCLK 处于活动状态、以便它可以将数据返回到 MCU。
例如、要读取寄存器0x0000、需要执行以下操作:
1) 将 CS 引脚切换为低电平
2) 同时输出0x41、0x00、0x00、0x01、0x00、 MOSI 上的0x00、0x00、0x00并监控 MISO。 捕获全部8个字节。
3) MISO 上数据的第一个字节是全局状态标志、包含最重要的中断标志、包括前一个事务中可能发生的 SPI 错误。 这是寄存器0x0820[7:0]。 您将其捕获为0x88、表示由于 SPI 错误已设置全局错误和 SPI 错误标志。 您可以丢弃接下来的2个字节、并且要读取的寄存器数据是最后4个字节。
4) 完成所有8个字节后、再次将 CS 引脚切换为高电平以完成传输。
在屏幕截图中、您请求读取2个寄存器的数据值、然后在第一次寄存器读取开始之前终止事务。 TCAN4550会生成 SPI 错误、因为您已告知它返回64位的数据、但并未提供这样做的时钟周期。
我还想澄清长度字段。 这是要读取的数据的"字"数、其中每个字等于4字节或32位数据。 每个寄存器为1个字。 当您写入 MRAM 空间时、您必须一次读取/写入1个字。 TCAN4550实际上会对 CS 引脚再次切换为低电平和高电平之间的时钟周期数进行计数、以确保精确地将32位的倍数作为一种纠错形式。 如果时钟周期太少或太多、则会标记 SPI 错误。 此外、它还验证请求或传输的相同数量的数据与长度字段中的值之间的关系。 如果您请求2个字的数据、它将在数据部分期间等待64个时钟周期、或者它将生成一个 FIFO 上溢或下溢错误、这是一种形式的 SPI 错误。
一次读取/写入 MRAM 数据或寄存器的多个字可以减少配置器件所需的总时间、方法是减少发送带有 R/W 运算代码、地址和长度字段的初始4个字节的次数。
作为最后一个示例、如果您希望在单个事务中读取寄存器0x0000和0x0004、则会输出0x41、0x00、0x00、0x02、0x00、 0x00、0x00、0x00、0x00、0x00、 在 CS 引脚为低电平时、MOSI 线路上为0x00、0x00、两个寄存器值将是 MISO 线路上返回的最后8个字节的数据。
此致、
Jonathan