硬汉嵌入式论坛

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

RP2040 SPI从机问题

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-6-13 11:27:15 | 显示全部楼层 |阅读模式
最近在用STM32H750和RP2040进行SPI通信测试,发现了部分问题。

SPI作为从机,STM32作为主机,当两者MOSI相连、MISO相连时,两边接收到的数据都为0
当两者MOSI MISO交叉相连时,在SPI速率为6.25MHZ条件下两边可以接收到正确信息(spi16分频)
当stm32端将spi分频设为8分频(12.5MHZ)时,两边能收到数据,但数据不对

查到的资料都是MISO连MISO   MOSI连MOSI,为啥这个不能正常工作,必须得交叉相连才能工作,有没有大神解释一下
还有SPI速率问题,是不是我这些线太乱了导致速度上不去?
IMG_20250613_110546.jpg


下边是连接顺序,RP2040用的SPI0, STM43H750用的SPI2
RP2040                          STM32
  16                                PB15
  17                                PB12
  18                                PB10
  19                                PB14



再放个图,是不是当RP2040作为从机时,TX和RX反过来了?
当RP2040是主机时,GP16为RX,既MISO;  GP19为TX,既MOSI;
当RP2040是从机时,GP16为RX,既MOSI;GP19为TX,既MISO
如果是这样的话,那就可以说得通了,不知道是不是我分析的这样,望大佬解答!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-14 08:21:05 | 显示全部楼层
建议反过来用,RP2040做主机,H7做从机

接线就是MISO接MISO,MOSI接MOSI
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-6-14 12:26:31 | 显示全部楼层
eric2013 发表于 2025-6-14 08:21
建议反过来用,RP2040做主机,H7做从机

接线就是MISO接MISO,MOSI接MOSI

有什么说法吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-14 15:57:41 | 显示全部楼层

我们早期测试过,不太好用,所以改了,不过时间有点久了,不知道新版SDK是否好一些

RP2040 SPI从机模式调不通,官方也没例子, 彻底放弃了
https://forum.anfulai.cn/forum.p ... 1456&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-6-15 17:07:04 | 显示全部楼层
又发现了新问题,RP2040接收到的数据不对,接收数组是从中间开始收的,然后最前边的数据跑到了接收数组最后边,具体代码如下
AXI_SRAM uint8_t SendData[12]={0,1,2,3,4,5,6,7,8,9,10,11};
        RP2040_CS_CLR;
        //while (HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY);
        HAL_SPI_TransmitReceive(&hspi2,SendData,RecevieData,12,HAL_TIMEOUT);
        RP2040_CS_SET;
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-6-15 17:08:45 | 显示全部楼层
        while(gpio_get(PIN_CS));
        //spi_read_blocking(spi0,0,rx_buf,BUF_SIZE);
        spi_write_read_blocking(spi0,cmd_txbuf,cmd_rxbuf,CMD_BUF);
        //spi_write_read_blocking(spi0,sine_wave,rx_buf,NUM_POINTS);
        //spi_write_blocking(spi0,sine_wave,NUM_POINTS);
        while(gpio_get(PIN_CS)==0);

        printf("\n");
    for (int i = 0; i < 12; i++) {
        printf("CMDNum[%d]: %d  ", i, cmd_rxbuf[i]);
        if ((i + 1) % 4 == 0) { // 每 5 个数换行
            printf("\n");
        }

结果却是这样的
CMDNum[0]: 4  CMDNum[1]: 5  CMDNum[2]: 6  CMDNum[3]: 7  
CMDNum[4]: 8  CMDNum[5]: 9  CMDNum[6]: 10  CMDNum[7]: 11  
CMDNum[8]: 0  CMDNum[9]: 1  CMDNum[10]: 2  CMDNum[11]: 3  

回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-6-15 19:54:17 | 显示全部楼层
为什么会发生错位呢,我发送的数据是0 1 2 3 4 5 6 7 8 9

但收到的是这样的


下边是代码


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-16 07:26:39 | 显示全部楼层
开源用户 发表于 2025-6-15 19:54
为什么会发生错位呢,我发送的数据是0 1 2 3 4 5 6 7 8 9

但收到的是这样的

图片没贴上,要单独上传下
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-6-17 22:41:37 | 显示全部楼层
CMDNum[0]: 4  CMDNum[1]: 5  CMDNum[2]: 6  CMDNum[3]: 7  
CMDNum[4]: 8  CMDNum[5]: 9  CMDNum[6]: 10  CMDNum[7]: 11  
CMDNum[8]: 0  CMDNum[9]: 1  CMDNum[10]: 2  CMDNum[11]: 3

结果是这样的,错位了8个数据,我之前测试连续传送1024个数据也这样,不知道是哪出了问题
stm32主机好像也出现了问题,接收的第一个字节是rp2040发送的最后一个字节,然后依次顺延
用的CHOL 0 CPHA 1模式
回复

使用道具 举报

4

主题

81

回帖

93

积分

初级会员

积分
93
发表于 2025-6-18 12:02:59 | 显示全部楼层
2040的SPI SLAVE只能特定的配置才能连续收发
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=123471
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-11 21:25 , Processed in 0.103104 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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