教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

SPI - flash代码分析(3)

来源:网络收集 时间:2026-01-20
导读: SPI_FLASH_CS_LOW(); spi_transfer(BaseAddress, status_reg, 1); // 查询SPI FLASH 状态寄存器,检查WIP位直到WIP位为0 do { spi_transfer(BaseAddress, status_reg, 1); } while((status_reg SPI_FLASH_CS_HIGH();

SPI_FLASH_CS_LOW();

spi_transfer(BaseAddress, &op_code, &status_reg, 1); // 查询SPI FLASH 状态寄存器,检查WIP位直到WIP位为0 do {

spi_transfer(BaseAddress, &op_code, &status_reg, 1); }

while((status_reg & WRITE_IN_PROGRESS_MASK) == WRITE_IN_PROGRESS_MASK); SPI_FLASH_CS_HIGH(); }

该函数首先选中该FLASH即第一个设备为从设备,传输RDSR指令,然后不断读取FLASH中STATUS REGISTER中的值直到WIP=0.然后关闭该从设备以使任何一个设备都没有选中。

我们再返回到函数void SF_write_status_register (Xuint32 BaseAddress, Xuint8 data) {

Xuint8 op_code[2], bogus_data[2]; // 设置SPI Flash 的写使能

SF_write_enable(BaseAddress); //选中第一个设备使能 SPI_FLASH_CS_LOW();

// 写SPI FLASH的状态 寄存器 op_code[0] = WRSR; op_code[1] = data;

spi_transfer(BaseAddress, op_code, bogus_data, 2); //关闭选中设备以使任何一个设备都没有选中 SPI_FLASH_CS_HIGH();

// 等待写寄存器/编程/擦除命令操作结束 poll_until_complete(BaseAddress); // 设置SPI Flash 的写不使能

SF_write_disable(BaseAddress); }

SF_write_disable(BaseAddress);以下为该函数的定义 void SF_write_disable (Xuint32 BaseAddress) {

Xuint8 op_code = WRDI, bogus_data; SPI_FLASH_CS_LOW(); // 发送写不使能命令

spi_transfer(BaseAddress, &op_code, &bogus_data, 1); SPI_FLASH_CS_HIGH(); }

首先先选中该FLASH为从设备使能,然后发送WRDI指令到该FLASH中,最后使该从设备无效以使任何一个设备都不处于选中状态。

最后我们整体分析一下函数void SF_write_status_register (Xuint32 BaseAddress, Xuint8 data) {

Xuint8 op_code[2], bogus_data[2]; // 设置SPI Flash 的写使能

SF_write_enable(BaseAddress); //选中第一个设备使能 SPI_FLASH_CS_LOW();

// 写SPI FLASH的状态 寄存器 op_code[0] = WRSR; op_code[1] = data;

spi_transfer(BaseAddress, op_code, bogus_data, 2); //关闭选中设备以使任何一个设备都没有选中 SPI_FLASH_CS_HIGH();

// 等待写寄存器/编程/擦除命令操作结束 poll_until_complete(BaseAddress); // 设置SPI Flash 的写不使能

SF_write_disable(BaseAddress); }

1、首先给FLASH发送写使能指令WREN 2、接下来选中第一个从设备

3、给FLASH传输WRSR指令和要写入SR状态寄存器的值data 4、关闭选中的从设备FLASH以使任何一个设备都不被选中 5、等待flash自己写操作周期完毕。 6、给FLASH发送写不使能指令WRDI

所以整体的一个功能就是向SR状态寄存器写入data值。

所以语句SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c);向FLASH的STATUS REGISTER写入01111100接下来我们查看status register各个位代表的含义

即SRWD=0;BP3=1;TB=1;BP2=1;BP1=1;BP0=1;WEL=0;WIP=0; 根据保护

表格

所以这句话代表所有区域都受写,擦除保护,而且是软件保护,允许WRSR指令对于SR状态寄存器的写操作。 do { //设置FLASH以使FLASH任何一部分都受保护protected

SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c); SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); } while(SF_sr != 0x7C);

接下来继续分析SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); 我们先看函数SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); 的定义

Xuint8 SF_read_status_register (Xuint32 BaseAddress) {

Xuint8 status_reg[2], op_code[2]; op_code[0] = RDSR;

SPI_FLASH_CS_LOW(); // 读状态寄存器

spi_transfer(BaseAddress, op_code, status_reg, 2);

SPI_FLASH_CS_HIGH();

return status_reg[1]; }

以下是芯片手册上关于指令RDSR的描述

首先选中flash为从设备,然后传输RDSR指令,并且读取FLASH中SR中的值到返回值中去,最后关闭该从设备以使任何一个设备都处于不选中状态。 do { //设置FLASH以使FLASH任何一部分都受保护protected

SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c); SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); } while(SF_sr != 0x7C);

所以这三句话代表向flash中的STATUS REGISTER寄存器写入0X7C,并且读取flash中STATUS regigter的值是否为0X7C确认写入成功。

4、do {

//设置FLASH以使FLASH任何一部分都不受保护protected

SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x00); SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR); } while(SF_sr != 0x00);

这三句话代表向FLASH的状态寄存器SR中写入00000000.即没有任何一部分受保护都可以写入和擦除。

5、SF_bulk_erase(XPAR_SPI_FLASH_BASEADDR);我们查看该函数的定义

…… 此处隐藏:1220字,全部文档内容请下载后查看。喜欢就下载吧 ……
SPI - flash代码分析(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/608451.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)