【问题标题】:STM32F4 SPI Receive interrupt not workingSTM32F4 SPI接收中断不起作用
【发布时间】:2021-05-02 16:37:58
【问题描述】:

我正在做一个项目,我使用两个板通过 SPI 进行通信。主板 (TMS320F28377S) 通过 SPI 成功发送数据,我附上了带有 CLK、MOSI 和 SS 引脚的示波器屏幕截图。 master data

现在,我的接收器板在 STM32F439 处理器上运行,我对这款微机比较陌生。我使用 CubeMX 将其配置为仅接收器,其余设置如下所示,

hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_SLAVE;
hspi2.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; 
hspi2.Init.NSS = SPI_NSS_HARD_INPUT; //??
//hspi2.Init.NSS = SPI_NSS_SOFT; 
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;

从示波器上可以看出,两块板的 CPHA 和 CPOL 设置都匹配(空闲时为低时钟,前沿采样)。

一旦代码准备好接收,我会调用以下代码,

if(HAL_SPI_Receive_IT(&hspi2, (uint8_t *)GEU_RX_Buffer, 2) != HAL_OK)
{
    Error_Handler();    
}
                
while(1){}

我在中放置断点,设置变量并再次调用接收中断

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
    Sys_Mode = DIAGNOSTIC_MODE;

    // Trigger interrupt again to keep receiving datas
    HAL_SPI_Receive_IT(&hspi2, (uint8_t *)rx_buffer, 2);
}

当我从 master 进行传输时,我正在观察 rx_buffer 变量并且没有接收到数据,也没有设置 RXNE 标志。

这里有什么我遗漏的吗?我想要的只是能够使用中断以非阻塞模式在另一个平台上接收数据。另外,我是否应该将 NSS 引脚物理连接到接收器微控制器上的 I/0?

提前感谢您的帮助。

谢谢。

吉尔

【问题讨论】:

    标签: spi stm32f4


    【解决方案1】:

    AFAIK HAL_SPI_RxCpltCallback 仅由 DMA 中断触发。您应该尝试将HAL_SPI_Receive_IT 更改为HAL_SPI_Receive_DMA 或在xxx_it.c 文件中实现HAL_SPI_Receive_IT 的处理程序。

    从我的角度来看(在这个特定主题上的经验很少......)看起来你在等待错误的中断。

    【讨论】:

    • 我意识到我的定制硬件上的 NSS 引脚被拔错了。谢谢!最好的,吉尔
    猜你喜欢
    • 2019-04-25
    • 2016-03-03
    • 2016-04-18
    • 2017-07-05
    • 1970-01-01
    • 2017-07-10
    • 2022-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多