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

SPI - flash代码分析(2)

来源:网络收集 时间:2026-01-20
导读: spi_transfer(BaseAddress, bogus_data, 1); //关闭选中设备以使任何一个设备都没有选中 SPI_FLASH_CS_HIGH(); } 首先该函数选中第一个从设备也就是我们这个FLASH。 接下来我们分析函数spi_transfer(BaseAddress, b

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

首先该函数选中第一个从设备也就是我们这个FLASH。

接下来我们分析函数spi_transfer(BaseAddress, &op_code, &bogus_data, 1); 该函数的定义为:

void spi_transfer (Xuint32 BaseAddress, Xuint8 *send, Xuint8 *recv, Xuint8 num_bytes) {

Xuint8 NumBytesRcvd = 0; Xuint8 NumBytesSent = 0;

// 把发送的数据写入到SPI控制器的发送FIFO中 while(num_bytes--) {

XSpi_WriteReg(BaseAddress, XSP_DTR_OFFSET, *send++); NumBytesSent++; }

// 设置SPICR寄存器,使能Master Transactions XSpi_Clear_Inhibit(BaseAddress); // 等待发送FIFO为空

while (!(XSpi_ReadReg(BaseAddress, XSP_SR_OFFSET) & XSP_SR_TX_EMPTY_MASK)); // 从接收FIFO中接收数据

while ((XSpi_ReadReg(BaseAddress, XSP_SR_OFFSET) & XSP_SR_RX_EMPTY_MASK) == 0) {

*recv++ = XSpi_ReadReg(BaseAddress,XSP_DRR_OFFSET); NumBytesRcvd++; }

// 设置SPICR寄存器,Master Transactions 不使能 XSpi_Set_Inhibit(BaseAddress);

/*如果没有数据发送或发送的数据不等于接收的数据,则显示错误

* If no data was sent or the data that was sent was not received, * then return an error */

if ((NumBytesSent != NumBytesRcvd) || (NumBytesSent == 0)) {

print(\); } }

首先这个函数先将FPGA内部的SPI接口要传输的数据写入到FIFO中去, 然后设置Control register控制寄存器,以清楚禁止master传输位以使SPI接口能够传输数据。接下来就是开始传输数据了,确切的说是交换数据。 然后开始循环查询FPGA内部的SPI接口的Status register查看发送FIFO中的数据是否为空,假如为空则发送完毕,假如没有为空,则继续发送数据。

接下来就是读取接收FIFO中的数据,查询Status register看接收FIFO是否为空,不为空则读取数据,直到接收FIFO中的数据为空。这样就把数据传输完毕。

紧接着设置Control register寄存器以使传输禁止即Master Transactions 不使能。 检查接收的数据和发送的数据是否数量相等,相等则为正常,不相等则为错误。

我们再返回到函数void SF_write_enable (Xuint32 BaseAddress)

{

Xuint8 op_code = WREN, bogus_data; //选中第一个设备使能。 SPI_FLASH_CS_LOW(); // 发送写使能命令

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

// 发送写使能命令

spi_transfer(BaseAddress, &op_code, &bogus_data, 1); 这句话就代表给FLASH设备一个WREN指令,允许写指令。 SPI_FLASH_CS_HIGH();

代表关闭选中设备以使任何一个设备都处于没有选中状态。

我们再返回到函数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_enable(BaseAddress);这句话整体代表向FLASH传输一条WREN指令,以使FLASH做好写操作准备。

SPI_FLASH_CS_LOW();代表选中第一个设备

spi_transfer(BaseAddress, op_code, bogus_data, 2);这句话代表传输两个数据,第一个字节为命令WRSR,第二个字节为要写入的数据。

SPI_FLASH_CS_HIGH();代表关闭选中设备以使任何一个设备都没有选中 poll_until_complete(BaseAddress);该函数的定义为 void poll_until_complete (Xuint32 BaseAddress) {

Xuint8 status_reg, op_code; op_code = RDSR; …… 此处隐藏:611字,全部文档内容请下载后查看。喜欢就下载吧 ……

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