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

SPI - flash代码分析(4)

来源:网络收集 时间:2026-01-20
导读: void SF_bulk_erase (Xuint32 BaseAddress) { Xuint8 op_code, bogus_data; // FLASH写使能 SF_write_enable(BaseAddress); SPI_FLASH_CS_LOW(); // 发送FLASH块擦除命令 op_code = BE; spi_transfer(BaseAddress,

void SF_bulk_erase (Xuint32 BaseAddress) {

Xuint8 op_code, bogus_data; // FLASH写使能

SF_write_enable(BaseAddress); SPI_FLASH_CS_LOW(); // 发送FLASH块擦除命令 op_code = BE;

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

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

SF_write_disable(BaseAddress); }

以下是数据手册上关于指令BE的相关描述

首先给flash发送一条写使能指令WREN,然后选中该flash从设备,向flash发送BE整块擦除指令。关闭该flash从设备以使任何一个从设备都处于不选中状态以使FLASH进入the self-timed Bulk Erase cycle周期。查询FLASH的status register看是否已经擦除完毕。最后给flash传输一个写不使能指令WRDI指令以使flash不能再被写入。

6、 SF_start_read(XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz); 该函数的定义如下:

void SF_start_read (Xuint32 BaseAddress, Xuint8 sector_address, Xuint8 page_address, Xuint8 page_offset, Xuint8 speed_setting) {

Xuint8 op_code[5], bogus_data[5]; SPI_FLASH_CS_LOW();

// 发送SPF FLASH 读命令或快速读命令 if(speed_setting) op_code[0] = FAST; else

op_code[0] = READ;

op_code[1] = sector_address; op_code[2] = page_address; op_code[3] = page_offset; op_code[4] = DUMMY_BYTE; if(speed_setting)

spi_transfer(BaseAddress, op_code, bogus_data, 5); else

spi_transfer(BaseAddress, op_code, bogus_data, 4); }

以下是数据手册关于flash读操作read指令和快速读操作指令fast-read的描述

该函数首先选中flash从设备,然后根据是否是快速读操作传输5个字节或者4个字节。第一个字节是读操作或者快速读操作指令,紧接着三个字节是地址,假如是快速读操作的话第五个字节代表空转字节的个数即忽略多少个开始读出的数据字节数。 SF_start_read(XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00,

SCK_FASTER_THAN_20MHz);这句话代表向flash传输READ指令和地址为0x000000.

7、 error = 0;

for (i = 0; i < SF_BYTES/16; i++) {

/*每次接收16个字节 校验*/

spi_transfer(XPAR_SPI_FLASH_BASEADDR,send_data, recv_data, 16); for (j = 0; j < 16; j++) {

if(recv_data[j] != 0xFF) {

xil_printf(\ j = 16;

i = SF_BYTES; error = 1; } } }

if(!error)

xil_printf(\

代表每次接收16个字节并且检测该16个字节是否都为0Xff,假如是的话正常,否则输出错误信息。

8、SF_end_read (XPAR_SPI_FLASH_BASEADDR);下面是该函数的定义 void SF_end_read (Xuint32 BaseAddress) {

SPI_FLASH_CS_HIGH(); }

关闭flash从设备以使任何一个设备都没有选中。

9、for(sector_select = 0; sector_select < SF_SECTORS; sector_select++) for(page_select = 0; page_select < SF_PAGES_PER_SECTOR; page_select++) {

/*发送 page编程命令 */

SF_start_page_program (XPAR_SPI_FLASH_BASEADDR, sector_select, page_select, 0x00);

for (i = 0; i < SF_BYTES_PER_PAGE; i+=16) {

for(j = 0; j < 16; j++) send_data[j] = i + j; /*每次发送16个字节 */

spi_transfer(XPAR_SPI_FLASH_BASEADDR,send_data, recv_data, 16); }

SF_end_page_program (XPAR_SPI_FLASH_BASEADDR); }

xil_printf(\

下面我们首先看函数SF_start_page_program (XPAR_SPI_FLASH_BASEADDR, sector_select, page_select, 0x00);的定义

void SF_start_page_program (Xuint32 BaseAddress, Xuint8 sector_address, Xuint8 page_address, \\

Xuint8 page_offset) {

Xuint8 op_code[4], bogus_data[4];

// FLASH写使能

SF_write_enable(BaseAddress);

SPI_FLASH_CS_LOW();

// 发送page编程命令 op_code[0] = PP;

op_code[1] = sector_address; op_code[2] = page_address; op_code[3] = page_offset;

spi_transfer(BaseAddress, op_code, bogus_data, 4); }

以下是数据手册关于PP指令的描述

…… 此处隐藏:761字,全部文档内容请下载后查看。喜欢就下载吧 ……
SPI - flash代码分析(4).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)