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.

[参考译文] TCAN4550-Q1:SPI 读取写入错误且 SPI 停止接收

Guru**** 2535150 points
Other Parts Discussed in Thread: TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/983700/tcan4550-q1-spi-read-write-error-and-spi-stops-receiving

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

您好!

我正在尝试将 TCAN4550 IC 与 STM 控制器连接、这已经成功完成、但当我在2-3个电路板上同时高速传输数据时、 然后、其中一个接收器停止接收(它仍在发送)、因此我检查了寄存器、发现这是 SPI 错误(写入下溢和读取溢出)造成的。

因此、请帮助我解决此 SPI 问题。

SPI 规格:

hspi2.instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.direction = SPI_DIRECT_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8位;
hspi2.Init.CLKPolarity = SPI_POLICY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.nss = SPI_NSS_soft;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMDE_DISABLE;
hspi2.Init.CRCCalcirc= SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 7;
hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATAIZE;
hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;

SPI 通信 API:

void AHB_WRITE_32 (uint16_t 地址、uint32_t 数据)

AHB_WRITE_BURST_START (地址、1);
AHB_WRITE_BURST_WRITE (DATA);
AHB_WRITE_BURST_END ();


void AHB_WRITE_BURST_START (uint16_t 地址、uint8_t 字)

uint8_t txDataTemp[4];
txDataTemp[0]= AHB_WRITE_OCODE;
txDataTemp[1]=((address & 0xFF00)>>8);
txDataTemp[2]=(地址和0x00FF);
txDataTemp[3]=字;

HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_RESET);//芯片选择低电平
Wait_for_idle;
HAL_SPI_transmit (&hspi2、txDataTemp、4、50);
//wait_for_idle;


void AHB_WRITE_BURST_WRITE (uint32_t 数据)

uint8_t txDataTemp[4];
txDataTemp[0]((data & 0xFF000000)>24);
txDataTemp[1]=((data & 0x00FF0000)>16);
txDataTemp[2]=((data & 0x0000FF00)>>8);
txDataTemp[3]=(data & 0x000000FF);
//wait_for_idle;
HAL_SPI_transmit (&hspi2、txDataTemp、4、50);
//wait_for_idle;


void AHB_WRITE_BURST_END (void)

//wait_for_idle;
HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_SET);//芯片选择高电平

uint32_t AHb_read_32 (uint16_t 地址)

uint32_t returnData;

AHB_READ_BURST_START (地址、1);
返回数据= AHB_READ_BURST_READ ();
AHB_READ_BURST_END ();

返回返回数据;

void AHB_READ_BURST_START (uint16_t 地址、uint8_t 字)

uint8_t txDataTemp[4];
txDataTemp[0]= AHB_READ_OCODE;
txDataTemp[1]=((地址和0xFF00)>>8);
txDataTemp[2]=(地址& 0x00FF);
txDataTemp[3]=字;
HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_RESET);//芯片选择低电平
//TCAN_CS_GPIO_Port->BSRR =(uint32_t) TCAN_CS_Pin;
//wait_for_idle;
HAL_SPI_transmit (&hspi2、txDataTemp、4、50);
//wait_for_idle;

uint32_t AHB_READ_BURST_READ (空)

uint8_t rxDataTemp[4];
uint32_t returnData;
//wait_for_idle;
HAL_SPI_Receive (&hspi2、rxDataTemp、4、50);
//wait_for_idle;
返回数据=(((uint32_t) rxDataTemp[0])<< 24)|(((uint32_t) rxDataTemp[1]<< 16)|((((uint32_t) rxDataTemp[2])<< 8)| rxDataTemp[3];
返回返回数据;

void AHB_READ_BURST_END (void)

//wait_for_idle;
HAL_GPIO_WritePin (TCAN_CS_GPIO_Port、TCAN_CS_Pin、GPIO_PIN_SET);//芯片选择高电平

谢谢、此致

Yogesh

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

    您好 Yogesh、

    当 SPI 序列结束时、WRITE 下溢和 READ_OVERflow 标志的数据字节数与标头长度字节中描述的数据字节数不同时、将置位。 如果突发读取/写入操作在事务开始前不知道要接收/发送多少字节、或者在事务开始前未正确更新此字段、这种情况很常见。 这不会损坏任何数据或否定任何写入、仅用于向处理器指示检测到某些差异。 我不认为这会导致接收器无法再将数据中继到控制器的问题。

    您能否更详细地描述停止接收时的器件行为?  

    • SPI 接口是否完全无响应(读取所有0)、或者是看起来停止的 CAN 接收器(例如 RX FIFO 未填充)。
    • 系统在其中一个接收器停止响应之前的运行时间(在双板配置中)是多久? 立即、秒、分钟?
    • 在接收器停止响应后、还设置了哪些其他中断标志? 特别是、状态寄存器('h000C)中是否设置了任何其他标志? 中断寄存器('h0820)中是否设置了任何内容?
    • 当接收器停止响应时、是否可以访问非诊断寄存器('h0800 +)? 检查具有预期已知值的寄存器、例如模式控制('h0800)。  
      • 非诊断寄存器取决于时钟输入。 响应丢失可能表示时钟信号或晶体振荡器出现问题。  
    • 如果可用、请检查模式控制寄存器以确认器件处于正常模式(如果器件仍在发送、我希望出现这种情况)。

    我在上面共享的代码中看不到任何问题。 根据您以前成功连接该器件的事实、连接多个电路板似乎会增加复杂性、从而导致问题。 如果我上面的一个问题没有提到特定的 SPI 或晶体相关问题、您是否能够分享有关测试设置的更多信息? 显示每个电路板如何连接到 MCU 和 CAN 总线的方框图可能就足够了。  

    此致、
    Eric Schott

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

    尊敬的 Eric:

    感谢您的回复、

    该页面正在维护、所以我无法回复。

    [引用 userid="360296" URL"~/support/interface/f/interface-forum/983700/tcan4550-q1-spi-read-write-error-and-spi-stops-receiving/3634550 #3634550"] SPI 接口是否完全无响应(读取所有0),或者它是看起来停止的 CAN 接收器(例如 RX FIFO 未填充)。


    不仅接收停止、卡仍在向其他卡发送消息。

    [引用 userid="360296" URL"~/support/interface/f/interface-forum/983700/tcan4550-q1-spi-read-write-error-and-spi-stops-receiving/3634550 #3634550">系统在其中一个接收器停止响应之前运行了多长时间(采用双板配置)? 立即、秒、分钟?[/报价]


    当我通过每50毫秒发送一条消息(5字节)来开始两个卡之间的通信时(两个卡在同一实例中相互传输)、则其中一个卡在仅接收400-500条消息后仅几分钟内就停止接收。

    [引用 userid="360296" URL"~/support/interface/f/interface-forum/983700/tcan4550-q1-spi-read-write-error-and-spi-stops-receiving/3634550 #3634550">接收器停止响应后还设置了哪些其他中断标志? 特别是、状态寄存器('h000C)中是否设置了任何其他标志? 中断寄存器('h0820)中是否设置了任何内容?


    当接收器工作正常时:

    状态('h000C)- 0x8

    中断('h0820)- 0

    MCAN 中断('h0824)- 10000

    错误计数('h1040)- 0

    当接收器停止响应时:

    状态('h000C)- 0x4000a

    中断('h0820)- 0x8a

    MCAN 中断('h0824)- 0x10105

    错误计数('h1040)- 0

    [引用 userid="360296" URL"~/support/interface/f/interface-forum/983700/tcan4550-q1-spi-read-write-error-and-spi-stops-receiving/3634550 #3634550">接收器停止响应时是否可以访问非诊断寄存器('h0800 +)? 检查具有预期已知值的寄存器、例如模式控制('h0800)。[/quot]


    是的、接收停止时、我能够读取非诊断寄存器。

    模式控制('h0800)- 0x84004a0

    [引用 userid="360296" URL"~/support/interface/f/interface-forum/983700/tcan4550-q1-spi-read-write-error-and-spi-stops-receiving/3634550 #3634550"]如果可用,请检查模式控制寄存器以确认设备处于正常模式(如果仍在传输,我希望出现这种情况)。


    是的、器件处于正常模式、因为位7:6是10 -正常模式

    方框图:

    我使用扁平电缆与穿孔引脚进行通信(无连接器)

    请查看一次诊断寄存器输出、因为我只遇到 SPI 错误。

    谢谢、此致

    Yogesh

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

    您好 Yogesh、

    感谢您的回答和对中断寄存器的读出。  

    TCAN4550似乎报告了两个重要错误。 第一个是 SPI 错误(状态位1+3、中断位3)并且 RX FIFO 0已满(MCAN_INT 位2、中断位1)。 听起来、第二个关于完整 RX FIFO 的错误就是导致器件停止接收的原因。 请确保在每次读取 FIFO 后、MCU 都会清除相应的索引以供重复使用。 可以在 软件用户指南的第4.3.2节中找到正确 RX FIFO 读数的大纲。 SPI 错误可能会导致读取或清除写入失败、从而导致这种情况。 请确保软件定期检查 SPIERR 标志的状态、以确保之前的传输(特别是写入 TCAN4550)成功。 为了进行调试、我建议在写入后检查该寄存器的状态以清除 FIFO 索引、以确保清除成功。 如果不是、则应检查消息的格式以确保使用有效的地址和数据值。  

    希望这些信息能有所帮助。 请告诉我这是否有助于解决问题、或者您是否从后续测试中发现任何问题。

    此致、
    Eric Schott