Psoc6 SPI cyhal库接收数据卡死

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lili
Level 1
Level 1
5 sign-ins First question asked Welcome!

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 %02x\r\n",
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;
}

0 点赞
1 解答
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

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

 

zhichao

在原帖中查看解决方案

0 点赞
1 回复
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

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

 

zhichao

0 点赞