硬汉嵌入式论坛

 找回密码
 立即注册
查看: 800|回复: 5
收起左侧

[SPI/QSPI] STM32 5个SPI接收5个从机,如何确保接收数据一致?

[复制链接]

6

主题

10

回帖

28

积分

新手上路

积分
28
发表于 2025-1-13 09:44:02 | 显示全部楼层 |阅读模式
STM32 5个SPI接收5个STM32从机,如何确保接收数据缓冲区200个包一致?

目前采用SPI1、SPI2、SPI3、SPI5、SPI6。每个SPI 5Mbits/S,采用SPI+外部中断触发DMA(BDMA)接收数据。
/**
* @brief This function handles EXTI line1 interrupt.
*/
void EXTI1_IRQHandler(void)
{
    /* USER CODE BEGIN EXTI1_IRQn 0 */

    /* USER CODE END EXTI1_IRQn 0 */
    HAL_GPIO_EXTI_IRQHandler(NRDY_CH1_Pin);
    /* USER CODE BEGIN EXTI1_IRQn 1 */
    HAL_GPIO_WritePin(SPI_NCS_CH1_GPIO_Port, SPI_NCS_CH1_Pin, GPIO_PIN_RESET);
    HAL_SPI_Receive_DMA(&hspi1, SpiData1[BufHead1], 200);
    /* USER CODE END EXTI1_IRQn 1 */
}

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
    if (hspi->Instance == SPI1)
    {
        // GPIO 拉高(释放片选信号)
        SPI_NCS_CH1_GPIO_Port->BSRR = SPI_NCS_CH1_Pin;  // 拉高 CH1 片选信号
        SPI_NCS_CH2_GPIO_Port->BSRR = SPI_NCS_CH2_Pin;  // 拉高 CH2 片选信号
        SPI_NCS_CH3_GPIO_Port->BSRR = SPI_NCS_CH3_Pin;  // 拉高 CH3 片选信号
        // 更新标志位,表示通道数据接收完成
        BufHead1 = (BufHead1 + 1) % DBUF_NUM;
    }
    if (hspi->Instance == SPI2)
    {
        SPI_NCS_CH4_GPIO_Port->BSRR = SPI_NCS_CH4_Pin;  // 如果需要可以启用
        SPI_NCS_CH5_GPIO_Port->BSRR = SPI_NCS_CH5_Pin;  // 拉高 CH5 片选信号
        SPI_NCS_CH6_GPIO_Port->BSRR = SPI_NCS_CH6_Pin;  // 拉高 CH6 片选信号
        BufHead4 = (BufHead4 + 1) % DBUF_NUM;
    }
    if (hspi->Instance == SPI3)
    {
        // GPIO 拉高(释放片选信号)
        SPI_NCS_CH7_GPIO_Port->BSRR = SPI_NCS_CH7_Pin;  // 拉高 CH7 片选信号
        SPI_NCS_CH8_GPIO_Port->BSRR = SPI_NCS_CH8_Pin;  // 拉高 CH8 片选信号
        BufHead7 = (BufHead7 + 1) % DBUF_NUM;
    }
    if (hspi->Instance == SPI5)
    {
        // GPIO 拉高(释放片选信号)
        SPI_NCS_CH9_GPIO_Port->BSRR = SPI_NCS_CH9_Pin;  // 拉高 CH9 片选信号
        BufHead9 = (BufHead9 + 1) % DBUF_NUM;
    }
    if (hspi->Instance == SPI6)
    {
        // GPIO 拉高(释放片选信号)
        SPI_NCS_CH10_GPIO_Port->BSRR = SPI_NCS_CH10_Pin;  // 拉高 CH10 片选信号
        BufHead10 = (BufHead10 + 1) % DBUF_NUM;
    }
}





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-13 14:50:01 | 显示全部楼层
没太理解用法,是每个SPI+DMA主机都有一个单独的EXTI外部中断触发吗

但是这个代码好像不是这样的,只有一个EXTI1
回复

使用道具 举报

6

主题

10

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-13 17:05:55 | 显示全部楼层
eric2013 发表于 2025-1-13 14:50
没太理解用法,是每个SPI+DMA主机都有一个单独的EXTI外部中断触发吗

但是这个代码好像不是这样的,只有 ...

是的 ,硬汉哥,每个SPI都有一个单独的READY信号接EXTI外部中断。EXTI0  EXTI1 EXTI3 EXTI4  EXTI5-9  EXTI9-15各接了一个READY信号 代码重复了我就没发上来了
回复

使用道具 举报

6

主题

10

回帖

28

积分

新手上路

积分
28
 楼主| 发表于 2025-1-13 17:10:22 | 显示全部楼层
eric2013 发表于 2025-1-13 14:50
没太理解用法,是每个SPI+DMA主机都有一个单独的EXTI外部中断触发吗

但是这个代码好像不是这样的,只有 ...

Received data1:
1B 39 22 F8
1B 39 23 F8
1B 39 24 F8
1B 39 25 F8
1B 39 26 F8
1B 39 27 F8
1B 39 28 F8
1B 39 29 F8
1B 39 2A F8
1B 39 2B F8
1B 39 2C F8
1B 39 2D F8
1B 39 2E F8
1B 39 2F F8
1B 39 30 F8
1B 39 31 F8
1B 39 32 F8
1B 39 33 F8
1B 39 34 F8
1B 39 35 F8
1B 39 36 F8
1B 39 37 F8
1B 39 38 DE
1C 3A 00 F8
1C 3A 01 F8
1C 3A 02 F8
...
Received data4:
1C 3A 01 F8
1C 3A 02 F8
1C 3A 03 F8
1C 3A 04 F8
1C 3A 05 F8
1C 3A 06 F8
...

Received data10:
1E 39 24 F8
1E 39 25 F8
1E 39 26 F8
1E 39 27 F8
1E 39 28 F8
1E 39 29 F8
1E 39 2A F8
1E 39 2B F8
1E 39 2C F8
1E 39 2D F8
1E 39 2E F8
1E 39 2F F8
1E 39 30 F8
1E 39 31 F8
1E 39 32 F8
1E 39 33 F8
1E 39 34 F8
1E 39 35 F8
1E 39 36 F8
1E 39 37 F8
1E 39 38 E5
1C 3A 01 F8
1C 3A 02 F8
1C 3A 03 F8
1C 3A 04 F8
..  打印的数据片段排序有些乱,并且数据丢了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-1-14 08:57:50 | 显示全部楼层
沉思静学 发表于 2025-1-13 17:10
Received data1:
1B 39 22 F8
1B 39 23 F8

这个地方我明白了,然后你这里接收的数据包是一个吗。

然后你说的”确保接收数据缓冲区200个包一致“ 这个怎么理解,是5个SPI主机读5个从机的数据都是一样的,读取回来后,看看是否一致?
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2025-1-14 10:20:44 | 显示全部楼层
从硬件片选 ,不要用软件片选
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 06:36 , Processed in 0.051287 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表