当前项目中需要使用到STM32H743和外部SPI FLASH,在评估过程中使用的是正点原子的阿波罗开发板

但是好巧不巧的画原理图和制板的同事在选型的时候虽说保留了QSPI相同的借口,但是芯片改选了W25Q128,(可能是为了成本考虑),但是在实际调试过程中遇到了问题

仍旧使用原子哥的例程,但是写入数据后再读取会出现丢前3字节的情况。上网查了相关资料,发现W25Q256的4字节地址,128是3字节地址,则在w25qxx.c作了如下修改:

//QPI,写扇区擦除指令,地址为0,无数据_24位地址_4线传输地址_4线传输指令,无空周期,0个字节数据
QSPI_Send_CMD(W25X_SectorErase,Dst_Addr,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_24_BITS,QSPI_DATA_NONE);//QPI,页写指令,地址为WriteAddr,4线传输数据_24位地址_4线传输地址_4线传输指令,无空周期,NumByteToWrite个数据
QSPI_Send_CMD(W25X_QuadPageProgram,WriteAddr,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_24_BITS,QSPI_DATA_4_LINES);   //QPI,快速读数据,地址为ReadAddr,4线传输数据_24位地址_4线传输地址_4线传输指令,8空周期,NumByteToRead个数据
QSPI_Send_CMD(W25X_FastReadQual,ReadAddr,8,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_24_BITS,QSPI_DATA_4_LINES);   //SPI,读id,地址为0,单线传输数据_24位地址_单线传输地址_单线传输指令,无空周期,2个字节数据
QSPI_Send_CMD(W25X_ManufactDeviceID,0,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_24_BITS,QSPI_DATA_1_LINE);         

在所有需要配置地址长度的位置都要将 QSPI_ADDRESS_32_BITS -> QSPI_ADDRESS_24_BITS 。

但是还是无法正常工作,于是开始仔细看手册,这个地方我由于自己的疏忽,看错了手册,W25Q128FV和W25Q128JV的手册完全不同,

FV的手册内的指令与256有些相似,例如写入(Page Program (02h))指令,如下:

W25Q128FV和W25Q256的Page Program时序图

W25Q128FV和W25Q256的Page Program时序图

W25Q128FV和W25Q256有两种写入模式,均可以通过02h这条指令发送,1线和4线模式均可使用。

而W25Q128JV与他们的区别就是它的02h指令,仅支持1线模式,而如果想使用4线模式,需要使用Quad Input Page Program (32h)指令,时序图如下:

在时序图中可以看出来,就算是4线模式写入指令,指令和地址也都是单线发送,与W25Q128FV和W25Q256有区别,所以要修改程序:

//QPI,快速读数据,地址为ReadAddr,4线传输数据_24位地址_1线传输地址_1线传输指令,8空周期,NumByteToRead个数据
QSPI_Send_CMD(W25X_FastReadQual,ReadAddr,8,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_24_BITS,QSPI_DATA_4_LINES); //QPI,页写指令,地址为WriteAddr,4线传输数据_24位地址_1线传输地址_1线传输指令,无空周期,NumByteToWrite个数据
QSPI_Send_CMD(W25X_QuadPageProgram,WriteAddr,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_24_BITS,QSPI_DATA_4_LINES); 

所有相关的指令都要一一对着手册改好。

//读取W25QXX的状态寄存器,W25QXX一共有3个状态寄存器
u8 W25QXX_ReadSR(u8 regno)
{  u8 byte=0,command=0; switch(regno){case 1:command=W25X_ReadStatusReg1;    //读状态寄存器1指令break;case 2:command=W25X_ReadStatusReg2;    //读状态寄存器2指令break;case 3:command=W25X_ReadStatusReg3;    //读状态寄存器3指令break;default:command=W25X_ReadStatusReg1;    break;}   QSPI_Send_CMD(command,0,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_1_LINE);                //SPI,写command指令,地址为0,单线传数据_8位地址_无地址_单线传输指令,无空周期,1个字节数据QSPI_Receive(&byte,1);           return byte;
}  

(这里并没有把所有需要修改的位置都列出来)

然后就没问题啦!!!!!

STM32H743使用QSPI驱动W25Q128JV芯片(正点原子例程修改)相关推荐

  1. STM32学习笔记——基于正点原子例程编码器模式小结

    STM32学习笔记--基于正点原子例程编码器模式小结 最近一段时间学习了,STM32f4的编码器功能,经过自己探索和他人的热心帮助,对于编码器模式有了一定了解.STM32f4单片机提供编码器模式,以便 ...

  2. 正点原子linux串口驱动下载,「正点原子Linux连载」第六十三章Linux RS232/485/GPS驱动实验...

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南>关注官方微信号公众号,获取更多资料:正点原子 第六十三章Linux RS232/485/ ...

  3. EEPROM(24C64)的IIC通讯调试记录要点,使正点原子例程兼容性更好

    最近使用了一个24C64,直接力创SMT的,型号是ST的M24C64-RMN6TP,MCU使用的STM32F407ZGT6,直接用的正点原子的例程,然后把宏定义24C02改为24C64,结果发现通讯不 ...

  4. Linux platform 设备驱动实验-基于正点原子IMX6ULL开发板

    我们以前的设备驱动都非常的简单,都是对IO进行最简单的读写操作.像I2C. SPI.LCD 这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的 ...

  5. Linux 设备树下的 platform 驱动实验基于正点原子IMX6ULL开发板

    1 设备树下的 platform 驱动简介 platform 驱动框架分为总线.设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和 ...

  6. 正点原子linux串口驱动下载,【正点原子Linux连载】第二十一章UART串口通信实验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南 (amobbs.com 阿莫电子论坛)...

    示例代码21.3.1 bsp_uart.h文件代码 1  #ifndef _BSP_UART_H 2  #define _BSP_UART_H 3  #include "imx6ul.h&q ...

  7. Linux MISC 驱动实验-基于正点原子IMX6ULL开发板

    misc 的意思是混合.杂项的,因此 MISC 驱动也叫做杂项驱动,也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动.MISC 驱动其实就是最简单的字符设备驱动,通常嵌套在 p ...

  8. 正点原子 例程学习记录 实验四 串口实验

    断断续续地看了一阵子 ,一度被工程下无数的文件劝退,今又看了开发指南,发现其实没有编译的工程包含的文件并不多,绝大部分文件都是编译后才出现的.其中还有很多是系统文件,不需要自己写. 观察还没有编译过的 ...

  9. 正点原子gt9xx系列linux驱动移植

    写这个博客的前景: 正点原子的RGB电容触摸屏触摸芯片系列: 4.3 寸屏  480x272分辨率 使用的触摸芯片是gt9xx系列 4.3寸屏 800x480分辨率 使用的触摸芯片是gt9xx系列 7 ...

最新文章

  1. java webpack web项目_spring + spring mvc + mybatis + react + reflux + webpack Web工程例子
  2. jQuery源码分析-each函数
  3. linux:su认证失败
  4. [FF-A]-01-Introduction
  5. YBTOJ:放置棋子(费用流)
  6. 基于jsf的项目_JSF基于事件的交流:新派方法
  7. Java求出1000内的完数
  8. 爬去图片插件_学不会你打我,一个插件爬取亚马逊数据!
  9. ThreadLocal原理、ThreadLocal内存泄漏
  10. SPSS均值过程分析教程
  11. 基于SSM的网上购物商城管理系统
  12. anki 神级插件 fastWQ 提取本地朗文音频
  13. Rplidar A1/A2使用及Hector_SLAM建图
  14. 互联网日报 | 美团外卖日订单量突破4000万个;《王者荣耀》动画番剧启动;360金融更名为360数科...
  15. mysql in数量限制_SQL语句中in的个数限制为1000
  16. 共阳极八段数码管 c语言显示,八段数码管的编码
  17. linux系统制作qcow2,centos7.6下qcow2镜像制作方法
  18. 计算机密码设置要求包括哪些内容,电脑开机密码设置方法有哪些
  19. Android——一个简单的记账本APP
  20. Oracle/PLSQL存储过程详解

热门文章

  1. RK3399 4G语音通话和短信功能
  2. 基于EasyNVR摄像机网页无插件直播服务二次开发实现H5播放页面的简单集成方案
  3. 大爷的 又被罚款100
  4. jquery js 设置 div 的内容,给 div 添加一个属性
  5. 日加满:践行企业责任 公益暖心之旅
  6. DE、SaDE、JADE、SHADE、L-SHADE算法整理
  7. 做好这三步,你的小程序离“爆款”就不远了
  8. 【python爬虫】懒加载(以站长素材为例)
  9. 如何删除映射网络驱动器
  10. linux安卓开发教程视频教程,陈超 FFMPEG跨平台iOSAndroidLinux高级开发实战视频教程...