【GD32H757Z海棠派开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

发布者:平和的心情最新更新时间:2024-11-18 来源: elecfans关键字:NOR  FLASH  读写实验 手机看文章 扫描二维码
随时随地手机看文章

3、按buffer写数据函数bsp_spi_nor_buffer_write,该函数实现任意长度数据写入,使用page写函数搭配算法,可以跨page进行写数据:

C void bsp_spi_nor_buffer_write(uint8_t* pbuffer, uint32_t write_addr, uint16_t num_byte_to_write) { uint8_t num_of_page = 0, num_of_single = 0, addr = 0, count = 0, temp = 0; addr = write_addr % SPI_FLASH_PAGE_SIZE; count = SPI_FLASH_PAGE_SIZE - addr; num_of_page = num_byte_to_write / SPI_FLASH_PAGE_SIZE; num_of_single = num_byte_to_write % SPI_FLASH_PAGE_SIZE; /* write_addr is SPI_FLASH_PAGE_SIZE aligned */ if(0 == addr){ /* num_byte_to_write < SPI_FLASH_PAGE_SIZE */ if(0 == num_of_page) bsp_spi_nor_page_write(pbuffer,write_addr,num_byte_to_write); /* num_byte_to_write > SPI_FLASH_PAGE_SIZE */ else{ while(num_of_page--){ bsp_spi_nor_page_write(pbuffer,write_addr,SPI_FLASH_PAGE_SIZE); write_addr += SPI_FLASH_PAGE_SIZE; pbuffer += SPI_FLASH_PAGE_SIZE; } bsp_spi_nor_page_write(pbuffer,write_addr,num_of_single); } }else{ /* write_addr is not SPI_FLASH_PAGE_SIZE aligned */ if(0 == num_of_page){ /* (num_byte_to_write + write_addr) > SPI_FLASH_PAGE_SIZE */ if(num_of_single > count){ temp = num_of_single - count; bsp_spi_nor_page_write(pbuffer,write_addr,count); write_addr += count; pbuffer += count; bsp_spi_nor_page_write(pbuffer,write_addr,temp); }else bsp_spi_nor_page_write(pbuffer,write_addr,num_byte_to_write); }else{ /* num_byte_to_write > SPI_FLASH_PAGE_SIZE */ num_byte_to_write -= count; num_of_page = num_byte_to_write / SPI_FLASH_PAGE_SIZE; num_of_single = num_byte_to_write % SPI_FLASH_PAGE_SIZE; bsp_spi_nor_page_write(pbuffer,write_addr, count); write_addr += count; pbuffer += count; while(num_of_page--){ bsp_spi_nor_page_write(pbuffer,write_addr,SPI_FLASH_PAGE_SIZE); write_addr += SPI_FLASH_PAGE_SIZE; pbuffer += SPI_FLASH_PAGE_SIZE; } if(0 != num_of_single) bsp_spi_nor_page_write(pbuffer,write_addr,num_of_single); } } }


4、按buffer读数据函数bsp_spi_nor_buffer_read,该函数实现任意地址读数据,该函数流程是:拉低片选->向NOR FLASH发送读指令READ(0x03)->从低地址到高地址发送要读的地址(每次进行读数据时,只需要给初始地址即可,读完一个数据后NOR FLASH内部会自动把地址+1)->读数据->拉高片选:

C void bsp_spi_nor_buffer_read(uint8_t* pbuffer, uint32_t read_addr, uint16_t num_byte_to_read) { /* select the flash: chip slect low */ bsp_spi_nor_cs_low(); /* send 'read from memory ' instruction */ driver_spi_master_transmit_receive_byte(&BOARD_SPI,READ); /* send read_addr high nibble address byte to read from */ driver_spi_master_transmit_receive_byte(&BOARD_SPI,(read_addr & 0xFF0000) >> 16); /* send read_addr medium nibble address byte to read from */ driver_spi_master_transmit_receive_byte(&BOARD_SPI,(read_addr& 0xFF00) >> 8); /* send read_addr low nibble address byte to read from */ driver_spi_master_transmit_receive_byte(&BOARD_SPI,read_addr & 0xFF); /* while there is data to be read */ while(num_byte_to_read--){ /* read a byte from the flash */ *pbuffer = driver_spi_master_transmit_receive_byte(&BOARD_SPI,NOR_DUMMY_BYTE); /* point to the next location where the byte read will be saved */ pbuffer++; } /* deselect the flash: chip select high */ bsp_spi_nor_cs_high(); }

11.4.4main函数实现

以下为main函数代码:

C int main(void) { //延时、共用驱动部分初始化 driver_init(); //初始化LED组和默认状态 bsp_led_group_init(); bsp_led_on(&LED1); bsp_led_off(&LED2); //初始化UART打印 bsp_uart_init(&BOARD_UART); //初始化SPI bsp_spi_init(&BOARD_SPI); //初始化SPI NOR bsp_spi_nor_init(); printf_log('nrSPI Flash:GD25Q configured...nr'); //读取flash id flash_id = bsp_spi_nor_read_id(); printf_log('nrThe Flash_ID:0x%Xnr',flash_id); //比对flash id是否一致 if(SFLASH_4B_ID == flash_id || SFLASH_16B_ID == flash_id) { printf_log('nrWrite to tx_buffer:nr'); //准备数据 for(uint16_t i = 0; i < BUFFER_SIZE; i++){ tx_buffer[i] = i; printf_log('0x%02X ',tx_buffer[i]); if(15 == i%16){ printf_log('nr'); } } printf_log('nr'); printf_log('nrRead from rx_buffer:nr'); //擦除要写入的sector bsp_spi_nor_sector_erase(FLASH_WRITE_ADDRESS); //写入数据 bsp_spi_nor_buffer_write(tx_buffer,FLASH_WRITE_ADDRESS,TX_BUFFER_SIZE); //延时等待写完成 delay_ms(10); //回读写入数据 bsp_spi_nor_buffer_read(rx_buffer,FLASH_READ_ADDRESS,RX_BUFFER_SIZE); /* printf_log rx_buffer value */ for(uint16_t i = 0; i < BUFFER_SIZE; i++){ printf_log('0x%02X ', rx_buffer[i]); if(15 == i%16){ printf_log('nr'); } } printf_log('nr'); //比较回读和写入数据 if(ERROR == memory_compare(tx_buffer,rx_buffer,BUFFER_SIZE)){ printf_log('Err:Data Read and Write aren't Matching.nr'); //写入错误 /* turn off all leds */ bsp_led_on(&LED2); /* turn off all leds */ bsp_led_on(&LED1); while(1); }else{ printf_log('nrSPI-GD25Q16 Test Passed!nr'); } }else{ //ID读取错误 /* spi flash read id fail */ printf_log('nrSPI Flash: Read ID Fail!nr'); /* turn off all leds */ bsp_led_on(&LED2); /* turn off all leds */ bsp_led_on(&LED1); while(1); } while(1){ /* turn off all leds */ bsp_led_toggle(&LED2); /* turn off all leds */ bsp_led_toggle(&LED1); delay_ms(200); } }


main函数中实现了向特定NOR FLASH地址写数据,并回读出来,并将写入的数据和回读出来的数据进行对比,看是否写入成功。

11.5实验结果

将本实验例程烧录到GD32H757紫海棠派开发板中,将会显示对外部SPI flash写入以及读取的数据以及最终的校验结果,如果写入读取校验正确,将会显示SPI-GD25QXX Test Passed,LED1和LED2将会交替闪烁。


[1] [2]
关键字:NOR  FLASH  读写实验 引用地址:【GD32H757Z海棠派开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

上一篇:采用GD32F303的机械键盘方案设计
下一篇:最后一页

推荐阅读最新更新时间:2024-11-18 09:57

一加将在海外发布Nord 2吃豆人联名版:售价约3200元
据IT之家网友 @阔落猫 投稿,一加 Nord 2 宣布将推出吃豆人联名版,售价 37999 印度卢比(约 3264.11 元人民币)。   根据官方的介绍,一加 Nord 2 吃豆人联名版将具有与常规 Nord 2 5G 相同的配置,配备 12GB 内存和 256GB 存储空间,它的后盖将在黑暗中发光,并且整机将采用吃豆人设计。   这款手机的设计尚未公布,不过售价已知。该机将在欧盟、英国和印度销售,售价分别为 529 欧元、499 英镑和 37999 印度卢比。具有相同存储配置的非定制 Nord 2 手机目前售价为 499 欧元、469 英镑和 34999 印度卢比。   IT之家了解到,一加 Nord 2 搭载
[手机便携]
如何提高FLASH使用寿命以实现EEPROM的功能呢 ?
一、 stm32的FLASH擦除是按整页或者整扇区擦除的,不同芯片的页或者扇区(下边统称为页)的大小是不一样的,有1K,16K,64K,128K等大小。 现在我们想要 存3个不同16bit变量的数据,1秒存一次 ,如果不做任何算法,将这3个变量存到3个不同的页的16bit地址,每次更改变量内容都要擦除一次整页(但是我们只使用了16bit的空间),根据芯片数据手册可知,保证性能的情况下flash最少擦除次数为10K,1万次。 我们就按1万次计算,理论上不到3小时我们使用的16bit地址就有损坏的风险。而且要存储的变量个数也有限,我们芯片不可能有那么多页,H7系列也就16页。所以需要一些算法处理,充分利用页的空间。 二、E
[单片机]
如何提高<font color='red'>FLASH</font>使用寿命以实现EEPROM的功能呢 ?
TMS320F28xx DSP中内部Flash的应用研究
1 前言 TMS320F28xx DSP片内有128 K×16 bit字的Flash、两块4 K x16bit字的单周期访问RAM(SARAM)LO和L1、一块8 Kxl6 bit字的单周期访问RAM(SARAM)HO、两块1 Kxl6 bit字的单周期访问RAM(SARAM)M0和M1。由于存储器种类多、容量大,所以从系统的高度来配置各个存储器必须有合适的方法,而这些方法一般都与片内Flash有关。另外,TMS320F28xx DSP片内有看门狗定时器模块(WDT)、引导ROM(ROM bootloader)模块、代码安全模块(CSM),要合理地使用这些模块为整个系统服务,必定也要用到Flash。 由此可以看出,Flash的地
[应用]
STM32——粗谈基础知识
对于STM32来说,首先我们从其精密性、可靠性以及安全性三个方面来进行说明: 精密性:与单片机的外设基本相同,除了其包含了7个DMA(直接存储器访问)通道。每个通道都可以用来在设备与内存之间进行8/16/32位数据的传输。每个设备都可以向DMA控制器发出发送或者接受数据的请求。 可靠性:采用硬件来对可靠性进行支持,包括一个低电压检测器,一个时钟安全管理系统和两个看门狗定时器(一个为窗口看门狗,一个为独立看门狗)。 安全性:STM32可以锁住其内部的Flash而使得破解人员无法通过端口读取其内容。STM32还有一小块电池备份RAM区,当该RAM区域检测到其入侵检测引脚产生电平变化时,就会自动将电池备份的RAM区域上的内容
[单片机]
s3c2440.jflash项目的配置(使用jlink下载boot到norflash)
J-Flash ARM的配置。 一般说来file– open project里面会找到一些*.jflash的配置文件,加载他们就行了,但是没找到适合S3C2440的。所以自己建了一个MINI2440.jflash,手动进行配置: j-link设置 1.打开J-Flash ARM,并进入菜单:Options– Project settings 2.主要设置CPU选项和Flash选项 CPU : Core -- ARM9, Little endian Use target RAM(faster)– Addr:40000000 4KB(不选很慢;从Nor flash启动时内部Boot SRAM的地址和大小,参考S3C24
[单片机]
s3c2440.jflash项目的配置(使用jlink下载boot到norflash)
Keil STM32调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
参考: 很郁闷,买来没多久的 STM32F4-DISCOVERY 就挂了? STM32F103RB Jlink调试的时候出现flash timeout.reset the target and try it again 看完以上网友的方案后本人使用FlyMcu读芯片,内容提示芯片被锁。遂想下载一个程序试试,不想程序可以下载,然后再读芯片时已正常。 返回Keil使用ST-Link也可正常使用。 从网友结论及本人测试,些次出现“flash timeout.reset the target and try it again”是由芯片被锁导至。 以下方法未试 问题已经解决了。是keil的环境没有设置好。导致程序进步去。应该是没有Re
[单片机]
Keil STM32调试,使用ST-Link下载程序时提示“<font color='red'>flash</font> timeout.reset the target and try it again”
写MSP430片内flash|FLASH 读写等操作 学习
【FLASH 操作】FLASH 读写等操作 学习 近似型号中文资料: IC型号:N25Q128 http://www.soiseek.cn/NUMONYX/N25Q128/2.htm 官方文档:F5438中文全集.pdf_免费高速下载|百度网盘-分享无限制 第60页 //****************************************************************************** // 参数: adr 为地址 , 范围 0x1000~0xFFFF void FlashRead(long adr,uint8 *bBuf,uint8 bLen) { while (bLen
[单片机]
单片机的FLASH引导装载系统设计
前言 DSP系统的引导装载是指在系统加电时,由DSP将一段存储在外部非易失性存储器中的代码移植到内部高速存储器单元并执行的过程。这种方式即可利用外部存储单元扩展DSP本身有限的ROM资源,又能充分发挥DSP内部资源的高速效能。因此,引导装载系统的性能直接关系到整个DSP系统的可靠性和处理速度,是DSP系统设计中必不可少的重要环节。在装载系统中,外部非易失性存储器和DSP的性能尤为重要。FLASH是一种高密度、非易失性的电可擦写存储器,而且单位存储比特的价格比传统EPROM要低。为此,本文介绍了TMS320C6713浮点DSP芯片和SST公司提供的SST39VF400A FLASH存储器的基本特点,给出了使用该FLASH存储器设计
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved