STM32驱动W25Q64读写数据
- 一.基本参数
- 二.通信协议
- 1、时序:
- 2、代码:
- 三.引脚定义与接线
- 1、引脚定义
- 2、对应接线
- 四.主要代码
- 五.操作步骤与现象
- 六.总结
一.基本参数
1.采用串行Nor flash外扩存储芯片
2.支持SPI接口
3.工作电压:2.7~3.6V
4.容量: 32Mbit(W25Q32)
64Mbit(W25Q64)
128Mbit(W25Q128)
二.通信协议
1、时序:
2、代码:
此处使用硬件SPI
/*** @brief SPI_FLASH初始化* @param 无* @retval 无*/
void SPI_FLASH_Init(void)
{SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* 使能SPI时钟 */FLASH_SPI_APBxClock_FUN ( FLASH_SPI_CLK, ENABLE );/* 使能SPI引脚相关的时钟 */FLASH_SPI_CS_APBxClock_FUN ( FLASH_SPI_CS_CLK|FLASH_SPI_SCK_CLK|FLASH_SPI_MISO_PIN|FLASH_SPI_MOSI_PIN, ENABLE );/* 配置SPI的 CS引脚,普通IO即可 */GPIO_InitStructure.GPIO_Pin = FLASH_SPI_CS_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(FLASH_SPI_CS_PORT, &GPIO_InitStructure);/* 配置SPI的 SCK引脚*/GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(FLASH_SPI_SCK_PORT, &GPIO_InitStructure);/* 配置SPI的 MISO引脚*/GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_PIN;GPIO_Init(FLASH_SPI_MISO_PORT, &GPIO_InitStructure);/* 配置SPI的 MOSI引脚*/GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_PIN;GPIO_Init(FLASH_SPI_MOSI_PORT, &GPIO_InitStructure);/* 停止信号 FLASH: CS引脚高电平*/SPI_FLASH_CS_HIGH();/* SPI 模式配置 */// FLASH芯片 支持SPI模式0及模式3,据此设置CPOL CPHASPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(FLASH_SPIx , &SPI_InitStructure);/* 使能 SPI */SPI_Cmd(FLASH_SPIx , ENABLE);}
三.引脚定义与接线
1、引脚定义
引脚 | 功能 |
---|---|
CS(NSS) | 片选,低电平有效 |
SCK | 时钟信号引脚 |
MISO/DO | 模块数据输出引脚 |
MOSI/DI | 模块数据输入引脚 |
2、对应接线
W25Q64模块 | STM32F103C8T6 |
---|---|
VCC | 3.3V |
SPI_CS | GPIOA_4 |
SPI_SCK | GPIOA_5 |
SPI_MISO/DO | GPIOA_6 |
SPI_MOSI/DI | GPIOA_7 |
四.主要代码
/** 函数名:main* 描述 :主函数* 输入 :无* 输出 :无*/
int main(void)
{ uint16_t i;LED_GPIO_Config();LED_BLUE;/* 配置串口为:115200 8-N-1 */USART_Config();printf("\r\n 这是一个64Mbit串行flash(W25Q64)实验 \r\n");/* 8M串行flash W25Q64初始化 */SPI_FLASH_Init();/* 获取 Flash Device ID */DeviceID = SPI_FLASH_ReadDeviceID(); Delay( 200 );/* 获取 SPI Flash ID */FlashID = SPI_FLASH_ReadID(); printf("\r\n FlashID is 0x%X,\Manufacturer Device ID is 0x%X\r\n", FlashID, DeviceID);/* 检验 SPI Flash ID */if (FlashID == sFLASH_ID){ printf("\r\n 检测到串行flash W25Q64 !\r\n");/* 擦除将要写入的 SPI FLASH 扇区,FLASH写入前要先擦除 */// 这里擦除4K,即一个扇区,擦除的最小单位是扇区SPI_FLASH_SectorErase(FLASH_SectorToErase); /* 将发送缓冲区的数据写到flash中 */// 这里写一页,一页的大小为256个字节/*写入数据到buff中*/for(i=0;i<100;i++){Tx_Buffer[i] = i;}SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);printf("\r\n写入的数据为:\r\n");for(i=0;i<BufferSize;i++){if((i%10)==0){printf("\r\n");}printf("%x ", Tx_Buffer[i]);}/* 将刚刚写入的数据读出来放到接收缓冲区中 */SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);printf("\r\n读出的数据为:\r\n");for(i=0;i<BufferSize;i++){if((i%10)==0){printf("\r\n");}printf("%x ", Rx_Buffer[i]);}/* 检查写入的数据与读出的数据是否相等 */TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);if( PASSED == TransferStatus1 ){ LED_GREEN;printf("\r\n 64Mbit串行flash(W25Q64)测试成功!\n\r");}else{ LED_RED;printf("\r\n 64Mbit串行flash(W25Q64)测试失败!\n\r");}}// if (FlashID == sFLASH_ID)else// if (FlashID == sFLASH_ID){ LED_RED;printf("\r\n 获取不到 W25Q64 ID!\n\r");}while(1);
}
五.操作步骤与现象
下载程序后打开串口助手,选择对应端口,波特率选115200 打开串口 最后按下开发板复位按键就会有如下输出:
六.总结
1、供电切勿超过3.6V,建议3.3V供电
2、注意写入读出的数据量大小一致,否者读出可能乱码
需要完整工程的可下方留言邮箱获取