




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本帖最后由orange-208 于 2012-5-28 10:05 编辑void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)SPI_FLASH_Write_SR(0x02);/ 使能状态寄存器中的写存储器SST25V_DBSY();SPI_FLASH_Write_SR(0x02);/ 使能状态寄存器中的写存储器SST25V_DBSY();实验目的:将数据写入外部FLASH 中,然后再读出来显示在LCD 上实验平台:基于STM32F103C8T6 的彩屏开发板FLASH : SST25VF016B flash_SST
2、.c#include "flash_SST.h"#include "spi.h"#include "delay.h"/4Kbytes 为一个 Sector/16 个扇区为1 个 Block/SST25VF016B容量为2M字节,共有32个Block(块),512个Sector (扇区)/初始化SPI FLASH 的 IO 口/修改状态寄存器,允许芯片存储器被写void SPI_Flash_Init(void)RCC->APB2ENR|=1<<2; /PORTA 时钟使能GPIOA->CRH&=0XFFF
3、FFF0F;GPIOA->CRH|=0X00000030;/PA9 推挽GPIOA->ODR|=1<<9;/PA9 上拉SPIx_Init();/初始化SPISPI_FLASH_Write_SR(0x02); / 使能状态寄存器中的写存储器SST25V_DBSY();/读取SPI_FLASH 的状态寄存器/BIT7 65 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,空闲)
4、/默认:0x00u8 SPI_Flash_ReadSR(void) u8 byte=0;SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_ReadStatusReg); /发送读取状态寄存器命令 byte=SPIx_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;/片选SPI
5、x_ReadWriteByte(SST25_EnableWriteStatusReg); / 使能写状态寄存器命令SPI_FLASH_CS=1;/取消片选SPI_FLASH_CS=0;/片选SPIx_ReadWriteByte(SST25_WriteStatusReg); /发送写取状态寄存器命令SPIx_ReadWriteByte(sr);/写入一个字节SPI_FLASH_CS=1;/取消片选/SPI_FLASH 写使能/将 WEL 置位void SPI_FLASH_Write_Enable(void)SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_
6、WriteEnable); /发送写使能SPI_FLASH_CS=1;/取消片选 /SPI_FLASH 写禁止/将 WEL 清零void SPI_FLASH_Write_Disable(void)SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_WriteDisable); /发送写禁止指令SPI_FLASH_CS=1;/取消片选/读取芯片ID SST25VF016 的是 0XBF41u16 SPI_Flash_ReadID(void)14u16 Temp = 0;SPI_FLASH_CS=0;/发送读取ID 命令SPIx_ReadWriteByte(0
7、x90);/发送24 位的地址SPIx_ReadWriteByte(0x00);SPIx_ReadWriteByte(0x00);SPIx_ReadWriteByte(0x00);/读取返回的16 位值Temp=SPIx_ReadWriteByte(0xFF)<<8; / 高 8 位数据Temp+=SPIx_ReadWriteByte(0xFF);/底八位数据SPI_FLASH_CS=1;return Temp;/读取SPI FLASH/在指定地址开始读取指定长度的数据/pBuffer: 数据存储区/ReadAddr: 开始读取的地址(24bit)/NumByteToRead: 要
8、读取的字节数(最大65535 即 64k)void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)u16 i;SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_ReadData);/发送读取命令/发送24bit 地址SPIx_ReadWriteByte(u8)(ReadAddr)>>16);SPIx_ReadWriteByte(u8)(ReadAddr)>>8);SPIx_ReadWriteByte(u8)ReadAddr);for(i=0;i<NumBy
9、teToRead;i+)pBuffer=SPIx_ReadWriteByte(0XFF);/循环读数SPI_FLASH_CS=1;/取消片选/地址自动增加的写数据Avoid AutoAddressIncrement_WordProgramA(u8 Byte1, u8 Byte2, u32 Addr) SPI_FLASH_Write_Enable();SPI_FLASH_CS=0;SPIx_ReadWriteByte(SST25_AAI_WordProgram);/输入所要写数据的起始地址SPIx_ReadWriteByte(Addr & 0xFF0000) >> 16);S
10、PIx_ReadWriteByte(Addr & 0xFF00) >> 8);SPIx_ReadWriteByte(Addr & 0xFF);/发送最初的两个数据SPIx_ReadWriteByte(Byte1);SPIx_ReadWriteByte(Byte2);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();/地址自动增加的写数据Bvoid AutoAddressIncrement_WordProgramB(u8 state,u8 Byte1, u8 Byte2)SPI_FLASH_Write_Enable();SPI_FLASH_CS
11、=0;SPIx_ReadWriteByte(SST25_AAI_WordProgram);SPIx_ReadWriteByte(Byte1);SPIx_ReadWriteByte(Byte2);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();if(state=1)SPI_FLASH_Write_Disable();SPI_Flash_Wait_Busy();/结合AB 构成的地址自动增加的连续数据的写入/具有先擦除待写区域的功能/pBuffer :为待写数据组/WriteAddr :所写数据的起始地址/NumByteToWrite :所要写的数据的长度void SPI
12、_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)u16 i,temp;u32 secpos;u16 secoff;u16 secremain;/以下代码为擦除待写区域的代码SST25VF016secpos=WriteAddr/4096;/扇区(4K)地址 0511 forsecoff=WriteAddr96;secremain=4096-secoff;if(NumByteToWrite<secremain)temp=1;elsei=NumByteToWrite-secremain;if(i%96=0)temp=i/409
13、6+1;elsetemp=i/4096+2;for(i=0;i<temp;i+)SPI_Flash_Erase_Sector(secpos+i)*4096);/以下代码为将数据写入指定地址的代码if(NumByteToWrite%2=0)temp=NumByteToWrite/2-1;else/在扇区内的偏移/扇区剩余空间大小/剩余空间大于所存数据/剩余空间小于所存数据/判断还占了几个扇区/擦除将要写入数据的扇区temp=NumByteToWrite/2;/开AutoAddressIncrement_WordProgramA(pBuffer0, pBuffer1,WriteAddr );
14、 始写数据for(i=1;i<temp;i+)AutoAddressIncrement_WordProgramB(0,pBuffer2*i, pBuffer2*i+1);if(NumByteToWrite%2=0)/结束AutoAddressIncrement_WordProgramB(1,pBufferNumByteToWrite-2, pBufferNumByteToWrite-1);写数据else/结AutoAddressIncrement_WordProgramB(1,pBufferNumByteToWrite-1,0);束写数据/写入1Byte 数据/pBuffer: 待写的数
15、据/WriteAddr :待写数据的地址void Flash_WriteByte(u8* pBuffer,u32 WriteAddr) u32 secpos;secpos=WriteAddr/4096;SPI_Flash_Erase_Sector(secpos);SPI_FLASH_Write_Enable();SPI_FLASH_CS=0;SPIx_ReadWriteByte(SST25_ByteProgram );/发送24bit 地址SPIx_ReadWriteByte(u8)(WriteAddr)>>16);SPIx_ReadWriteByte(u8)(WriteAddr)
16、>>8);SPIx_ReadWriteByte(u8)WriteAddr);SPIx_ReadWriteByte(pBuffer0);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();/擦除整个芯片/整片擦除时间:/W25X16:25s/W25X32:40s/W25X64:40s/等待时间超长.void SPI_Flash_Erase_Chip(void)SPI_FLASH_Write_Enable();SPI_Flash_Wait_Busy();SPI_FLASH_CS=0;SPIx_ReadWriteByte(SST25_ChipErase);SPI_F
17、LASH_CS=1;SPI_Flash_Wait_Busy();/擦除一个扇区/Dst_Addr: 扇区地址0511 for w25x16/擦除一个山区的最少时间:150msvoid SPI_Flash_Erase_Sector(u32 Dst_Addr)SPI_FLASH_Write_Enable();SPI_Flash_Wait_Busy();/扇区地址0511 for w25x16 4096=4k/擦除这个扇区/SET WEL/使能器件/发送写页命令/发送待写的数据/等待写完成/SET WEL/使能器件/发送片擦除命令/取消片选/等待芯片擦除结束/SET WELSPI_FLASH_CS=
18、0;SPIx_ReadWriteByte(SST25_4KByte_BlockERASE);/使能器件/发送扇区擦除指令SPIx_ReadWriteByte(u8)(Dst_Addr)>>16);SPIx_ReadWriteByte(u8)(Dst_Addr)>>8);SPIx_ReadWriteByte(u8)Dst_Addr);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();/发送 24bit 地址/取消片选/等待擦除完成/等待空闲void SPI_Flash_Wait_Busy(void)while (SPI_Flash_ReadSR()
19、&0x01)=0x01);/ 等待 BUSY 位清空void SST25V_EBSY(void)SPI_FLASH_CS=0;SPIx_ReadWriteByte( SST25_EBSY);SPI_FLASH_CS=1;void SST25V_DBSY(void)SPI_FLASH_CS=0;SPIx_ReadWriteByte( SST25_DBSY);SPI_FLASH_CS=1;Flash.h#ifndef _FLASH_SST_H#define _FLASH_SST_H#include "sys.h"#defineSPI_FLASH_CS PAout(9)/
20、选中FLASH#define FLASHID 0XBF41/SST25VF016 读写/指令表#define SST25_ReadData0x03#define SST25_FastReadData0x0B#define SST25_4KByte_BlockERASE0x20#define SST25_32KByte_BlockErase0x52#define SST25_64KByte_BlockErase0xD8#define SST25_ChipErase0xC7#define SST25_ByteProgram0x02#define SST25_AAI_WordProgram0xAD#
21、define SST25_ReadStatusReg0x05#define SST25_EnableWriteStatusReg0x50#define SST25_WriteStatusReg0x01#define SST25_WriteEnable0x06#define SST25_WriteDisable0x04#define SST25_ManufactDeviceID0x90#define SST25_JedecDeviceID0x9F#define SST25_EBSY0x70#define SST25_DBSY0x80 void SPI_Flash_Init(void);u16 S
22、PI_Flash_ReadID(void);/读取FLASH IDu8 SPI_Flash_ReadSR(void);/读取状态寄存器void SPI_FLASH_Write_SR(u8 sr);/写状态寄存器void SPI_FLASH_Write_Enable(void);/写使能void SPI_FLASH_Write_Disable(void);/写保护void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead); /读取 flashvoid SPI_Flash_Erase_Chip(void);/整片擦除void SP
23、I_Flash_Erase_Sector(u32 Dst_Addr);/扇区擦除void SPI_Flash_Wait_Busy(void);/等待空闲void SST25V_EBSY(void);void SST25V_DBSY(void);void Flash_WriteByte(u8* pBuffer,u32 WriteAddr);/写入 1Byte 数据void AutoAddressIncrement_WordProgramA(u8 Byte1, u8 Byte2, u32 Addr); / 地址自动增加的写数据Avoid AutoAddressIncrement_WordProgr
24、amB(u8 state,u8 Byte1, u8 Byte2);/地址自动增加的写数据Bvoid SPI_Flash_Write(u8 pBuffer,u32 WriteAddr,u16 NumByteToWrite);/结合AB 构成的地址自动增加的连续数据的写入#endif main.c主函数:#include<stm32f10x_lib.h>#include"common.h"#include"TFTLCD.h"#include"spi.h"#include"key.h"#include&quo
25、t;flash.h"const u8 TEXT_Buffer="Chen An SST25VF"#define SIZE sizeof(TEXT_Buffer)int main(void)/待写入flash 的数据/计算待写入数据的长度u8 key;u8 datatempSIZE;Stm32_Clock_Init(9);delay_init(72);LCD_Init();KEY_Init();SPI_Flash_Init();POINT_COLOR=RED;while(SPI_Flash_ReadID()!=FLASH_ID)/开辟空间用于存放从flash 读回的数据/系统时钟初始化/延时函数的初始化/LCD 初始化/按键初始化/SPI 关于 flash 的硬件接口初始化/设置字体颜色/检验 flash 是否存在LCD_ShowString(60,130,"SST25VF Check Failed!"); delay_ms(500);LCD_ShowString(60,130,"SST25VF Ready!");LCD_ShowString
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石油化工企业本质安全理论实践及方法考核试卷
- 牛群结构优化方法考核试卷
- 能源地质勘查与新能源探索考核试卷
- 期货市场流动性改善方案考核试卷
- 共享汽车分时租赁与新能源汽车推广协议
- 企业人力资源外包综合服务协议
- 智能小区快递代收系统租赁与智能配送服务合同
- 婚后作品版权收益分割协议
- 艺术品修复工作室租赁与全球艺术品修复产业合作框架协议
- 国际数据保护常年法律顾问及合规性审查服务合同
- 脑心健康管理师培训汇报
- 2024年学校安全知识竞赛题库及答案
- 小班健康教案及教学反思《叠衣服》
- 家装设计师个人简介范文
- DL∕T 5210.6-2019 电力建设施工质量验收规程 第6部分:调整试验
- 3.2.2新能源汽车电机控制器结构及工作原理课件讲解
- 安全员安全生产管理人员考试培训题库
- 2023-2024学年语文六年级下册古诗词1《采薇(节选)》课件
- 历史人物孙中山介绍完整版课件
- 学校2024年全国保密宣传教育月活动的小结
- 加油站防雷应急预案方案
评论
0/150
提交评论