STM32普通IO模拟SPI和W25Q32通信调试
目录
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通信调试相关推荐
- STM32任意IO模拟8080时序驱动TFTLCD屏
本篇硬件平台STM32F103ZET6.TFTLCD屏采用2.8寸.320*240分辨率.16bitRGB.37pin.ILI9341驱动. 本来准备使用STM32F429平台的,因为它有LTDC,顺 ...
- stm32使用gpio模拟spi
本文介绍如何使用STM32标准外设库的GPIO端口模拟SPI,本例程使用PA5.PA6和PA7模拟一路SPI.SPI有4种工作模式,模拟SPI使用模式0,即空闲时SCK为低电平,在奇数边沿采样. 本文 ...
- 晶联讯12864液晶+STM32+HAL库 IO模拟SPI成功实现显示。
液晶型号:JLX12864G-290-PN不带字库 芯片型号:STM32F030F4 SPI连接方式:IO口模拟 STM32CubeMX 中引脚设置 JLX12864G_290_PN.h文件 #if ...
- 利用C51单片机模拟SPI进行双机通信
SPI协议简述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.由Motorola首创.SPI接口主要应用在 EEPROM,FLASH,实时时 ...
- 模拟SPI实现和调试流程
一般来说,所有的spi通信设备都可以使用模拟spi来实现,而且模拟spi的好处就是不需要针对每一款mcu去重新熟悉其spi控制器的配置,只要简单配置一下spi_clk.spi_cs.spi_mosi. ...
- 51单片机IO模拟UART
一. IO模拟UART发送 串口通信属于 串行 异步 半双工的通信模式 1. 最近在调试一个IO模拟UART的程序,把调试过程中遇到的问题总结一下.对于UART的发送部分(主机模式)还是比较容易实现的 ...
- STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码
STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 因为芯片的spi口只有3个,有部分需要外接W25Q128 ...
- STM32通信模拟SPI
21.1 关于 SPI 21.1.1 SPI 协议 SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在1980前后提出的一种全双工同步串行 ...
- 关于stm32通信协议:软件模拟SPI、软件模拟I2C的总结(fishing_8)
趁着帮老师代上嵌入式实验课的机会,又重新熟悉了一遍stm32的通信协议:串口协议.SPI协议.I2C协议.RS485协议.大概半年前,是过了一遍的,但也只停留于读了遍代码,跑了下例程,最近又过了一遍( ...
最新文章
- LeetCode 421. Maximum XOR of Two Numbers in an Array--Python解法
- Linux系统下手把手完成无人值守安装服务
- leetcode 109 --- 有序链表变成二叉搜索树
- Visual Studio 2017版本15.9现在可用
- 上传文件到ftp服务器
- mongodb更新操作符$min,$max
- Android自定义View之上拉、下拉列表 头部元素跟随 缩放、平移效果的实现
- php如何只删去汉字,php如何删除字符串中的中文
- Python的类与对象
- 设计模式之一(单例模式)
- 2022 年最佳 15 款网络监控工具
- 蓝蓝设计 扁平化界面风格的设计
- Android7.0 MTK 需求文档(一)
- 房东拿租金去还房贷是天经地义的嘛
- gitee码云安装和使用教程
- 计算机网络的分类1:按网络拓扑结构分类,分为星型拓扑、环形拓扑、总线拓扑、树形拓扑、网状拓扑
- Java图形化界面编程超详细知识点(10)——Swing_表格
- WebDAV之葫芦儿·派盘 + PDF Expert
- 区块链软件公司:区块链到底能做啥?
- 非你莫属 周倩如 女程序员 神一样的选手!
热门文章
- serv-u 用户时间显示相差8小时_调好闹钟!4月8日凌晨,将迎来今年最大满月
- FailedScheduling 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn‘t tolerat
- 换位思考的反思与总结
- 题目1:MySQL基本练习【单、多表】
- 串口通信协议---UART
- cas112-27-6|三乙二醇/二缩三乙二醇/三甘醇|三乙二醇 透明液体
- iOS应用的内测签名、分发托管平台:蒲公英内测分发平台简介
- ****女公务员辞职“卖瓜子” 4个月销售收入5000万【新媒体+电商】
- 用大数据解决“痛点”问题 “云上贵州”再发力
- 七里香计算机音乐谱子,七里香(改编自《新经典》)