软件模拟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))
#