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

SPI - flash代码分析

来源:网络收集 时间:2026-01-20
导读: SPI_flash代码分析 以下是主函数 int main(void) { Xuint8 send_data[16], recv_data[16]; Xuint8 error, SF_sr; Xuint16 sector_select, page_select; Xuint32 i, j; xil_printf(\); /* 初始化 FLASH_SPI控制器 */ //1、初始化SPI //2、设这控制寄存器CR为

SPI_flash代码分析

以下是主函数

int main(void) {

Xuint8 send_data[16], recv_data[16]; Xuint8 error, SF_sr;

Xuint16 sector_select, page_select; Xuint32 i, j;

xil_printf(\); /* 初始化 FLASH_SPI控制器 */ //1、初始化SPI

//2、设这控制寄存器CR为主MASTER transaction inhibit disable,人工选择从设备以及设置SPI为master

//3、初始化SSR(从设备选择寄存器)为不选择任何一个从设备。 Initialize_Spi_Controller(XPAR_SPI_FLASH_BASEADDR); /* 使能SPI控制器 */

// Description : 设置SPICR寄存器的SPI System Enable位 //1、设置SPE=1,SPI SYSTEM ENABLE

XSpi_Set_Enable(XPAR_SPI_FLASH_BASEADDR);

/* 设置FLASH的WRSR寄存器,设置成功说明FLASH控制已经OK */ 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的WRSR寄存器,使能All sector可写 */ 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);

/*整片擦除 */

xil_printf(\); SF_bulk_erase(XPAR_SPI_FLASH_BASEADDR);

xil_printf(\);

/*整片校验看是不是全0XFF*/

SF_start_read(XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz); 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(\, i,j);

j = 16;

i = SF_BYTES; error = 1; } } }

if(!error)

xil_printf(\);

SF_end_read (XPAR_SPI_FLASH_BASEADDR); /*SPI FLASH page编程*/

xil_printf(\);

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(\, i);

/*SPI FLASH 读取数据进行验证*/

SF_start_read (XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz); error = 0;

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

/*每次读取16个字节进行验证 */

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

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

xil_printf(\, i,j); xil_printf(\, recv_data[j]); xil_printf(\, (i+j)); j = 16;

i = SF_BYTES; error = 1; } } }

if(!error)

xil_printf(\); else xil_printf(\); SF_end_read (XPAR_SPI_FLASH_BASEADDR); return 0; }

接下来我们一句一句话分析主函数main()

1、Initialize_Spi_Controller(XPAR_SPI_FLASH_BASEADDR); 以下是这个函数的定义

#define Initialize_Spi_Controller(BaseAddress) \\ { \\

XSpi_WriteReg(BaseAddress, XSP_SRR_OFFSET,XSP_SRR_RESET_MASK); \\ XSpi_WriteReg(BaseAddress, XSP_CR_OFFSET, INIT_CREG); \\ XSpi_WriteReg(BaseAddress, XSP_SSR_OFFSET, SPI_NONE_SELECT); \\ }

这三句话分别代表的含义是:

XSpi_WriteReg(BaseAddress, XSP_SRR_OFFSET,XSP_SRR_RESET_MASK);代表

初始化FPGA内部SPI接口的reset register,即重置FPGA内部SPI接口。以下是关于寄存器SRR的描述。

通过文档《xps_spi.pdf》有关SRR的描述,只能向SRR中写入0x0000000A.

XSpi_WriteReg(BaseAddress, XSP_CR_OFFSET, INIT_CREG);代表初始化FPGA内部的SPI接口中的控制寄存器control register,以下是关于CR控制寄存器的描述

写入的值为

#define INIT_CREG (XSP_CR_TRANS_INHIBIT_MASK | XSP_CR_MANUAL_SS_MASK | XSP_CR_MASTER_MODE_MASK)代表禁止FPGA内部的SPI接口传输数据,人工选择从设备,FPGA内部的SPI接口为主设备master

XSpi_WriteReg(BaseAddress, XSP_SSR_OFFSET, SPI_NONE_SELECT);以下是SSR寄存

器的描述。:

初始化FPGA内部的SPI接口中的slave select register,写入的值为不选择任何一个从设备。 2、XSpi_Set_Enable(XPAR_SPI_FLASH_BASEADDR); 以下是该函数的定义

#define XSpi_Set_Enable(BaseAddress) \\ { \\

Xuint16 Control; \\

Control = XSpi_ReadReg(BaseAddress, XSP_CR_OFFSET); \\ Control |= XSP_CR_ENABLE_MASK; \\

XSpi_WriteReg(BaseAddress, XSP_CR_OFFSET, Control); \\ }

该函数代表重新初始化Control register,以使能FPGA内部的SPI接口可用即将控制寄存器CR中的SPE位置1。 3、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_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c); 该函数的定义为:

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); }

这个函数的功能主要是要将data的值写入到STATUS REGISTER …… 此处隐藏:2703字,全部文档内容请下载后查看。喜欢就下载吧 ……

SPI - flash代码分析.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)