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

news/2024/10/1 19:25:05

现象: 将外部 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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

(8)ILA介绍

一、ILA简介二、ILA使用 在IP Catalog中选择搜索ila,选择第一个:接下来进行一些参数的配置: 配置好后生成即可: 一般情况下选择额ooc模式,可以节省资源。 在IP Sources中可以看到生成的ila ip核,比较重要的是这个.veo文件,这个相当于是ila的一个例化的模板,将该模板直接…

文件IO笔试题

文件IO 笔试题 作业:设计程序,获取当前系统时间,把时间转换为特定格式”yy年mm月dd日 星期x tt:mm:ss”,并每隔1s写入到本地磁盘中一个叫做log.txt的文本中,如果文本不存在则创建。 代码: /***************************************************************************…

BGP小实验

目录拓扑图环境介绍复盘实验总结配置R3R4R1R2 拓扑图环境介绍每台路由器上都有looback0,比如R4是4.4.4.4/32,直连接口地址为10.1.34.4/24,其他路由器直连和looback口地址类似,R4上还有looback1,地址为44.44.44.44/24。 R3和R4是EBGP邻居关系,AS123内路由器是IBGP邻居关系…

Vue入门到关门之Vue3学习

一、常用API 注意:本文项目均使用脚手架为 Vite 1、setup函数 (1)介绍 如果在项目中使用配置项API,那么写起来就和vue2的写法是一样的;但是如果在项目中写的是组合式API,那么组件中所用到的:数据、方法等等,均要配置在setup中。此外,setup() 钩子也是在组件中使用组合…

sso-单点登录

单点登录 项目组成 基于spring-boot-2.1.8.RELEASE,使用redis完成完成 session记录。sso-basesso-serversso-client1sso-client2 sso-baseTokenFilter: 拦截获取是否登录,并获取登录用户设置到线程变量中TokenUtil:从redis获取指定key判断是否登录,以及登录用户;写入sessi…

Vue入门到关门之Vue2高级用法

一、在vue项目中使用ref属性 ref 属性是 Vue.js 中用于获取对 DOM 元素或组件实例的引用的属性。通过在普通标签上或组件上添加 ref 属性,我们可以在 JavaScript 代码中使用 this.$refs.xxx 来访问对应的 DOM 元素或组件实例。放在普通标签上,通过 this.$refs.名字---》取到的…

Vue入门到关门之Vue3项目创建

一、vue3介绍 1、为什么要学习vue3? vue3的变化: 首先vue3完全兼容vue2,但是vue3不建议用vue2的写法;其次,vue3拥抱TypeScript,之前vue2使用的JavaScript,ts完全兼容js 最后之前学的vue2 是配置项api,而vue3是组合式api optionsAPI(旧) => compositionAPI(新), 效…