
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和串口
请问下这个情况是什么原因,我该怎么解决 最后解决办法: 用了硬件NSS,正常了, 应该是我软件nss没解决好,就不搞软件nss了 |
STM32CubeProgrammer 安装错误,请帮忙解决,谢谢
STM32CubeMX 配置STM32G070RBT6TR时无法使能PVD中断
STM32G070RBT6TR STM32CubeMX ADC配置后使用的是内部参考电压且零点的读数太大了
测评在哪里发?
Group Study vs. Solo Study: What Works Best?
STM32G070CBT6使用硬件SPI无法读出W25Q128的ID
STM32G0B0CET6的usb的时钟只能用48MHz的晶振来实现吗?
STM32G070RET6,中断优先级配置没有效果
如图:STM32F437的TIM10支持从模式吗?
STM32G070 UART串口,低波特率传送数据时,TIMER出现严重延时现象,如何解决?
STM32的SPI外设的DR寄存器是移位寄存器,也就是来一个时钟沿一位位移进去的,说明初始化SPI后,正好处于ESP32的发送SPI的流程中,从中间某个clk的数据开始移位的,那当然是都错乱了。
看来你和esp32就用spi通信了,如果有其他方式,io或者串口什么的可以做个协议,初始化完成后esp32再进行发送,如果是整机同时上电,esp32你先延时一会是最简单的方案。
其他建议:
基本上认同一楼的说法。你可以用逻辑分析仪看一下重启过程的详细情况。理论上ESP32重启的话,NSS引脚会被拉高,本次通讯会停止,你的STM32那一侧应该会有错误信息。但是NSS引脚如果没有被拉高呐?本次通讯就会和下次混在一起。这是我的分析。不知道你那边有没有逻辑分析仪,看一下波形
[md]stm32作为从机一直不重启, 主机重启才会接收错误,所以从机已经是初始化完毕了, 我听了你的建议,因为没用DMA,就在cs高时候关闭中断,mstr置1再0,然后在cs低的时候才开启, 但是在主机重启后依然会接收错误
[md]在寄存器置1置0后直接使能中断,不要在cs拉低后去做
也就是逻辑上满足握手条件才可以,避免中间过程重启。
[md]我用的软件nss, 用逻辑分析仪看过,波形也没问题,有点纳闷, 就是它会一直错下去
调试过了发现mstr有确实地先1后0, 然后之前中断也关了再开什么的, 依然是会错位
同步是没问题, 但是主机一重启从机就接收移位我是难以接收, 我是很纳闷为什么会发生这种事
重启的波形有没有,能否展示一下那个片段?
[quote][size=2][color=#999999]Day 发表于 2023-12-9 20:02[/color][/size]