【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的机械键盘方案设计
下一篇:GD32VF103:采用RISC-V内核设计的MCU

推荐阅读最新更新时间:2026-03-06 09:55

GD32H757Z海棠开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验
11.1实验内容 通过本实验主要学习以下内容: SPI简介 GD32H7 SPI简介 SPI NOR FLASH——GD25Q128ESIGR简介 使用GD32H7 SPI接口实现对GD25Q128ESIGR的读写操作 11.2实验原理 11.2.1SPI简介 SPI(Serial Peripheral interface),顾名思义是串行外设接口,和UART不同的是,SPI是同步通讯接口,所以带有时钟线,而UART是异步通讯接口,不需要时钟线。 SPI通常使用4根线,分别为SCK、MOSI、MISO、NSS(CS): SCK:串列时脉,由主机发出 MOSI:主机输出从机输入信号(数据由主机发出) MISO:主机输
[单片机]
【<font color='red'>GD32H757Z</font><font color='red'>海棠</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第十一讲 <font color='red'>SPI-SPI</font> <font color='red'>NOR</font> <font color='red'>FLASH</font><font color='red'>读写</font><font color='red'>实验</font>
【GD32F303红枫开发板使用手册】第十九讲 SPI-SPI NOR FLASH读写实验
19.1实验内容 通过本实验主要学习以下内容: SPI简介 GD32F303 SPI简介 SPI NOR FLASH——GD25Q32ESIGR简介 使用GD32F303 SPI接口实现对GD25Q32ESIGR的读写操作 19.2实验原理 19.2.1SPI简介 SPI(Serial Peripheral interface),顾名思义是串行外设接口,和UART不同的是,SPI是同步通讯接口,所以带有时钟线,而UART是异步通讯接口,不需要时钟线。 SPI通常使用4根线,分别为SCK、MOSI、MISO、NSS(CS): SCK:串列时脉,由主机发出 MOSI:主机输出从机输入信号(数据由主机发出) MISO:主
[单片机]
【GD32F303红枫<font color='red'>派</font><font color='red'>开发板</font>使用手册】第十九讲 <font color='red'>SPI-SPI</font> <font color='red'>NOR</font> <font color='red'>FLASH</font><font color='red'>读写</font><font color='red'>实验</font>
GD32H757Z海棠开发板使用手册】第七讲 FWDG-看门狗实验
7.1实验内容 通过本实验主要学习以下内容: 独立看门狗的原理 独立看门狗功能介绍 实现独立看门狗功能 7.2实验原理 7.2.1看门狗的原理 一般来说,搭配MCU的产品都需要有长期运行的需求,特别像一些工业设备,可能要求运行个几年都不关机,但谁也不能保证在这几年里,MCU里面的代码不出任何问题,更何况自然环境中还存在很多电磁干扰、静电等,都可能会导致MCU出现运行异常的情况,比如程序卡死啦,进入错误状态啦等等,这个时候,我们就可以通过一个非常可爱的外设——看门狗,来帮助MCU从异常状态复位,让程序重新开始从头运行。 看门狗实际上是一个定时器,它的工作原理是:将看门狗定时器的计数器设定一个初始值,看门狗开始运行后,定时器中
[单片机]
【<font color='red'>GD32H757Z</font><font color='red'>海棠</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第七讲 FWDG-看门狗<font color='red'>实验</font>
GD32H757Z海棠开发板使用手册】第六讲 TIMER_3路PWM输出实验
6.1实验内容 通过本实验主要学习以下内容: TIMER PWM输出原理 TIMER 定时中断 6.2实验原理 6.2.1IO口设置 本例程中,使用TIMER0输出前三个通道的占空比,这三个通道分别为PA8、PA9和PA10,从datasheet中我们可以看到这三个引脚的定义: 所以需要将这三个引脚配置为AF模式并选择正确的AF号: 6.2.2TIMER输出PWM原理 TIMER计数方式有两种:边沿计数和中央计数,其中边沿计数分为向上计数和向下计数。 在向上计数模式下,需要配置TIMER的重载值,当TIMER开始工作后,计数值从0开始递增,当达到重载值后计数值变为0重新开始计数; 向下计数模式和向上模式类似,只是计
[单片机]
【<font color='red'>GD32H757Z</font><font color='red'>海棠</font><font color='red'>派</font><font color='red'>开发板</font>使用手册】第六讲 TIMER_3路PWM输出<font color='red'>实验</font>
【GD32F303红枫开发板使用手册】第二十讲 SPI-SPI NAND FLASH读写实验
20.1实验内容 通过本实验主要学习以下内容: SPI通信协议,参考19.2.1东方红开发板使用手册 GD32F303 SPI操作方式,参考19.2.2东方红开发板使用手册 NAND FLASH基本原理 SPI NAND介绍 使用GD32F303 SPI接口实现对GD5F1GQ5UEYIGY的读写操作 20.2实验原理 20.2.1NAND FLASH基本原理 NAND Flash和NOR Flash都是两种非易失性存储器,其读写速度、读写方式,存储区结构、成本、容量、擦写寿命都有很大区别。NAND在寿命、速度、读写方式上都不如NOR,但在成本和容量上有很大区别,故而决定了大容量数据存储是NAND的主要应用领域,而快速
[单片机]
【GD32F303红枫<font color='red'>派</font><font color='red'>开发板</font>使用手册】第二十讲 <font color='red'>SPI-SPI</font> NAND <font color='red'>FLASH</font><font color='red'>读写</font><font color='red'>实验</font>
STM32入门学习笔记之外置FLASH读写实验(上)
15.1 FLASH Flash,全名叫做Flash EEPROM Memory,即平时所说的“闪存”,它结合了ROM和RAM的长处,不仅可以反复擦除,还可以快速读取数据,STM32运行的程序其实就是存放在Flash当中,但是由于STM32的Flash一般1M左右,只能存储程序大小的数据,所以往往需要外扩Flash来存储数据,比如LCD界面当中的汉字字库,以及文件系统中读取的文件内容。 但是一般Flash的擦除次数有限制,STM32F1系列最新的文档指出,片内的FLASH擦写次数大约在1W次左右,所以一般Flash用于擦除次数不多,但是数据量很大的场合。 这个Flash读写实验我们用到的芯片是W25Q128,这是一款采用S
[单片机]
STM32入门学习笔记之外置<font color='red'>FLASH</font><font color='red'>读写</font><font color='red'>实验</font>(上)
兆易创新推出GD25NE系列SPI NOR Flash:专为1.2V SoC打造,双电压供电助力读功耗减半
兆易创新推出GD25NE系列SPI NOR Flash:专为1.2V SoC打造,双电压供电助力读功耗减半 中国北京(2025年3月12日)—— 业界领先的半导体器件供应商兆易创新GigaDevice宣布推出专为1.2V SoC应用打造的双电压供电SPI NOR Flash产品——GD25NE系列。 该系列产品无需借助外部升压电路即可与下一代1.2V SoC实现无缝兼容,此产品的面世将进一步强化兆易创新在双电压供电闪存解决方案领域的战略布局。凭借更高的性能和更低的功耗,GD25NE系列可充分满足市场对于先进嵌入式存储解决方案日益增长的需求,成为智能可穿戴设备、医疗健康、物联网、数据中心及边缘人工智能应用的理想选择。 G
[嵌入式]
兆易创新推出GD25NE系列SPI <font color='red'>NOR</font> <font color='red'>Flash</font>:专为1.2V SoC打造,双电压供电助力读功耗减半
mini2440使用J-LINK 直接下载到NOR-FLASH
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的地址和大小,参考S3C2
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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