/*********************************************************************************************** Filename : flash.c* Description : flash数据读.* Author : ldm* Date : 2013-11-29***********************************************************************************************/#include"doData.h"#include"main.h"#include"flash.h"#include"gprs.h"#include"PubUse.h"#include"Structure.h"//#include"timeapp.h"#include#include"hal_uart.h"#include"hal_timer.h"#include//==============================================#defineFLASH_SPI_PAGESIZE 0x100#defineFLASH_SPI_SECTORSZIE 0x1000#defineFLASH_SPI_HIGHT_ADDR 0x1000000externUPLOADSTATE_u_gcUpload;externTESTSTATE_u_gctest;externuint32addr_flash;//---------------------------------------------#pragmaudatabank3=0x300uint8SpiCheckBuf[256];#pragmaudataexternuint8buf0[256];externuint8DATABuf[GPRS_UART_BUF_SIZE];externvoiddelay_1us(uint16i);externvoiddelay_1ms(uint16i);/*********************************************************************************************************************************************************************************************/struct bit_def{char b0:1;char b1:1;char b2:1;char b3:1;char b4:1;char b5:1;char b6:1;char b7:1;};union byte_def{struct bit_defbit1;char byte;};/***************************************************************************************Functionname:voidsleep_Flashcom(void);**Descriptions: invaildFlashcommunication.**inputparameters:none.**outputargument: none**Note: *************************************************************************************/voidsleep_PhoFlashcom(void) //无效SPI通信{PhoDataPortIn;SclkToPhoPortIn; //时钟脚输入状态SicToPhoPortIn; //数字脚输入状态PhoFlashCs_in; //选择脚输入ReadPho_off; //读拍照模块信号输出无效}voidsleep_RecFlashcom(void) //无效SPI通信{RecDataPortIn;SclkToRecPortIn; //时钟脚输入状态SicToRecPortIn; //数字脚输入状态 RecFlashCs_in; //选择脚输入}/***************************************************************************************Functionname:ready_PhoFlashcomRead(void);**Descriptions: readyFlashcommunication.**inputparameters:none.**outputargument: none**Note: SPI操作准备 *************************************************************************************/voidready_PhoFlashcomRead(void) //SPI操作前的准备{PhoFlashCs_out; //CS控制脚输出SclkToPhoPortOut; //时钟脚输出状态SicToPhoPortOut; //数字脚输出状态PhoFlashCs_inactive; //CS控制脚无效SclkToPho_off; //拉低芯片时钟线PhoDataPortIn; //拍照数据口输入}voidready_RecFlashcomRead(void) //SPI操作前的准备{RecFlashCs_out; //CS控制脚输出SclkToRecPortOut; //时钟脚输出状态SicToRecPortOut; //数字脚输出状态RecFlashCs_inactive; //CS控制脚无效SclkToRec_off; //拉低芯片时钟线RecDataPortIn; //录音数据口输入}/***************************************************************************************Functionname:voidready_PhoFlashcomWrite(void);**Descriptions: readyFlashcommunication.**inputparameters:none.**outputargument: none**Note: SPI操作准备 *************************************************************************************/voidready_PhoFlashcomWrite(void) //SPI操作前的准备{PhoFlashCs_out; //CS控制脚输出SclkToPhoPortOut; //时钟脚输出状态SicToPhoPortOut; //数字脚输出状态PhoFlashCs_inactive; //CS控制脚无效// SicToPho_off; //数字脚低SclkToPho_off; //拉低芯片时钟线PhoDataPortOut; //拍照数据口输出}voidready_RecFlashcomWrite(void) //SPI操作前的准备{RecFlashCs_out; //CS控制脚输出SclkToRecPortOut; //时钟脚输出状态SicToRecPortOut; //数字脚输出状态RecFlashCs_inactive; //CS控制脚无效// SicToRec_off; //数字脚低SclkToRec_off; //拉低芯片时钟线RecDataPortOut; //拍照数据口输出}/***************************************************************************************Functionname:uint8read_1bytePhoFlash(void);**Descriptions: getbytefromFlashoutput **inputparameters: none **outputargument: returntheobtanedbytewhichtypeisuint8**Note: *************************************************************************************/uint8read_1bytePhoFlash(void) //从Flash读1字节数据{staticuint8i;ClrWdt();PhoDataPortIn; //拍照数据口输入SclkToPho_on; //拉高芯片时钟线delay_1us(5);i=PhoDataPort;SclkToPho_off; //拉低芯片时钟线delay_1us(5);returni;}uint8read_1byteRecFlash(void) //从Flash读1字节数据{staticuint8i;ClrWdt();RecDataPortIn; //拍照数据口输入SclkToRec_on; //拉高芯片时钟线delay_1us(5);i=RecDataPort;SclkToRec_off; //拉低芯片时钟线delay_1us(5);returni;}/***************************************************************************************Functionname:write_1bytePhoFlash(uint8PB_data);**Descriptions: writeonebytetotheFlash **inputparameters: PB_data:thedatareadytobewrite **outputargument: none.//**Note: PB_data:待写数据 *************************************************************************************/voidwrite_1bytePhoFlash(uint8PB_data) //写1字节数据到Flash,SPI的写操作{uint8i;unionbyte_defLUB_data;LUB_data.byte=PB_data; //待写数据for(i=0;i<8;i){SicToPho=LUB_; //发送字节数据的高位delay_1us(5); SclkToPho_on; //拉高芯片时钟线,单片机发送数据LUB_data.byte<<=1; //取下一个位delay_1us(5); SclkToPho_off; //拉低芯片时钟线,Flash接收数据delay_1us(5); //us_delay(20);}delay_1us(10); ClrWdt();}voidwrite_1byteRecFlash(uint8PB_data) //写1字节数据到Flash,SPI的写操作{uint8i;unionbyte_defLUB_data;LUB_data.byte=PB_data; //待写数据for(i=0;i<8;i){SicToRec=LUB_; //发送字节数据的高位delay_1us(5); SclkToRec_on; //拉高芯片时钟线,单片机发送数据LUB_data.byte<<=1; //取下一个位delay_1us(5); SclkToRec_off; //拉低芯片时钟线,Flash接收数据delay_1us(5); //us_delay(20);}delay_1us(10); ClrWdt();}/***************************************************************************************Functionname: Flash_SendByte(uint8byte);**Descriptions: 发送一个字节到FLASH **inputparameters: **outputargument: //**Note: /*************************************************************************************/voidFlash_SendBytePho(uint8byte){ready_PhoFlashcomWrite(); //对Flash写操作前的准备delay_1us(5); //延时10us;PhoFlashCs_active; //CS控制脚低,有效delay_1us(5); //延时10us;write_1bytePhoFlash(byte);delay_1us(5); //延时10us;PhoFlashCs_inactive; //CS控制脚高,无效delay_1us(5); //延时10us;sleep_PhoFlashcom(); //无效SPI通信delay_1us(5); //延时10us;ClrWdt();}voidFlash_SendByteRec(uint8byte){ready_RecFlashcomWrite(); //对Flash写操作前的准备delay_1us(5); //延时10us;RecFlashCs_active; //CS控制脚低,有效delay_1us(5); //延时10us;write_1byteRecFlash(byte);delay_1us(5); //延时10us;RecFlashCs_inactive; //CS控制脚高,无效delay_1us(5); //延时10us;sleep_RecFlashcom(); //无效SPI通信delay_1us(5); //延时10us;ClrWdt();}/**************************************************************************************@brief ReadsablockofdatafromtheFLASH.*@param pBuffer:pointertothebufferthatreceivesthedatareadfromtheFLASH.*@param ReadAddr:FLASH'sinternaladdresstoreadfrom.*@param NumByteToRead:numberofbytestoreadfromtheFLASH.*@retvalNone/*************************************************************************************/uint8Flash_ReadPhoBuffer(uint32ReadAddr,uint8*pBuffer,uint16NumByteToRead){uint8p;uint8HightAddr=0;uint16i=0;uint16pp=0;_;if(ReadAddr>=FLASH_SPI_HIGHT_ADDR){HightAddr=1;}Flash_SendBytePho(FLASH_CMD_WREN);Flash_SendBytePho(FLASH_CMD_PARALLEL); //并口模式ready_PhoFlashcomRead(); //SPI操作前准备delay_1us(5); //延时10us;PhoFlashCs_active; //CS控制脚低,有效delay_1us(5); //延时10us;write_1bytePhoFlash(FLASH_CMD_READ);/*!>24);}write_1bytePhoFlash((ReadAddr&0xFF0000)>>16);/*!>8); /*!=FLASH_SPI_HIGHT_ADDR){HightAddr=1;}Flash_SendByteRec(FLASH_CMD_WREN);Flash_SendByteRec(FLASH_CMD_PARALLEL); //并口模式ready_RecFlashcomRead(); //SPI操作前准备delay_1us(5); //延时10us;RecFlashCs_active; //CS控制脚低,有效delay_1us(5); //延时10us;write_1byteRecFlash(FLASH_CMD_READ);/*!>24);}write_1byteRecFlash((ReadAddr&0xFF0000)>>16);/*!>8); /*!>24); }write_1byteRecFlash((WriteAddr&0xFF0000)>>16); /*!>8); /*!Flash_PAGESIZE*/{while(NumOfPage--){if(Flash_WritePage(pBuffer,WriteAddr,FLASH_SPI_PAGESIZE)==0)return0;WriteAddr= FLASH_SPI_PAGESIZE;pBuffer=FLASH_SPI_PAGESIZE;}if(NumOfSingle!=0){if(Flash_WritePage(pBuffer,WriteAddr,NumOfSingle)==0)return0;}}}else/*!count)/*!<(NumByteToWriteWriteAddr)>Flash_PAGESIZE*/{temp=NumOfSingle-count;if(Flash_WritePage(pBuffer,WriteAddr,count)==0)return0;WriteAddr= count;pBuffer=count;if(Flash_WritePage(pBuffer,WriteAddr,temp)==0)return0;}else{if(Flash_WritePage(pBuffer,WriteAddr,NumByteToWrite)==0)return0;}}else/*!Flash_PAGESIZE*/{NumByteToWrite-=count;NumOfPage= NumByteToWrite/FLASH_SPI_PAGESIZE;NumOfSingle=NumByteToWrite%FLASH_SPI_PAGESIZE;if(Flash_WritePage(pBuffer,WriteAddr,count)==0)return0;WriteAddr= count;pBuffer=count;while(NumOfPage--){if(Flash_WritePage(pBuffer,WriteAddr,FLASH_SPI_PAGESIZE)==0)return0;WriteAddr= FLASH_SPI_PAGESIZE;pBuffer=FLASH_SPI_PAGESIZE;}if(NumOfSingle!=0){if(Flash_WritePage(pBuffer,WriteAddr,NumOfSingle)==0)return0;}}}return1;}/**************************************************************************************@brief PollsthestatusoftheWriteInProgress(WIP)flagintheFLASH's* statusregisterandloopuntilwriteopertaionhascompleted.*@param None*@retvalNone/*************************************************************************************/uint8Flash_WaitForWriteEnd(void){uint8rst=0;//uint32CurTick;/*!=FLASH_SPI_HIGHT_ADDR) //地址大于FLASH容量{HightAddr=1;// if(Flash_Enter4Mode()==0)return0;}/*!>24); }/*!>16);/*!>8); /*!=EraseAddrEnd)_;if(addr_flash>=0x400000)_;// EraseFlashTime=120; //擦除一个扇区1.2S} }/***************************************************************************************Functionname:erase_flash(void);**Descriptions:flsah内存检测,是否擦除干净**inputparameters:none.**outputargument: none**Note: *************************************************************************************/voidflash_erase_test(void){uint16i,x;uint8p;addr_flash=0;// for(i=0;i<255;i)buf0[i]=i;// Flash_WritePage(buf0,0,256);for(x=0;x<100;x){_;if(Flash_ReadRecBuffer(addr_flash,SpiCheckBuf,256)==0);for(i=0;i<256;i){if(0xff!=SpiCheckBuf[i]){_;while(addr_flash<0x400000){if(Flash_EraseSector(addr_flash)==1); //按扇区擦除addr_flash=0x10000;WdtOut=~WdtOut;}_;return;} }addr_flash=256;}_;
本文档为【flash初始化子程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。