STM32F10X SPI操作flash MX25L64读写数据

 

 

 

STM32F10X SPI操作flash MX25L64读写数据 

 

前一段时间在弄SPI,之前没接触过嵌入式外围应用,就是单片机也只接触过串口通信,且也是在学校的时候了。从离开手机硬件测试岗位后,自己一直想在嵌入式方面发展,在14号开始自己的第二份工作后,首先接触到的是为STM32F103SPI控制flash读写操作,现记下曾经的脚印,希望以后能少走弯路!心得:细心活!

简单的一种应用,ARM芯片作为masterflashslaver,实现单对单通信。ARM主控芯片STM32F103flash芯片为MACRONIX INTERNATIONALMX25L6465E64Mbit

SPI应该是嵌入式外围中最简单的一种应用了吧!一般SPI应用有两种方法:软件仿真,手动模拟产生时序和应用主控芯片的SPI控制器。

一般采用第二种方法比较好,比较稳定。应用主控芯片的SPI控制器,要点:正确的初始化SPI、操作SPI各寄存器和正确理解flash的时序。下面是过程,采用的是STM32F10X自带的库函数

 

1、初始化:void SpiFlashInitialzation(void)

要知道硬件是怎么连接的,是SPI1还是SPI2连接到flash中去,通过连接图知道我们要操作的是SPI2。初始化大概3个部分,配置时钟;配置GPIO;配置SPI2。这里要注意的是,CS片选脚是作为普通的GPIO来使用,输出方式为“推挽式输出”,其他CLK,MISO,MOSI为“复用功能推挽式输出”;

代码:

 

 

 

 

 

2正确的操作SPI控制器;

这里需要注意的是理解SPI状态寄存器,特别是SPI_SR7忙标志位BSY要小心,每次操作SPI要先读SPI_SRBSY不忙才可下一步,然后就是操作缓冲器了。这里还有一个问题曾经困扰了我好久,SPI的时序问题,就是CLK怎么输出时序,最后我的理解是SPI每发送一个字节,CLK就自动会产生时序,如果没发送,CLK也就停止,这样节省了功耗。于是,如果SPI要接收字节,就必须先要发一个字节,例如发一个SPI_DUMMY_BYTEDummy byte有些flash有定义有些没有,没有的话自己随便定义一个,只要不和命令字相同就可以了。

u8 SpiFlashSendByte(u8 send_data);

u8 SpiFlashReceiveByte(void);

 

 代码:

 

 

  

3理解flash的读写操作

 

首先,写数据之前必须要擦除,因为所有的flash只能从1变为0,擦除将flash全部置1,写的时候相应位置0

读写操作这部分,flash芯片手册详细的说明了操作步骤,需要注意的是:flash MX25L64的状态寄存器。对flash操作之前,先读flash_SR,确保WIP=0(flash空闲),对flash擦除、编程等操作确保WEL=1(flash能够接受擦出编程等操作)

在对flash进行写操作时,要理解一点:对flash写数据(也就是Page Program(PP)Command 02)是基于页(256bytes)为单位的,如果数据写到页的末尾,会从当前页的首地址继续开始写剩余的数据,这样就有可能造成成数据的丢失,注意就可以了!主要是理解手册中的这段话:The Page Program(PP) instruction is for programming the memory to be "0"......If the eight least significant address bits(A7-A0) are not all 0,all transmitted data going beyond the end of the current page are grogrammed from the start address of the same page(from the address A7-A0 are all 0).If more than 256 bytes are sent to the device,the data of the last 256-byte is programmed at the requtest page and previous data will be disregarded. If less than 256 bytes .......

代码:

 

 

 

 4、  读写操作完成了,大概也就完成了,其它的参考flash手册就OK啦,不在描述。

 

 

另外,还有一种方法,是用软件模拟时序,这方法用在没有SPI控制器的单片机上很实用。

STM32F407是基于ARM Cortex-M4内核的一款高性能微控制器,它支持多种外设接口,其中SPI(Serial Peripheral Interface)是串行外围设备接口,常用于连接外部设备如Flash存储器等。 MX25L64是Micron Technology生产的一种SPI闪存芯片,容量为64MB(8GB),它可以通过SPI接口直接访问,适用于需要大量非易失性存储的应用场景。以下是使用STM32F407通过SPI接口读取和写入MX25L64 Flash的一些基本步骤: ### 读操作 1. **初始化SPI**:首先配置STM32SPI外设,设置适当的波特率、SPI模式、数据位数、极性和相位等参数,通常SPI传输速度由内部时钟频率决定,并需确保与MX25L64的时钟匹配。 ```c RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SRAM, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_9 | GPIO_Pin_8; // SPI MOSI, MISO, SCK pins GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; HAL_GPIO_Init(SPI1.Instance, &GPIO_InitStruct); // Configure the SPI peripheral HAL_SPI_Init(&hspi1); ``` 2. **配置SPI传输**:将SPI模式设置为主机模式(Master Mode),并设置正确的片选信号(CSN)、读写标志、起始停止标志等。 3. **发送命令和地址**:向MX25L64发送相应的命令和地址,然后等待其返回数据。 4. **读取数据**:根据MX25L64数据手册,从指定的地址读取数据STM32的内存缓冲区。 ### 写操作 1. **准备数据和地址**:将要写入的数据以及对应的目标地址准备好。 2. **发送命令和地址**:向MX25L64发送写入命令和目标地址。 3. **写入数据**:将待写入的数据逐字节地发送给MX25L64。 4. **验证写入是否成功**:如果有必要的话,可以增加一些额外的操作来验证写入是否成功,比如读回检查。 ### 示例代码框架 ```c void spi_flash_write_data(uint32_t addr, uint8_t* data, uint32_t len) { /* 省略初始化代码 */ while (len--) { /* 发送地址 */ SPIx_SendData(addr++); /* 写入数据 */ for (uint32_t i = 0; i < 8; i++) { uint8_t byte = *data++; if (!HAL_SPI_TransmitReceive(hspi1, &byte, NULL, 0, SPI_TIMEOUT)) { break; } } } } void spi_flash_read_data(uint32_t addr, uint8_t* data, uint32_t len) { /* 省略初始化代码 */ while (len--) { /* 发送地址 */ SPIx_SendData(addr++); /* 读取数据 */ for (uint32_t i = 0; i < 8; i++) { uint8_t byte; if (!HAL_SPI_Receive(hspi1, &byte, 1, SPI_TIMEOUT)) { break; } *(data++) = byte; } } } ``` ### 相关问题: 1. 在STM32上配置SPI外设时需要注意哪些关键参数? 2. 如何计算和选择合适的SPI传输速率以兼容MX25L64的时钟速度? 3. 当遇到SPI通信中断时如何调试和解决?
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值