单片机/MCU论坛
直播中

李华瑞

7年用户 902经验值
私信 关注

Psoc6 SPI cyhal库接收数据卡死的原因?如何解决?

1. 使用的是modus开发环境生成的SPI_master测试代码;
2. SPI接收使用下面的代码:
result = cyhal_spi_transfer( sSPI, NULL ,NULL , receive_data ,10u , 0xff);
if (CY_RSLT_SUCCESS != result)
{
handle_error();
}
else
{
printf("receive_1 = %02x %02x %02x %02x %02x %02x %02x %02xrn",
receive_data[0],receive_data[1],receive_data[2],receive_data[3],
receive_data[4],receive_data[5],receive_data[6],receive_data[7]);
}

cyhal_spi_transfer接收的数据长度如果大于实际传过来的长度时,会卡死,使用调试功能,发现卡死在以下位置:
请问,SPI的接收有什么特殊的设置吗?
cy_rslt_t cyhal_spi_transfer(cyhal_spi_t *obj, const uint8_t *tx, size_t tx_length, uint8_t *rx, size_t rx_length, uint8_t write_fill)
{
if (NULL == obj)
return CYHAL_SPI_RSLT_BAD_ARGUMENT;
if (_cyhal_scb_pm_transition_pending())
return CYHAL_SYSPM_RSLT_ERR_PM_PENDING;
obj->write_fill = write_fill;
cy_rslt_t rslt = cyhal_spi_transfer_async(obj, tx, tx_length, rx, rx_length);
if (rslt == CY_RSLT_SUCCESS)
{
卡死在这个while里面
while (obj->pending != _CYHAL_SPI_PENDING_NONE) { } /* Wait for async transfer to complete */
}
obj->write_fill = (uint8_t) CY_SCB_SPI_DEFAULT_TX;
return rslt;
}
                                                                                                                                                                                                                                                                                                                                                                                          

回帖(2)

陶天瑛

2024-2-2 14:19:22
你仔细看下这个接口的参数形式,他是在一个接口里面 完成了收发,而且要你指定收发数据的length,也就是你指定每次的数据包长度,从你的描述里面来看,你收到数据包长度低于你指定的,那他就认为数据没收完,当然会一直在这个函数里面判断什么时候收到完整的数据包。
举报

王莉

2024-2-2 17:19:49
可能导致卡死的原因有以下几种:

1. 数据长度设置错误:cyhal_spi_transfer接收的数据长度必须与实际传输的数据长度相匹配,如果设置的长度大于实际传输的长度,可能会导致卡死。在你的代码中,数据长度设置为10u,如果实际传输的数据长度小于10字节,可能导致卡死。

2. 数据接收缓冲区错误:接收数据的缓冲区必须足够大以容纳实际传输的数据。如果接收数据的缓冲区大小不足以容纳实际传输的数据长度,可能会导致卡死。在你的代码中,接收数据的缓冲区长度应该是8个字节,如果长度设置不正确,可能导致卡死。

解决方法:

1. 确保数据长度设置正确:根据实际传输的数据长度,正确设置cyhal_spi_transfer接收的数据长度。如果不确定实际传输的数据长度,可以通过其他方法进行检测或采取动态分配内存的方式。

2. 确保接收缓冲区大小正确:根据实际传输的数据长度,确保接收数据的缓冲区大小足够大。如果接收数据的缓冲区大小不足,可以调整缓冲区大小或采取动态分配内存的方式。

3. 检查其他部分代码:除了接收数据的代码,还要检查其他代码是否存在问题。例如,是否正确配置了SPI引脚、时钟等。

如果以上方法仍然无法解决问题,建议尝试使用调试工具进行调试,查看具体的卡死原因,并根据具体情况进行排查和修复。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分