你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32g070cbt6作为spi从机时候接收的数据会随机移位

[复制链接]
Day 提问时间:2023-12-7 23:48 / 未解决

SPI主机使用的是esp32-s3, SPI从机使用的是stm32g070cbt6,

SPI参数: cpol:low cpha:1 edge 频率:从5M-100K均试过,4线连接 miso mosi sck cs

问题详情:

正常esp32先启动,stm32后启动时,正常工作,stm32收发正常, 但当esp32单独重启时,stm32收到的数据就错误了,只有重启stm32后才能正常.

正常时候, 主机发送0xAD stm32收到0xAD

ESP32主机重启后, stm32从机接收的所有数据就固定移位x位了(每次esp32重启该x都会变),如发AD, 收到5B

stm32重启后, 正常了,esp32发送0xAD, stm32收到0xAD

示波器一直在测得esp32发送的数据没有错, 调试中看到SPI寄存器DR收到的确实是错误的数据

stm32也是新建工程,只使能了spi slave和串口

void SPI1_IRQHandler(void)
{
  /* USER CODE BEGIN SPI1_IRQn 0 */
    if (LL_SPI_IsActiveFlag_RXNE(SPI1))
    {
        /* Call function Slave Reception Callback */
        SPI1_Rx_Callback();
    }
}

void SPI1_Rx_Callback(){
    uint8_t rx = LL_SPI_ReceiveData8(SPI1);
    osMessagePut(myQueueSPIRxHandle,rx,0);
}

image.png

请问下这个情况是什么原因,我该怎么解决

最后解决办法: 用了硬件NSS,正常了, 应该是我软件nss没解决好,就不搞软件nss了

收藏 评论11 发布时间:2023-12-7 23:48

举报

11个回答
传说中的路过 回答时间:2023-12-8 09:54:47

STM32的SPI外设的DR寄存器是移位寄存器,也就是来一个时钟沿一位位移进去的,说明初始化SPI后,正好处于ESP32的发送SPI的流程中,从中间某个clk的数据开始移位的,那当然是都错乱了。

看来你和esp32就用spi通信了,如果有其他方式,io或者串口什么的可以做个协议,初始化完成后esp32再进行发送,如果是整机同时上电,esp32你先延时一会是最简单的方案。

其他建议:

  1. 可以在消息错乱后,在没有SPI消息传输的时候,如果有DMA就关闭DMA,之后对SPI的CR寄存器的MSTR位置1再置0,之后有DMA的话在重启DMA,你再试试。
watershade 回答时间:2023-12-8 11:50:32

基本上认同一楼的说法。你可以用逻辑分析仪看一下重启过程的详细情况。理论上ESP32重启的话,NSS引脚会被拉高,本次通讯会停止,你的STM32那一侧应该会有错误信息。但是NSS引脚如果没有被拉高呐?本次通讯就会和下次混在一起。这是我的分析。不知道你那边有没有逻辑分析仪,看一下波形

xmshao 回答时间:2023-12-8 14:05:26
硬件上尽量不要通过飞线方式,SPI对时钟比较敏感,尤其通信速率较高时。另外,不管你现在复位哪边,要保证发送时接收方是READY就绪状态,而不是没准备好或在接收处理的半路上。
Day 回答时间:2023-12-8 15:53:31

传说中的路过 发表于 2023-12-8 09:54
STM32的SPI外设的DR寄存器是移位寄存器,也就是来一个时钟沿一位位移进去的,说明初始化SPI后,正好处 ...

[md]stm32作为从机一直不重启, 主机重启才会接收错误,所以从机已经是初始化完毕了, 我听了你的建议,因为没用DMA,就在cs高时候关闭中断,mstr置1再0,然后在cs低的时候才开启, 但是在主机重启后依然会接收错误

传说中的路过 回答时间:2023-12-8 15:59:41

Day 发表于 2023-12-8 15:53
stm32作为从机一直不重启, 主机重启才会接收错误,所以从机已经是初始化完毕了, 我听了你的建议,因为 ...

[md]在寄存器置1置0后直接使能中断,不要在cs拉低后去做

butterflyspring 回答时间:2023-12-8 17:20:39
简单将,主机和从机要同步。

也就是逻辑上满足握手条件才可以,避免中间过程重启。
Day 回答时间:2023-12-9 20:00:36

watershade 发表于 2023-12-8 11:50
基本上认同一楼的说法。你可以用逻辑分析仪看一下重启过程的详细情况。理论上ESP32重启的话,NSS引脚会 ...

[md]我用的软件nss, 用逻辑分析仪看过,波形也没问题,有点纳闷, 就是它会一直错下去

Day 回答时间:2023-12-9 20:02:20

传说中的路过 发表于 2023-12-8 15:59
在寄存器置1置0后直接使能中断,不要在cs拉低后去做


void SPI1_Cs_Callback(uint8_t isLow){
    if(isLow == 1){
        //低电平

    }else{
        if(!LL_SPI_IsEnabled(SPI1))
            return;
        LL_GPIO_TogglePin(GPIOC, LL_GPIO_PIN_13);
        LL_SPI_Disable(SPI1);
        SPI1->CR1 = ((SPI1->CR1) | (SPI_CR1_MSTR)  );
//        __IO uint32_t tmpreg;
//        tmpreg = SPI1->DR;
//        (void ) tmpreg;
//        tmpreg = SPI1->DR;
//        (void ) tmpreg;
        SPI1->CR1 = ((SPI1->CR1) & (~(SPI_CR1_MSTR))  );
        LL_SPI_Enable(SPI1);
    }
}

调试过了发现mstr有确实地先1后0, 然后之前中断也关了再开什么的, 依然是会错位

Day 回答时间:2023-12-9 20:04:40

butterflyspring 发表于 2023-12-8 17:20
简单将,主机和从机要同步。 </p>
<p>也就是逻辑上满足握手条件才可以,避免中间过程重启。

同步是没问题, 但是主机一重启从机就接收移位我是难以接收, 我是很纳闷为什么会发生这种事

watershade 回答时间:2023-12-10 17:07:19

Day 发表于 2023-12-9 20:04
同步是没问题, 但是主机一重启从机就接收移位我是难以接收, 我是很纳闷为什么会发生这种事
...

重启的波形有没有,能否展示一下那个片段?

传说中的路过 回答时间:2023-12-11 14:35:39

[quote][size=2][color=#999999]Day 发表于 2023-12-9 20:02[/color][/size]

void SPI1_Cs_Callback(uint8_t isLow){
    if(isLow == 1){
        //低电平

    }else{
        if(!LL_SPI_IsEnabled(SPI1))
            return;
        LL_GPIO_TogglePin(GPIOC, LL_GPIO_PIN_13);

        //增加关闭RCC 对SPI1的使能
        LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_SPI1);

        LL_SPI_Disable(SPI1);
        SPI1->CR1 = ((SPI1->CR1) | (SPI_CR1_MSTR)  );

        SPI1->CR1 = ((SPI1->CR1) & (~(SPI_CR1_MSTR))  );

        //增加开启RCC 对SPI1的使能
        LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);

        LL_SPI_Enable(SPI1);
    }
}

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版