STC89C52驱动W25Q32测试笔记

这篇具有很好参考价值的文章主要介绍了STC89C52驱动W25Q32测试笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STC89C52是经典的C51单片机,该芯片不自带硬件SPI接口,正好有手上一块W25Q32的存储模块(某宝上买的2.2元),试着使用89C52模拟SPI接口驱动W25Q32,在驱动的过程中遇到了几个问题,首先的问题是电平不匹配,其次是对芯片datasheet资料的解读,关于W25Qx的资料基本上是全英文的资料,笔者英文水平有限解读起来有一定的困难,只能一点点去解读;其次网络上关于使用C51驱动W25Qx的相关资料有限,很大部分都是使用stm32芯片驱动的案例,结合stm32案例实现W25Qx的驱动,以下内容为个人学习过程小结,由于笔者水平有限,难免有错误,敬请谅解。

一、电路搭建(解决芯片IO电平匹配):

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

依据W25Qx芯片资料,该芯片支持电平范围为2.7V-3.6V,过电平可能造成损坏芯片,而89C52的IO电平为5V。解决办法是加一块3.3V转5V的电平转换模块(TXS-0108E),电路的连接如下图:

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

另外网络上也有采用电阻限流的方案,由于元件较多,焊接有点麻烦,笔者未验证,提供下图,仅供学习参考。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

二、编写软SPI驱动:

SPI接口一般使用 4 条线通信:

DO 主设备数据输入,从设备数据输出。

DI 主设备数据输出,从设备数据输入。

SCK 时钟信号,由主设备产生。

CS 从设备片选信号,由主设备控制。

SPI 主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

以下是SPI传送时序,SPI传送时序有4种方式,方式0-方式3。

方式0(0,0),方式1(0,1),方式2(1,0),方式3(1,1)

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;SPI主模块和与之通信的外设时钟相位和极性应该一致。CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,空闲电平为高电平。CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样。

小结下上述内容:CPOL=0时起始电平为低电平,CPOL=1时起始电平为高电平。CPHA=0时,CLK的第一个上升沿为采样(写W25Qx), CLK的第一个下降沿为输出(读W25Qx),CPHA=1时,CLK的第一个下降沿为采样(写W25Qx), CLK的第一个上升沿为输出(读W25Qx)。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

W25Qx的SPI传输支持方式0和方式3,即方式0(CPOL=0,CPHA=0),方式3(CPOL=1,CPHA=1)。

为了方便起见,笔者以方式0为基础,编写一个SPI的传输函数,该函数发送以MSB(高位优先传输)。

//SPI传输函数,发送与接收一个字节

unsignedchar SPI_Byte(unsigned char dat)

{

unsigned charread=0,i=0;

for(i=0;i<8;i++)

{

W25_DI=dat&0x80;

W25_CLK=1;

dat<<=1;

read<<=1;

read|=W25_DO;

W25_CLK=0;

}

return read;

}

三、编写函数测试获取芯片的Flash ID号(JEDEC ID):

当电路搭建完成后,SPI通信基础函数编写完成后,下一步需要获取芯片返回一个值,测试电路与基础函数成功与否。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

依据资料文件,获取ID之前有两点需要注意,第一点是MSB高位优先传输,第二点是获取操作时CS必须拉低。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

当获取成功后W25Q32对应的16位的码值为0x4016,下面依据芯片资料提供的时序。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

依据上图小结如下信息。

1、获取时CS必须为低电平,高位优先传输。

2、获取JEDEC ID的指令为0x90。

3、接收到信息三个字节,第一个字节为ManufacturerID(制造商ID)固定值为0xEF,第二个字节为MemoryType(内存类型),第三个字节为Capacity(容量)。

编写代码如下:

unsignedlong W25x_read_ID()

{

unsigned long re,t1,t2,t3;

W25_CS=0;

W25_CLK=0;

SPI_Byte(0x9F);

t3=SPI_Byte(0xff);

t2=SPI_Byte(0xff);

t1=SPI_Byte(0xff);

W25_CS=1;

re=(t3<<16)|(t2<<8)|t1;

return re;

}

测试结果:

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

四、芯片写使能与忙状态等待。

1、写使能:

写使能的操作与读ID的操作类似,其操作指令为0x06,写使能成功后Status Register1的S1位WSL置1,即允许写操作与擦除操作。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

//写使能

voidW25x_write_Enable()

{

W25_CS=0;

W25_CLK=0;

SPI_Byte(0x06);

W25_CS=1;

}

2、忙状态等待函数:

当芯片正在执行擦除、写操作时,不允许其它操作,此时必须进入等待状态,直到执行完成后Status Register1的S0位BUSY重新置0后才允许后续操作,函数必须不断的读取状态寄存器,从中提取S0的数据,从而确定相应操作的状态。Status Register1读取指令为0x05,读取方式为MSB那么S0位对应与操作位为0x01,操作方式与读ID的操作类似,依据下图资料的时序,编写函数如下。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档
w25q32,单片机类,单片机,51单片机,Powered by 金山文档

//等待擦除或写入操作,直到操作完成结束。

voidW25x_wait_BusyEnd()

{

unsigned char i=0,temp;

W25_CS=0;

W25_CLK=0;

SPI_Byte(0x05);

temp=SPI_Byte(0xff);

while((temp&0x01)==1)

{

temp=SPI_Byte(0xff);

}

W25_CS=1;

}

五、编写擦除指令:

W25Q32为非易失性存储器,写数据之前必须先执行擦除操作,这里我们先编写一个芯片擦除函数。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档
w25q32,单片机类,单片机,51单片机,Powered by 金山文档

小结上图芯片资料信息:

1、所谓的芯片擦除是往存储单元字节中填充0xFF即为擦除。

2、芯片擦除操作前必须开启Write Enable(写使能)之前有介绍。

3、芯片擦除操作的指令0x07或0x60,当然CS也必须低电平。

4、芯片擦除完成后需要等待一段时间(读忙状态),之前有介绍。

5、其它与读取ID操作类似。

//芯片擦除操作函数

voidW25x_chipErase()

{

W25x_write_Enable();//开使能

W25_CS=0;

W25_CLK=0;

SPI_Byte(0xC7);

W25_CS=1;

W25x_wait_BusyEnd();//等待擦除操作完成结束

}

六、页写入操作:

W25Qx最大写入单位为页(Page),每页最多写入256B,超过256B必须另写一页,每16页组成一个扇区(Sector),每16个扇区组成一个块(Block)。W25x32为4MB的容量,共有64个块,1024个扇区,16384个页。地址范围为(0x000000-0x2FFFFF),理论上地址每一位对应一个字节,实际在连续写入大数据的过程中还需考虑页、扇区、块的容量问题。注意写之前必须确保是擦除操作过的,最小的擦除单位不是页而是扇区。下面的例子仅考虑页写,理想的起始地址为页的起始位置,内容小于256B。

1块=16扇区,1扇区=16页,1页=256字节

w25q32,单片机类,单片机,51单片机,Powered by 金山文档
w25q32,单片机类,单片机,51单片机,Powered by 金山文档

小结上图芯片资料如下:

1、页写操作与擦除操作类似,需要CS低电平、写使能、忙等待。

2、页写操作指令为0x02,接下来是24位地址(页的每页的起始地址为:0xXXXX00,页结束地址为0xXXXXFF其中X为16进制任意数)。

3、写入地址完成后,再次写入不大于256B的数据内容

页写代码如下:

//页写操作,*buf为内容,addr为地址,PageSize为写入字节数必//须小于256个

voidW25x_write_Page(unsigned char *buf,unsigned long addr,unsigned int Pagesize)

{

W25x_write_Enable();

W25_CS=0;

W25_CLK=0;

SPI_Byte(0x02);

SPI_Byte(addr>>16&0xff);

SPI_Byte(addr>>8&0xff);

SPI_Byte(addr&0xff);

if(Pagesize>256)

{

Pagesize=256;

}

while(Pagesize--)

{

SPI_Byte(*buf++);

}

W25_CS=1;

W25x_wait_BusyEnd();

}

七、读操作:

读操作相对于写操作比较简单,不用考虑页、扇区、块,仅使用24位地址即可读。

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

小结上图芯片资料如下:

1、读操作与读ID操作类似,需要CS低电平。

2、读操作指令为0x03,接下来是24位地址。

3、写入地址完成后直接读出数据内容。

//读操作,*buf为内容,addr为地址,PageSize为读出的字节数

voidW25x_read_Page(unsigned char *buf,unsigned long addr,unsigned int Pagesize)

{

W25_CS=0;

W25_CLK=0;

SPI_Byte(0x03);

SPI_Byte(addr>>16&0xff);

SPI_Byte(addr>>8&0xff);

SPI_Byte(addr&0xff);

while(Pagesize--)

{

*buf=SPI_Byte(0xff);

buf++;

}

W25_CS=1;

}

八、读写测试

数组a为写入内容,数据b为读出数据,i为芯片ID信息,所有信息通过串口发送至电脑。

voidmain()

{

unsigned long i;

unsigned chara[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13};//写入内容

unsigned char b[15];//读出内容

char j;

uart_init(); //串口初始化

i=W25x_read_ID();//读ID

uart_sendbyte(i/256/256);

uart_sendbyte(i/256);

uart_sendbyte(i%256);

W25x_chipErase();//芯片擦除

W25x_write_Page(a,0x000002,15);//从02位置开始写入

W25x_read_Page(b,0x000000,15);//从00位置开始读信息

for(j=0;j<15;j++)

{

uart_sendbyte(b[j]);//输出所读内容

}

while(1);

}

输出结果:

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

实物展示:文章来源地址https://www.toymoban.com/news/detail-679625.html

w25q32,单片机类,单片机,51单片机,Powered by 金山文档

到了这里,关于STC89C52驱动W25Q32测试笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STC89C52定时器的简介

    针对于STC89C52RC而言,这个芯片内部包含了三个定时器——T0、T1和T2,他们的中断优先级分别是1、3和5。 怎么还有一个定时器2呢?博主也是今天整理这篇博客的时候,翻阅芯片手册才发现的。如果说,我们经常用的T0和T1叫做通用定时器的话,那么T2我愿称之为高级定时器。今

    2024年02月05日
    浏览(34)
  • 你知道什么是STC89C52RC吗?

    目录 一、什么是STC89C52RC 二、STC89C52RC由什么构成 三、STC89C52RC各部分如何使用 四、STC89C52RC如何进行编程 五、怎么使用STC89C52RC 六、为何使用STC89C52RC STC89C52RC是一种基于8051架构的单片机芯片,由中国的STC公司生产。它包含52KB的闪存程序存储器,1KB的RAM数据存储器,以及一系列

    2024年02月04日
    浏览(40)
  • 基于单片机的智能循迹避障小车STC89C52红外对管L298N驱动PWM波控制速度

    wx供重浩:创享日记 对话框发送:单片机小车 免费获取完整无水印报告等 利用红外对管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。 1.1智能

    2023年04月22日
    浏览(40)
  • 【mcuclub】STC89C52单片机最小系统讲解

        3.1、主芯片 STC89C52是STC公司生产的一种低功耗、高性能8位微控制器 器件参数: 1、增强型8051单片机,指令代码完全兼容传统8051 2、工作电压:5.5V~3.3V 3、工作频率范围:0~40MHz,实际工作频率可达48MHz 4、用户应用程序空间为8K字节(程序空间) 5、片上集成512 字节RAM(

    2024年02月03日
    浏览(66)
  • STC89C52RC单片机原理图详解

    目录 1、单片机整体模块 2、 LED模块 3、独立按键模块 4、数码管模块 5、LCD1602模块 6、矩阵按键模块​编辑 7、串口通信模块 8、LED点阵屏模块 单片机使用的是TTL电平(一种电平的规范),规定为0V为低电平,5V为高电平; 字母上有一横,意为低电平有效。 单片机上电时,所有

    2024年02月05日
    浏览(38)
  • 【STC89C52】外部中断与定时/计数器中断

    目录 一、中断系统 二、外部中断 一)配置外部中断的三个步骤 1)中断允许 (2)中断方式配置 3)中断处理函数 二)实验代码  三、定时器/计数器 一)使用定时器/计数器的三个步骤 1)启动定时/计数器 2)设置工作模式​编辑  3)查询定时/计数器是否溢出  二)实验代

    2024年02月08日
    浏览(36)
  • 第七章、stc89c52中的串行口通信

    串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 STC89C52系列单片机内部集成有一个功能很强的全双工串行通信口 UART (Universal Asynchronous Receiver Transmitter,通用异步收发器),与传统8051单片机的串口完全兼容。设有

    2024年02月07日
    浏览(26)
  • STC89C52的四个 外部中断 基本使用方法

    中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。STC89C52系列单片机提供了8个中断请求源,它们分别是: 外部中断0(NT0); 对应I/O :P32 定时器0中断; 外部中断1(INT1); 对应I/O :P33 定时器1中断; 串口(UART)中断; 定时器2中断; 外部中断2(INT2); 对应I/O :P43 外部

    2024年02月04日
    浏览(88)
  • STC89C52RC的定时器/计数器

    目录 一、STC89C52RC的定时器/计数器 二、定时器/计数器的工作方式如何选择 三、使用Timer0实现1秒定时 四、使用Timer1实现计数器功能 STC89C52RC芯片内置了2个定时器/计数器(Timer0和Timer1),这两个模块可以用于实现定时和计数功能。 这两个定时器/计数器模块的主要特性如下:

    2024年02月07日
    浏览(34)
  • 51单片机(二)8051内核及STC89C52介绍

    我们现在经常使用的STC89C52RC单片机就是基于8051内核的,它是深圳宏晶科技生产的一款单片机,它与MCS-51兼容,下面开始介绍STC89C52RC单片机。 1. STC89C52RC的兼容型号         STC89C52RC兼容 STC89C51RC,STCLE51RC,STC89C53RC,STC89LE52RC等。 以下是完整型号列表: 我们平时用的stc89c52已经能

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包