软件模拟SPI时序实现25Q64读写操作

软件模拟SPI时序实现25Q64读写操作

单片机采用SPI/IIC通讯协议访问外围电子模块如:显示屏、EEPROM、FLASH、各种电子传感器等等越来越多,掌握SPI/IIC通讯协议访问外设非常必要。
Aarduino是我比较喜欢的平台,虽然它有硬件SPI接口,有封装的函数,但为了更深入了解SPI协议和读写25Q64,还是选择软件模拟比较好。

第一部分SPI简介

SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。

SPI通信原理比I2C要简单的多,通常只有一个主机和一个从机或多个从机之间的通讯,标准的SPI采用4根线,MOSI、MISO、SCLK、SS。

1、MOSI 主机输出从机输入,连接从机的输入端DO(MISO)。

2、MISO 主机输入从机输出,连接从机的输出端DI(MOSI)。

3、SCLK(CLK) 通讯时钟,连接从机的SCLK(CLK)。

4、SS(CS) 片选,连接从机的SS(CS),有时标注的是CS。
在这里插入图片描述
从机由于SS低电平被主机选中进行通讯。

主机MOSI上的数据按位bit(1/0)在SCLK的时钟作用下,由高到低(或低到高)输出在MOSI线上,与此同时,从机也在SCLK的同步下,接收了主机发出的在MOSI线上的数据。相应的,在SCLK的时钟作用下,由低到高(或高到低)从机输出在MISO线上的数据被主机同步接收。

SPI通讯有4种模式,SCLK的电位极性和相位的不同组合产生了4种不同的通信方式,一般通信方式由从机所确定,主机和从机必须同一种通信方式才可以正常通信。采取0模式通讯方式比较常见。
在这里插入图片描述

SPI通信0模式,即CPOL=0、CPHA=0,脉冲传输前和完成后都保持在低电平状态(低电平数据有效),在第一个边沿(上升沿)采样数据,第二个边沿(下降沿)输出数据。其他通讯方式用到时再去了解。

可以简要的说,发送数据时,主机SS低电平有效,主机MOSI上的数据在SCLK的上升沿(低电平到高电平)作用下,逐位向从机输出数据。接收数据时,主机SS低电平有效,SCLK的下降沿(高电平到低电平)作用下,逐位向MISO线上输出数据,从而主机读得数据。每8个时钟周期发送或接收1个字节数据(1个时钟周期上沿写数据、下沿读数据这种情况除外)。

第二部分 25Q64使用方法

这个帖子对我帮助很大http://www.51hei.com/bbs/dpj-41029-1.html,http://blog.sina.com.cn/s/blog_49677f890102w531.html,瑞嵌的w25x16\w25x32\w25x64数据手册中文翻译版。

25Q64简介,25Q64是华邦公司推出的大容量“SPI FLASH” 产品。容量为64Mbit,存储结构:1页256Byte(字节),1扇区=16页=256*16=4096B=4KB,1块=16扇区=64KB。故:25Q64 容量为8M,128块,2048扇区。

25Q64采用标准的SPI四线制通讯:

1、串行时钟引脚CLK

2、片选引脚 CS

3、串行数据输出引脚DO

4、串行数据输入引脚DIO

电路接线图:

在这里插入图片描述

模块图,擦除指令要用到这张表,1块=16扇区:
在这里插入图片描述

25Q64指令表:

在这里插入图片描述

这张表格很非常重要,必须读懂它。BYTE1代表指令、BYTE2-BYTE6和指令配合使用,不同的指令有不同的含义。 25Q64常用指令15条,现以90h,06h,05h,02h,03h,20h介绍使用方法:

一、“读制造/器件号”指令(90h)

首先使用90h的指令目的是检验器件连接是否正确、25Q64是否正常以及代码编写是否正确。

先把/CS引脚拉低,然后把指令90h通过引脚DIO送到芯片,然后接着把24位地址000000h送到芯片,然后芯片会先后把“生产ID”和“器件ID”通过DO引脚在CLK的下降沿逐位发送出去,从而主机同步读得数据。

在这里插入图片描述
代码实现:(开发环境arduino 328p)

#define CLK_H()       (digitalWrite(9,HIGH))
#define CLK_L()       (digitalWrite(9,LOW))
#define MOSI_H()      (digitalWrite(10,HIGH))
#define MOSI_L()      (digitalWrite(10,LOW))
#define CS_H()        (digitalWrite(11,HIGH))
#define CS_L()        (digitalWrite(11,LOW))
#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值