spi - STM32F4 SPI接收中断不起作用
问题描述
我正在做一个项目,我使用两个板通过 SPI 进行通信。主板 (TMS320F28377S) 通过 SPI 成功发送数据,我附上了带有 CLK、MOSI 和 SS 引脚的示波器屏幕截图。 主要的数据
现在,我的接收器板在 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);
}
当我从主机进行传输时,我正在观察 rx_buffer 变量并且没有接收到数据,也没有设置 RXNE 标志。
我在这里缺少什么吗?我想要的只是能够使用中断以非阻塞模式在另一个平台上接收数据。另外,我应该将 NSS 引脚物理连接到接收器微上的 I/0 吗?
提前感谢您的帮助。
谢谢你。
吉尔
解决方案
AFAIKHAL_SPI_RxCpltCallback
仅由 DMA 中断触发。您应该尝试更改HAL_SPI_Receive_IT
或HAL_SPI_Receive_DMA
实现HAL_SPI_Receive_IT
xxx_it.c 文件中的处理程序。
从我的角度来看(在这个特定主题上的经验很少......)看起来你正在等待错误的中断。
推荐阅读
- javascript - amcharts V4 在饼图中选择时重定向到 URL
- oauth-2.0 - 使用 Identity Server4 进行 MS Bot 身份验证(通用 oauth2)
- python - PyQt5 在文本编辑中显示函数输出
- java - java.lang.ArrayIndexOutOfBoundsException:索引 5672 超出 Java 11 中长度 247 的范围
- docker - docker-compose.yml nginx 与 php 链接
- visual-studio - 试图从另一个脚本访问变量
- typo3 - 如何设置用于 TCA/Overrides 的配置或如何配置 sys 类别?
- python - 找不到文件或目录,即使它存在
- python - Celery 4.2.1 (windowlicker) 在 Linux 中不抛出异常
- kubernetes - 如何使用基于应用程序名称的单独日志流将 Kubernetes (EKS) 日志推送到 Cloudwatch 日志