




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.C文件#include flash.h #include spi.h#include delay.h / /本程序只供学习使用,未经作者许可,不得用于其它任何用途/ALIENTEK战舰STM32开发板/W25Q64 代码 /正点原子ALIENTEK/技术论坛:/修改日期:2012/9/9/版本:V1.0/版权所有,盗版必究。/Copyright(C) 广州市星翼电子科技有限公司 2009-2019/All rights reserved/flash写入只能把1写成0,所以写入前应该先擦除/u16 SPI_FLASH_TYPE = W25Q64;/默认就是25Q64/W25Q64一共8M容量/分为128个快,每块大小为64K字节/每块又可以分为16个扇区,每个扇区4K字节/每次擦除最少一个扇区,也就是4K字节/25Q64 一共有2048个扇区/初始化SPI FLASH的IO口void SPI_Flash_Init(void) GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE );/PORTB时钟使能 /W25Q64的片选GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; / PB12 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_12);/SD卡片选信号GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; / PD2 推挽 GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOD,GPIO_Pin_2);/2.4G无线片选信号GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; / PG7 推挽 GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_7);SPI2_Init(); /初始化SPISPI2_SetSpeed(SPI_BaudRatePrescaler_2);/设置为18M时钟,高速模式SPI_FLASH_TYPE = SPI_Flash_ReadID();/读取FLASH ID. /读取SPI_FLASH的状态寄存器/BIT7 6 5 4 3 2 1 0/SPR RV TB BP2 BP1 BP0 WEL BUSY/SPR:默认0,状态寄存器保护位,配合WP使用/TB,BP2,BP1,BP0:FLASH区域写保护设置/WEL:写使能锁定/BUSY:忙标记位(1,忙;0,空闲)/默认:0x00u8 SPI_Flash_ReadSR(void) u8 byte=0; SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_ReadStatusReg); /发送读取状态寄存器命令 byte=SPI2_ReadWriteByte(0Xff); /读取一个字节 SPI_FLASH_CS=1; /取消片选 return byte; /写SPI_FLASH状态寄存器/只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!void SPI_FLASH_Write_SR(u8 sr) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_WriteStatusReg); /发送写取状态寄存器命令 SPI2_ReadWriteByte(sr); /写入一个字节 SPI_FLASH_CS=1; /取消片选 /SPI_FLASH写使能/将WEL置位 void SPI_FLASH_Write_Enable(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_WriteEnable); /发送写使能 SPI_FLASH_CS=1; /取消片选 /SPI_FLASH写禁止/将WEL清零 void SPI_FLASH_Write_Disable(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_WriteDisable); /发送写禁止指令 SPI_FLASH_CS=1; /取消片选 /读取芯片ID W25X16的ID:0XEF14u16 SPI_Flash_ReadID(void)u16 Temp = 0; SPI_FLASH_CS=0; SPI2_ReadWriteByte(0x90);/发送读取ID命令 SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00); Temp|=SPI2_ReadWriteByte(0xFF)16); /发送24bit地址 SPI2_ReadWriteByte(u8)(ReadAddr)8); SPI2_ReadWriteByte(u8)ReadAddr); for(i=0;i16); /发送24bit地址 SPI2_ReadWriteByte(u8)(WriteAddr)8); SPI2_ReadWriteByte(u8)WriteAddr); for(i=0;iNumByteToWrite;i+)SPI2_ReadWriteByte(pBufferi);/循环写数 SPI_FLASH_CS=1; /取消片选 SPI_Flash_Wait_Busy(); /等待写入结束/无检验写SPI FLASH /必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!/具有自动换页功能 /在指定地址开始写入指定长度的数据,但是要确保地址不越界!/pBuffer:数据存储区/WriteAddr:开始写入的地址(24bit)/NumByteToWrite:要写入的字节数(最大65535)/每页256个字节void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) u16 YeSengYu; YeSengYu = 256-WriteAddr%256; /单页剩余的字节数if(NumByteToWrite YeSengYupBuffer += YeSengYu;WriteAddr += YeSengYu;NumByteToWrite -= YeSengYu; /减去已经写入了的字节数if(NumByteToWrite 256)YeSengYu = 256; /一次可以写入256个字节elseYeSengYu = NumByteToWrite; /不够256个字节了 /写SPI FLASH /在指定地址开始写入指定长度的数据/该函数带擦除操作!/pBuffer:数据存储区/WriteAddr:开始写入的地址(24bit)/NumByteToWrite:要写入的字节数(最大65535) u8 SPI_FLASH_BUF4096;void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) u32 secpos;u16 secoff;u16 secremain; u16 i; secpos = WriteAddr / 4096;/扇区地址 02047 for w25x64secoff = WriteAddr % 4096;/在扇区内的偏移secremain = 4096 - secoff;/扇区剩余空间大小 if(NumByteToWrite = secremain)secremain = NumByteToWrite;/不大于4096个字节while(1) SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);/读出整个扇区的内容for(i=0;isecremain;i+)/校验数据if(SPI_FLASH_BUFsecoff+i != 0XFF)break;/需要擦除 if(isecremain)/需要擦除SPI_Flash_Erase_Sector(secpos);/擦除这个扇区for(i=0;i4096)secremain = 4096;/下一个扇区还是写不完else secremain = NumByteToWrite;/下一个扇区可以写完了 /擦除整个芯片/整片擦除时间:/W25X16:25s /W25X32:40s /W25X64:40s /等待时间超长.void SPI_Flash_Erase_Chip(void) SPI_FLASH_Write_Enable(); /SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_ChipErase); /发送片擦除命令 SPI_FLASH_CS=1; /取消片选 SPI_Flash_Wait_Busy(); /等待芯片擦除结束 /擦除一个扇区/Dst_Addr:扇区地址 0511 for w25x16/Dst_Addr:扇区地址 02047 for w25x64/擦除一个山区的最少时间:150msvoid SPI_Flash_Erase_Sector(u32 Dst_Addr) Dst_Addr*=4096; SPI_FLASH_Write_Enable(); /SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_SectorErase); /发送扇区擦除指令 SPI2_ReadWriteByte(u8)(Dst_Addr)16); /发送24bit地址 SPI2_ReadWriteByte(u8)(Dst_Addr)8); SPI2_ReadWriteByte(u8)Dst_Addr); SPI_FLASH_CS=1; /取消片选 SPI_Flash_Wait_Busy(); /等待擦除完成 /等待空闲void SPI_Flash_Wait_Busy(void) while (SPI_Flash_ReadSR()&0x01)=0x01); / 等待BUSY位清空/进入掉电模式void SPI_Flash_PowerDown(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_PowerDown); /发送掉电命令 SPI_FLASH_CS=1; /取消片选 delay_us(3); /等待TPD /唤醒void SPI_Flash_WAKEUP(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_ReleasePowerDown); / send W25X_PowerDown command 0xAB SPI_FLASH_CS=1; /取消片选 delay_us(3); /等待TRES1 .H文件#ifndef _FLASH_H#define _FLASH_H #include sys.h / /本程序只供学习使用,未经作者许可,不得用于其它任何用途/ALIENTEK战舰STM32开发板/W25Q64 代码 /正点原子ALIENTEK/技术论坛:/修改日期:2012/9/9/版本:V1.0/版权所有,盗版必究。/Copyright(C) 广州市星翼电子科技有限公司 2009-2019/All rights reserved / /W25X系列/Q系列芯片列表 /W25Q80 ID 0XEF13/W25Q16 ID 0XEF14/W25Q32 ID 0XEF15/W25Q32 ID 0XEF16#define W25Q80 0XEF13 #define W25Q16 0XEF14#define W25Q32 0XEF15#define W25Q64 0XEF16extern u16 SPI_FLASH_TYPE;/定义我们使用的flash芯片型号#defineSPI_FLASH_CS PBout(12) /选中FLASH / /指令表#define W25X_WriteEnable0x06 /写使能#define W25X_WriteDisable0x04 /写失能#define W25X_ReadStatusReg 0x05 /读状态寄存器#define W25X_WriteStatusReg0x01 /写状态寄存器#define W25X_ReadData0x03 /读数据#define W25X_FastReadData0x0B /#define W25X_FastReadDual0x3B #define W25X_PageProgram0x02 #define W25X_BlockErase0xD8 #define W25X_SectorErase0x20 #define W25X_ChipErase0xC7 #define W25X_PowerDown0xB9 /掉电#define W25X_ReleasePowerDown0xAB /唤醒#define W25X_DeviceID0xAB #define W25X_ManufactDeviceID0x90 #define W25X_Jedec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025农行小额存单质押贷款合同范本
- 2025工业润滑油的采购合同
- 2025广州商业店铺租赁合同范本
- 《合同管理系统应用教程》课件
- 2025年奶牛买卖购买合同样本
- 《医疗文书写作》课件
- 各类食品卫生及其管理1
- 2025年度房地产交易合同-国有土地使用权转让合同
- 《世界听力日宣传》课件
- 婆媳干架调解协议书
- 2025年春季学期形势与政策第二讲-中国经济行稳致远讲稿
- 厨房隔油池清理记录
- 常见生物相容性实验汇总
- 综合探究三 探寻丝绸之路(课堂运用)
- 企业重组相关税收政策培训教学课件(38张)
- 肝癌的防治(大众科普版本)-PPT课件
- 成都高新区小学数学五年级下册半期考试数学试卷
- 职业危害防治实施管理台账
- 2018年人教版九年级英语单词表
- 毕业设计U型管换热器设计说明书
- 苹果中国授权经销商协议
评论
0/150
提交评论