SPI通信 -- W25Q64 -- flash芯片的使用
1、通信协议
2、SPI通信
3、STM32中SPI控制器的使用
4、W25Q64的操作过程以及软件编程
1.通信协议:
协议:两个相互通信的设备之间,进行数据传输的一种规定!
1.串口通信--
物理层
所接管脚:TX(发送管脚) RX(接收管脚) GND(接地)
数据链接层---RS232协议
开始位+数据位+奇偶校验位+停止位
1 5~8 1 1
1.总线在发送或接收前应处于空闲状态--没有数据传输时,总线处于高电平状态!
2.开始位:要发送数据时,先发送一个低电平信号,这个信号叫开始信号,表示开 始发送数据了
3.数据位:要发送的数据;---8位
4.奇偶校验位:奇校验、偶校验、无校验
5.停止位:表示传输数据的结束,---停止位为高电平信号
2.并行通信 -- 8080接口 -- intel
STM32 -- LCD屏
RS -- 命令/数据选择端
CS -- 片选端
WR -- 写使能端
RD -- 读使能端
DB0~DB15 -- 数据传输端
3.SPI通信 -- 同步通信 -- 同发同收
- 串行外围设备接口
- 高速、全双工、同步通信
同步:两个设备同时发送,同时接收!
CLK -- 时钟---主机控制:主机和从机相同;
CS -- 片选
MOSI - 主机发送,从机接收
MISO - 主机接收,从机发送
8位传输---先发高位(MSB),再发低位(LSB)
CLK和数据管脚 -- 在同一个时钟之下发送和接收数据
CPHA:如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
CPOL:如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果 CPOL=1,串行同步时钟的空闲状态为高电平。 -- 来决定数据管脚上修改的时间。
CPOL CPHA mode
0 0 --- 上升沿采样,下降沿接收 --- 0
0 1 --- 上升沿接收,下降沿采样 --- 1
1 0 --- 下降沿采样,上升沿接收 --- 2
1 1 --- 下降沿接收,上升沿采样 --- 3
主机模式根据从机来改变的。
2、STM32 -- SPI控制器
1、配置寄存器 -- SPI_CR1
-- SPI_CR2
2、数据寄存器 -- SPI_DR
3、状态寄存器 -- SPI_SR
1、特点:
全双工
8位/16位数据传输
主机/从机模式
可编程的时钟极性和相位
可编程的数据顺序, MSB在前或LSB在前
CRC
2、内部框图
3、寄存器:
CR1 --
CPHA --
CPOL -- 选择
波特率的选择
SPI的使能
NSS管脚的选择
传输位数的选择
SR -- 状态:
接受状态和发送状态
DR -- 8位/16位
4、STM32固件库:
5、W25Q64的操作:
1、W25Q64 -- 64Mbit的flash的存储芯片
2、通信方式 -- SPI
3、管脚
4、8M -- 寻址范围:2^23
8M -- 128块 -- 每块64K
1块 - 16个扇区 -- 每个扇区4K
1扇区 - 16个页 -- 每页256字节
5、写操作:
CS -- 0
数据寄存器 -- 0x06
等待发送完成
CS -- 1
6、页写:
1、CS -- 0
2、写使能(06h)
3、页写指令(02h)
4、24位地址
5、发8位数据
……最多256个
6、CS拉高
判断 -- 状态寄存器中BUSY位,来代表数据是否写成功。
7、FLASH在写数据之前:
必须擦除。
扇区擦除和块擦除。整个芯片擦除。
8、读数据 --- random读(发一次地址,读很多数据)
9、ID号 --
设备 存储类型 容量
0xEF 0x40 0x17
10、软件编程:
1、SPI的GPIO口初始化
1、查看原理图 -- 相应管脚
2、配置GPIO口 --
初始化SPI --- SPI_Init();
2、编写读写函数
STM32给W25Q64发送数据和接收数据
uint8_t sFLASH_SendByte(uint8_t byte)
{
while(SPI_I2S_GetFlagStatus(sFLASH_SPI,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(sFLASH_SPI, byte);
while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(sFLASH_SPI);
}
3、编写对W25Q64操作的函数
1、写使能 -- 479
2、页写 -- 216
W25Q64:
1、地址:
块 -- 128 16扇区 16页 1页 -- 256
64M位==8M字节
- 分为128块 8M/128==64K
- 每块分为16个扇区 64K/16==4K
- 每个扇区分为16页 4K/16===256字节
0000 0000 23~16
0000 0000 15~8
0000 0000 7~0
0x000000 -- 0块0扇区0页第0个字节
0x000001 -- 0块0扇区0页第1个字节
0x0000ff -- 0块0扇区0页第255个字节
0xXXXX XX -- 最低八位代表的是页内地址。
0xXXX X OO -- 4位页地址
0xXX X O OO -- 扇区地址
0xXX O O OO -- 块6地址
0x12 3 4 04 -- 18块中第三个扇区中的第4页中第4个字节。
作业:
1、擦除一个扇区,读取256个字节,看是否擦除成功!
2、给flash发送一页数据,读出来,判断是否正确
3、给flash里面存放一张图片,从flash中读取图片。