首页 > 其他分享 >stm32 将外部 Flash挂载在 SPI 出现数据传输时好时不好的排查过程

stm32 将外部 Flash挂载在 SPI 出现数据传输时好时不好的排查过程

时间:2024-05-09 21:55:09浏览次数:30  
标签:rt 引脚 Flash stm32 SPI device spi data

现象: 将外部 Flash 挂载在 SPI,在 hardware_init() -> read_jedec_id() 里的 result = spi->wr(spi, cmd_data, sizeof(cmd_data), recv_data, sizeof(recv_data)) 中, recv_data 的值经常不一致,result 的值偶尔为 SFUD_SUCCESS, 大部分会 Error。

备注: 正常情况下,recv_data 的值为 [0x68, 0x40, 0x15]

原因: 由于当初我是以 GY 的移植版本为模板进行移植的,有些函数我是直接拷贝过来。问题在于,我用的 RTT 版本与 GY 的版本不一致,我的是 RTT 5.X,GY 的是 4.X。这两个版本在 rt_hw_spi_device_attach() 的参数设置上发生了变动。我当初发现参数个数不一致,就只是简单地删掉一参数。

两种版本的接口对比:

// RTT 4.X
rt_err_t rt_hw_spi_device_attach(struct rt_spi_device *device, const char *name,
 const char *bus_name, void *user_data);

// RTT 5.X
rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, rt_base_t cs_pin);

解决办法: 将如下语句进行替换:

//if(rt_hw_spi_device_attach(SPI_BUD_NAME, SPI_DEVICE_NAME, GPIO_PIN_12) != RT_EOK)
if(rt_hw_spi_device_attach(SPI_BUD_NAME, SPI_DEVICE_NAME, 0x1C) != RT_EOK)

排查思路记录:
1)首先排查数据与预期不一致在哪个环节。使用示波器,发现示波器的数据显示跟 IDE 的数据显示一致。即 IDE 的数据为总线实时数据。
2)由 1)可以知道,SPI 的输入输出引脚 MOSI 与 MISO 均无问题。SPI 总共就 4 个引脚,还有 CS 引脚 跟 SCK 始终引脚。时钟引脚关系与 Read、Write 关系不大,定位是 CS 引脚不一致的问题。
3)看原理图,SPI CS 引脚 挂载在开发版的 PB12 引脚上。我们看到 rt_hw_spi_device_attach() 的第 5 个参数即是 CS 引脚的地址。
4)如何确定 PB12 的地址是个问题。Finsh 有 Pin 的相关命令。在 Finsh 里输入 pin 命令,会出现帮助文档。我们在工程文件夹下搜索文档内的几个功能语句,如 pin num,发现 pin 命令调用的实现都在 pin.c 文件,里面有命令对应的代码及注释。阅读文件,我们知道,可以通过 Finsh 命令 pin num PB.12 获取 PB12 的地址,值为 28,对应的十进制地址为 0x1C

备注:其中要看 stm32f411 的数据手册、W25Q16 的数据手册(其中重要的是 8.3.12)、原理图。要看懂 drv_spi.c,drv_gpio.c 跟 引脚交互的逻辑。

示波器调试总结
1)我们知道是在 read_jedec_id() 出了问题。在 W25Q16 的数据手册查关键字 JEDEC ID相关信息。文字描述道第一个字节是 instruction data,在调试中,发现变量 cmd_data 确实是 9Fh;后面的 3 个字节对应 recv_data, 在调试中,发现变量 recv_data 确实有 3 个元素。

同时,文字也说到,指令是 CS 的下降沿引起的。我们在排查问题的时候,也可以直接怀疑是 CS pin 的值不对。

在这里插入图片描述

  1. 对应 8.3.12 Read JEDEC ID(9F)。我们在用示波器调试的时候,要清楚开始采样的点是在哪里。然后才知道哪里对应 DI 的 Instruction 部分,哪里对应 DO 的 Manufacture ID。反正这里 4 根线的信号都非常重要。

了解 SPI 的 4 种传输模式:https://www.cnblogs.com/gmpy/p/12461461.html
在这里插入图片描述

标签:rt,引脚,Flash,stm32,SPI,device,spi,data
From: https://www.cnblogs.com/MasterBean/p/18183148

相关文章

  • STM32堆和栈(Heap & Stack)及SRAM存储使用
    编译一个程序,出现下面的信息:明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间。让我们打开map文件:可以看到每个文件所使用的SRAM大小,比如delay文件使用了4个字节,地址从0x20000014到0x20000017。其中可以看到HEAP和STACK......
  • stm32-arduino压力薄膜传感器读取
     https://item.taobao.com/item.htm?id=674959275850&skuId=5150222163940&spm=a1z0d.6639537/tb2.1997196601.3.43b97484vSZsIQ      #include<Arduino.h>#defineDEBUGSerialSerialintsensorPin=A0; //定义传感器的引脚//下面4项内容需要根据实......
  • STM32F1和STM32F4系列DMA的不同之处——对STM32的DMA的工作机制的一些理解
    喜欢用STM32的DMA功能。一方面STM32的DMA和MPU的DMA一样,可以提高数据传输效率。另一方面,作为一种MCU上的DMA,它可以提高针对外设(peripheral)的数据传输的实时性,改变了传统MCU只能用定时中断实现实时控制的方法。比较STM32F4和STM32F1系列的DMA控制器,可以发现区别主要有三:1)增加了DMA......
  • 【专题STM32F03】 使用 STM32Cube\Repository\STM32Cube_FW_F1_V1.8.5 中例程由ST77
    1)修改Project\STM32Cube_FW_F1_V1.8.5\Projects\STM32F103RB-Nucleo\Demonstrations\Adafruit_LCD_1_8_SD_Joystick2)接线(见stm32f1xx_nucleo.h)LCD_LED_PIN接高电平LCD_CS_PIN  接PB6LCD_DC_PIN  接PA9LCD_SPI_CLK  接SPI1,PA5LCD_SPI_SDA  接SPI1,PA73)修......
  • SPI协议
    CPOL就是决定SCLK这个时钟信号线,在没有数据传输的时候的电平状态。CPOL=0:空闲状态时,SCLK保持低电平CPOL=1:空闲状态时,SCLK保持高电平 CPHA就是决定数据位传输是从第一个时钟(SCLK)边沿开始,还是第二个从二个时钟(SCLK)边沿开始。CPHA=0:数据从第一个时钟(SLCK)边沿开......
  • stm32f103c8t6的freemodbus移植
    注意:demo.c不要加入到程序中来。1在main.h文件中加入#include"stm32f1xx_hal.h"文件也可以不加a:每次重新生成程序时在主程序main.c中注释掉//MX_USART2_UART_Init();函数,因为在freemodbus中已经调用了该函......
  • 自旋锁spinlock的实现
    自旋锁,顾名思义:自己在原地打转,等待资源可用,一旦可用就上锁霸占它。问题来了,假设别人已经上锁了,你原地打转会占住CPU资源了,别的程序怎么运行?它没有CPU怎么解锁?这个问题,有2个答案:①原地打转的是CPUx,以后CPUy会解锁:这涉及多个CPU,适用于SMP系统;②对于单CPU系统,自旋锁的“自旋......
  • AppSpider Pro 7.5.009 for Windows - Web 应用程序安全测试
    AppSpiderPro7.5.009forWindows-Web应用程序安全测试Rapid7DynamicApplicationSecurityTesting(DAST)请访问原文链接:https://sysin.org/blog/appspider/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgappspider没有任何应用程序未经测试,没有未知风险......
  • stm32开发笔记
    GPIO全名为GeneralPurposeInputOutput,即通用输入输出。有时候简称为“IO口”。通用,说明它是常见的。输入输出,就是说既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚。输入模式和输出模式是GPIO的基本特性,当然GPIO还有其它模式可选。(一)模式汇总输入模式:l......
  • 关于stm32F103ZET6移植到stm32F103C8T6的步骤
    在一次代码移植过程中,突然发现代码移植后不可以使用,代码是stm32f103zet6的代码,刚好当时我使用的是C8T6的芯片我进行移植到C8T6芯片时,代码报错"Error:FlashDownloadfailed-"Cortex_M3"这种报错。当时直接懵逼了。想了半天没有想到原因,我就在想不都是F103系列的代码吗为啥子不可......