无人问津也好,技不如人也罢,都应静下心来,去做该做的事。
最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com
本期学习另一个通信协议SPI,和I2C差不多,都是实现主控芯片和各种外挂芯片之间的数据交流。学习流程也是一样,先学习SPI协议的软硬件规定。先用软件模拟的SPl,实现读写这个W25Q64 Flash存储器,之后再学习STM32中的SPI外设,再用硬件SPI实现一样的功能。
W25Q64是一个flash存储器芯片,内部可存8M,并且掉电不丢失。
I2C可以在消耗最低硬件资源的情况下,实现最多的功能,但是时序复杂,通信速度慢(标准模式下100KHz)。高位先行,只有在SCL高电平时才会读取SDA的电平。
SPI传输速度快,最大传输速率取决于芯片厂商的设计,比如W25Q64,手册里写的SPI时钟频率,最大可达80MHz;其次设计简单,没有I2C那么复杂;最后,硬件开销比较大,占用的通信线多。高位先行,数据位的输入和输出都是在SCK的上升沿或下降沿进行的。
在SPI中通常采用指令码加读写数据的模型,即SPI的通信流程是起始后+第一个字节(指令码里面的指令)+读/写指令。在SPI从机的芯片手册上,都会定义好对应的指令集。
本期主要介绍W25Q64
W25Q64简介
W25Qxx的硬件电路和底层驱动文件都是一样,只是容量大小区别。
W25Q64硬件电路
3.3V供电,CS左边有/或上面有个横线表示低电平有效,
WP接低电平会保护住芯片,不让写。
括号里的IO0、IO1表示SPI双重模式下这两个引脚的作用。
原理图上把HOLD和WP引脚直接接到VCC,表示不用这两个引脚的功能。
W25Q64框图
因为内部有8M的空间,为了易于管理,就进行分区。整个地址空间从0x00 00 00到0x7F FF FF,在整个地址空间里以64KB为一个基本单元,划分为若干块Block,并从前往后分为块0、块1、块2....块127。然后对每一块进行以4KB为一个基本单元的划分Sector(扇区),每一块里又分为扇区0、1...直到扇区15。当然我们写程序时,会对扇区再进行一个划分,也就是页(Page),页的大小是256个字节,所以一个扇区又可分为16页。右边的框图中每一行就是一页,在一页中的地址的变化范围是0x xx xx 00到0x xx xx FF。
Flash操作注意事项
读取一般会比较快;写入的步骤多,所以速度会慢一点。
因为Flash数据位只能1改写为0,所以在写入前必须擦除(即把数据位都变为1).
在Flash中,0xFF代表空白,而不是0x00。
擦除时可选择整个Flash擦除或按块擦除或按扇区擦除,最小的擦除单元是一个扇区(4KB或4096个字节)。比如想改动一个字节的数据,只能先把同一个扇区的其他数据都读出去,然后整个扇区擦除,再把改动的一个字节和同个扇区的其他数据写进去。
一个写入时序,最多只能写一页的数据,即256字节。