SPI协议详解——W25Q64使用

SPI协议简介

  • SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  • SPI有四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select);网上对于通信线的名称大同小异但是功能是一样的
  • 同步,全双工
  • 支持总线挂载多设备(一主多从):每一个从机都有单独连接主机的SS线,且低电平有效
  • 接收无应答,是否接收成功不知道,即不可靠通信

硬件电路

  • 所有SPI设备的SCK、MOSI、MISO分别共用3个IO口,SS单独占用IO口
  • 主机提供时钟信号,所以主机SCK为输出,从机SCK为输入
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 主机MOSI配置为推挽输出,MISO配置为浮空或上拉输入
  • 主机与从机要共地
  • 从机没有被选中时,输出要为高阻态,防止干扰被选中的从机

SPI
注意事项,使用软件模拟SPI时,MISO为浮空或上拉输入,其他为推挽输出。

SPI模式:相位与极性的选择

SPI模式有4种,本质就是SS和SCK这两根线排列组合出4种不同的模式

数据移位流程

波特率发生器提供时钟
高位数据先出,通过8次传输,主机与从机交换一个字节数据
移除高位数据同时会移入一位数据放在低位

移位

模式0

  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=0:SCK第一个边沿(低电平)移入数据,第二个边沿(高电平)移出数据
    模式0
    首先SS低电平选中从机,SCK空闲状态,将数据放在MOSI上,然后SCK上升沿,MISO接收数据B7,SCK下降沿变为低电平开始数据B6传输。

模式1

  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=1:SCK第一个边沿(高电平)移出数据,第二个边沿低电平移入数据
    模式1
    首先SS选中从机,在第一个边沿移出数据B7,在第二个边沿移入数据B7。至此传输完一个位。所以模式1第一个边沿与第二个边沿是对一位数据的完整操作。当B0传输完成后,一个字节传输完成,MISO会进入高阻态即电平在中间。

模式2

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

CPOL与模式0相反,其它相同

模式2

模式3

  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

模式3的CPOL与模式1相反,其它相同

模式3

W25Q64

通过手册掌握W25Q64的使用方法

简介

ic
关于频率,一线,两线,四线,常用的就是一线制,如图IO复用功能就是两线和四线。SPI为全双工,但是软件层面还是半双工的,发送一个命令后,才能接受数据。
ic1
关于引脚定义,软件控制4个常用引脚,其他引脚由硬件上拉即可。
W25Q64支持SPI模式0和3

手册分析

引脚定义

引脚定义

存储结构

norflash由block组成,block由sector组成,sector由page组成。
page大小256Byte,sector大小4KB即16个page,block大小64KB即256个page。
擦除的最小单位为sector。
默认为1
norflash

指令

发送指令码 + 发送数据 / 接收数据
写入操作时:
写入操作前,必须先进行写使能(06h)
写入数据前必须先擦除,擦除后,所有数据位变为1
擦除必须按最小擦除单元(扇区)进行
连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入
写入操作结束后,芯片进入忙状态(busy),不响应新的读写操作
读取操作时:
直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取
指令

Read Status Register-1 (05h)
状态寄存器
JEDEC ID (9Fh)
id

Page Program (02h)
02

Sector Erase (20h)
20
Read Data (03h)
读取数据指令允许从内存中按顺序读取另一个数据字节。指令的启动方法是将 /CS 引脚驱动为低电平,然后将指令代码“03h”后跟 24 位地址 (A23-A0) 移入 DI 引脚。代码位和地址位锁存在CLK引脚的上升沿。接收到地址后,寻址存储器位置的数据字节将在 CLK 下降沿的 DO 引脚上移出,最高有效位 (MSB) 优先。在每个数据字节移出后,该地址会自动递增到下一个更高的地址,从而实现连续的数据流。这意味着只要时钟继续,就可以通过一条指令访问整个内存。指令通过驱动 /CS 高电平来完成。Read Data 指令序列如图 8 所示。如果在“擦除”、“编程”或“写入”循环 (BUSY=1) 时发出“读取数据”指令,则该指令将被忽略,并且不会对当前周期产生任何影响。读取数据指令允许从直流到最大 fR 的时钟速率(请参阅交流电气特性)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值