目录

1、参考网上的程序编写SPI读写函数

2、参考w25q32的例程读取芯片ID

3、读取芯片ID时遇到的问题

问题1:没有返回数据

问题2:返回芯片ID错误

4、优化后的收发函数和时序波形


1、参考网上的程序编写SPI读写函数

w25q32可使用spi模式0和模式3.

 u8 redata;u8 SPI_FLASH_SendByte(u8 data)
{u8 i;u16 j=0;redata = 0;for(i=0;i<8;i++){
//      for(j=0;j<12;j++)
//          __nop();if(data & 0x80)SPI_MOSI_1;elseSPI_MOSI_0;data <<= 1;SPI_SCK_0;for(j=0;j<12;j++)__nop();    SPI_SCK_1;for(j=0;j<8;j++)__nop();redata<<=1;if(SPI_MISO)redata++;}for(j=0;j<20;j++)__nop();SPI_SCK_1;return redata;
}

2、参考w25q32的例程读取芯片ID

///*******************************************************************************
//* Function Name  : SPI_FLASH_ReadID
//* Description    : Reads FLASH identification.
//* Input          : None
//* Output         : None
//* Return         : FLASH identification
//*******************************************************************************/
u32 SPI_FLASH_ReadDeviceID(void)
{u32 Temp = 0;//   /* Select the FLASH: Chip Select low */
//  SPI_FLASH_CS_LOW();//   /* Send "RDID " instruction */SPI_FLASH_SendByte(W25X_DeviceID);
//  SPI_FLASH_SendByte(W25X_DeviceID);
//  SPI_FLASH_SendByte(Dummy_Byte);
//  SPI_FLASH_SendByte(Dummy_Byte);
//  SPI_FLASH_SendByte(Dummy_Byte);//   /* Read a byte from the FLASH */
//  Temp = SPI_FLASH_SendByte(Dummy_Byte);//   /* Deselect the FLASH: Chip Select high */
//  SPI_FLASH_CS_HIGH();//  return Temp;u16 j=0;/* Select the FLASH: Chip Select low */SPI_FLASH_CS_LOW();for(j=0;j<100;j++)__nop();
//  __nop();/* Send "RDID " instruction */
//  SPI_FLASH_SendByte(W25X_DeviceID);SPI_FLASH_SendByte(0x90);
//  __nop();SPI_FLASH_SendByte(0x00);
//  __nop();SPI_FLASH_SendByte(0x00);
//  __nop();SPI_FLASH_SendByte(0x00);
//  __nop();/* Read a byte from the FLASH */Temp |= SPI_FLASH_SendByte(0xFF);Temp = Temp<<8;
//  __nop();Temp |= SPI_FLASH_SendByte(0xFF);/* Deselect the FLASH: Chip Select high */
//  for(j=0;j<100;j++)
//          __nop();SPI_FLASH_CS_HIGH();return Temp;
}

3、读取芯片ID时遇到的问题

问题1:没有返回数据

排查是解析错误。

问题2:返回芯片ID错误

芯片ID应该是0xEF15,结果返回的是0xDC1D,然后是0xEE1E。

首先是怀疑各种延时不对,然后怀疑各种空闲时的电平不对,一通调整,还是不对。

然后使用st开发板上的硬件spi读取,发现读取到的ID是对的,可以证明模块没有问题。

然后使用逻辑分析仪对比两个板子上的波形:

错误数据的波形:

正确数据的波形:

对比后发现时序也没有问题,然后怀疑是不是spi速率的问题,之后将spi的速率调整为和开发板的一样,还是不行,然后换衣是不是在下降沿之后写入数据太晚了,调整为在下降沿之前写入数据,发现还是不行。。。。。。

最后发现是IO的速率设置的太低了,因为是使用cubemx生成的配置程序,没有注意IO里面的速率设置:

然后把所有的io都设置为高速率就可以了。

单个IO设置为高速率测试发现:只要MOSI引脚设置为高速率就行,那么推测可能的原因是在MOSI引脚跳变时间较长,导致从设备采集到错误的电平,虽然逻辑分析仪看到的是对的,这种情况在示波器上应该是可以观测到的,但是没有好用的示波器。。。。。。

4、优化后的收发函数和时序波形

u8 SPI_FLASH_SendByte(u8 data)
{u8 i = 0, redata = 0;for(i=0;i<8;i++){SPI_SCK_0;   // Falling edge to write the sent dataif(data & 0x80)SPI_MOSI_1;elseSPI_MOSI_0;data <<= 1;   SPI_SCK_1;  // Rising edge, reading dataredata<<=1;      if(SPI_MISO)redata++;}__nop();return redata;
}

时序简言之:在时钟下降沿的时候将数据写入数据线,在时钟上升沿的时候会去采集数据线上的数据。

STM32普通IO模拟SPI和W25Q32通信调试相关推荐

  1. STM32任意IO模拟8080时序驱动TFTLCD屏

    本篇硬件平台STM32F103ZET6.TFTLCD屏采用2.8寸.320*240分辨率.16bitRGB.37pin.ILI9341驱动. 本来准备使用STM32F429平台的,因为它有LTDC,顺 ...

  2. stm32使用gpio模拟spi

    本文介绍如何使用STM32标准外设库的GPIO端口模拟SPI,本例程使用PA5.PA6和PA7模拟一路SPI.SPI有4种工作模式,模拟SPI使用模式0,即空闲时SCK为低电平,在奇数边沿采样. 本文 ...

  3. 晶联讯12864液晶+STM32+HAL库 IO模拟SPI成功实现显示。

    液晶型号:JLX12864G-290-PN不带字库 芯片型号:STM32F030F4 SPI连接方式:IO口模拟 STM32CubeMX  中引脚设置 JLX12864G_290_PN.h文件 #if ...

  4. 利用C51单片机模拟SPI进行双机通信

    SPI协议简述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.由Motorola首创.SPI接口主要应用在 EEPROM,FLASH,实时时 ...

  5. 模拟SPI实现和调试流程

    一般来说,所有的spi通信设备都可以使用模拟spi来实现,而且模拟spi的好处就是不需要针对每一款mcu去重新熟悉其spi控制器的配置,只要简单配置一下spi_clk.spi_cs.spi_mosi. ...

  6. 51单片机IO模拟UART

    一. IO模拟UART发送 串口通信属于 串行 异步 半双工的通信模式 1. 最近在调试一个IO模拟UART的程序,把调试过程中遇到的问题总结一下.对于UART的发送部分(主机模式)还是比较容易实现的 ...

  7. STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码

    STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 因为芯片的spi口只有3个,有部分需要外接W25Q128 ...

  8. STM32通信模拟SPI

    21.1 关于 SPI 21.1.1 SPI 协议 SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在1980前后提出的一种全双工同步串行 ...

  9. 关于stm32通信协议:软件模拟SPI、软件模拟I2C的总结(fishing_8)

    趁着帮老师代上嵌入式实验课的机会,又重新熟悉了一遍stm32的通信协议:串口协议.SPI协议.I2C协议.RS485协议.大概半年前,是过了一遍的,但也只停留于读了遍代码,跑了下例程,最近又过了一遍( ...

最新文章

  1. LeetCode 421. Maximum XOR of Two Numbers in an Array--Python解法
  2. Linux系统下手把手完成无人值守安装服务
  3. leetcode 109 --- 有序链表变成二叉搜索树
  4. Visual Studio 2017版本15.9现在可用
  5. 上传文件到ftp服务器
  6. mongodb更新操作符$min,$max
  7. Android自定义View之上拉、下拉列表 头部元素跟随 缩放、平移效果的实现
  8. php如何只删去汉字,php如何删除字符串中的中文
  9. Python的类与对象
  10. 设计模式之一(单例模式)
  11. 2022 年最佳 15 款网络监控工具
  12. 蓝蓝设计 扁平化界面风格的设计
  13. Android7.0 MTK 需求文档(一)
  14. 房东拿租金去还房贷是天经地义的嘛
  15. gitee码云安装和使用教程
  16. 计算机网络的分类1:按网络拓扑结构分类,分为星型拓扑、环形拓扑、总线拓扑、树形拓扑、网状拓扑
  17. Java图形化界面编程超详细知识点(10)——Swing_表格
  18. WebDAV之葫芦儿·派盘 + PDF Expert
  19. 区块链软件公司:区块链到底能做啥?
  20. 非你莫属 周倩如 女程序员 神一样的选手!

热门文章

  1. serv-u 用户时间显示相差8小时_调好闹钟!4月8日凌晨,将迎来今年最大满月
  2. FailedScheduling 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn‘t tolerat
  3. 换位思考的反思与总结
  4. 题目1:MySQL基本练习【单、多表】
  5. 串口通信协议---UART
  6. cas112-27-6|三乙二醇/二缩三乙二醇/三甘醇|三乙二醇 透明液体
  7. iOS应用的内测签名、分发托管平台:蒲公英内测分发平台简介
  8. ****女公务员辞职“卖瓜子” 4个月销售收入5000万【新媒体+电商】
  9. 用大数据解决“痛点”问题 “云上贵州”再发力
  10. 七里香计算机音乐谱子,七里香(改编自《新经典》)