已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/* 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 /=#define FLASH_SPI_PAGESIZE 0x100#define FLASH_SPI_SECTORSZIE 0x1000#define FLASH_SPI_HIGHT_ADDR 0x1000000extern UPLOADSTATE_u _gcUpload;extern TESTSTATE_u _gctest;extern uint32 addr_flash;/-#pragma udata bank3 = 0x300uint8 SpiCheckBuf256;#pragma udataextern uint8 buf0256; extern uint8 DATABufGPRS_UART_BUF_SIZE;extern void delay_1us(uint16 i);extern void delay_1ms(uint16 i);/*/structbit_def charb0:1;charb1:1;charb2:1;charb3:1;charb4:1;charb5:1;charb6:1;charb7:1;unionbyte_defstructbit_def bit1;charbyte; /* Function name: void sleep_Flashcom(void);* Descriptions: invaild Flash communication.* input parameters: none.* output argument: none* Note: */void sleep_PhoFlashcom(void) /无效SPI通信PhoDataPortIn;SclkToPhoPortIn;/时钟脚输入状态SicToPhoPortIn;/数字脚输入状态PhoFlashCs_in;/选择脚输入ReadPho_off;/读拍照模块信号输出无效void sleep_RecFlashcom(void) /无效SPI通信RecDataPortIn;SclkToRecPortIn;/时钟脚输入状态SicToRecPortIn;/数字脚输入状态RecFlashCs_in;/选择脚输入/* Function name: ready_PhoFlashcomRead(void);* Descriptions: ready Flash communication.* input parameters: none.* output argument: none* Note: SPI操作准备 */void ready_PhoFlashcomRead(void)/SPI操作前的准备 PhoFlashCs_out;/CS控制脚输出 SclkToPhoPortOut;/时钟脚输出状态 SicToPhoPortOut;/数字脚输出状态PhoFlashCs_inactive;/CS控制脚无效 SclkToPho_off; /拉低芯片时钟线 PhoDataPortIn;/拍照数据口输入void ready_RecFlashcomRead(void)/SPI操作前的准备 RecFlashCs_out;/CS控制脚输出 SclkToRecPortOut;/时钟脚输出状态 SicToRecPortOut;/数字脚输出状态RecFlashCs_inactive;/CS控制脚无效SclkToRec_off; /拉低芯片时钟线 RecDataPortIn;/录音数据口输入/* Function name: void ready_PhoFlashcomWrite(void);* Descriptions: ready Flash communication.* input parameters: none.* output argument: none* Note: SPI操作准备 */void ready_PhoFlashcomWrite(void)/SPI操作前的准备 PhoFlashCs_out;/CS控制脚输出 SclkToPhoPortOut;/时钟脚输出状态 SicToPhoPortOut;/数字脚输出状态PhoFlashCs_inactive;/CS控制脚无效/SicToPho_off;/数字脚低 SclkToPho_off; /拉低芯片时钟线 PhoDataPortOut;/拍照数据口输出void ready_RecFlashcomWrite(void)/SPI操作前的准备 RecFlashCs_out;/CS控制脚输出 SclkToRecPortOut;/时钟脚输出状态 SicToRecPortOut;/数字脚输出状态RecFlashCs_inactive;/CS控制脚无效/SicToRec_off;/数字脚低 SclkToRec_off; /拉低芯片时钟线 RecDataPortOut;/拍照数据口输出/* Function name: uint8 read_1bytePhoFlash(void); * Descriptions: get byte from Flash output * input parameters: none * output argument: return the obtaned byte which type is uint8 * Note: */uint8 read_1bytePhoFlash(void) /从Flash读1字节数据static uint8 i;ClrWdt();PhoDataPortIn;/拍照数据口输入 SclkToPho_on; /拉高芯片时钟线 delay_1us(5);i=PhoDataPort; SclkToPho_off; /拉低芯片时钟线 delay_1us(5); return i;uint8 read_1byteRecFlash(void) /从Flash读1字节数据 static uint8 i;ClrWdt();RecDataPortIn;/拍照数据口输入 SclkToRec_on; /拉高芯片时钟线 delay_1us(5);i=RecDataPort; SclkToRec_off; /拉低芯片时钟线 delay_1us(5); return i;/* Function name: write_1bytePhoFlash(uint8 PB_data) ; * Descriptions: write one byte to the Flash * input parameters: PB_data:the data ready to be write * output argument: none./* Note: PB_data:待写数据 */void write_1bytePhoFlash(uint8 PB_data) /写1字节数据到Flash ,SPI的写操作 uint8 i; union byte_def LUB_data; LUB_data.byte=PB_data; /待写数据 for(i=0;i8;i+) SicToPho=LUB_data.bit1.b7; /发送字节数据的高位 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();void write_1byteRecFlash(uint8 PB_data) /写1字节数据到Flash ,SPI的写操作 uint8 i; union byte_def LUB_data; LUB_data.byte=PB_data; /待写数据 for(i=0;i8;i+) SicToRec=LUB_data.bit1.b7; /发送字节数据的高位 delay_1us(5); SclkToRec_on; /拉高芯片时钟线,单片机发送数据 LUB_data.byte= 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);/*! Send Read from Memory instruction */if(HightAddr)/*! 24);write_1bytePhoFlash(ReadAddr & 0xFF0000) 16); /*! 8); /*! Send ReadAddr medium nibble address byte to read from */write_1bytePhoFlash(ReadAddr & 0xFF); /*! Send ReadAddr low nibble address byte to read from */for(i=0;i(NumByteToRead);i+)/SpiCheckBufi=read_1bytePhoFlash();/先读高字节p=read_1bytePhoFlash();/先读高字节*pBuffer =p;/DATABufi+23 =read_1bytePhoFlash();/先读高字节 pBuffer+;if(p=0xff) pp+;delay_1us(5);/延时10us;PhoFlashCs_inactive;/CS控制脚高,无效delay_1us(5);/延时10us;sleep_PhoFlashcom(); /无效SPI通信delay_1us(5);/延时10us;_gcUpload.t.FlashPhoBusy=0;if(pp= 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);/*! Send Read from Memory instruction */if(HightAddr)/*! 24);write_1byteRecFlash(ReadAddr & 0xFF0000) 16); /*! 8); /*! Send ReadAddr medium nibble address byte to read from */write_1byteRecFlash(ReadAddr & 0xFF); /*! Send ReadAddr low nibble address byte to read from */for(i=0;i(NumByteToRead);i+)/SpiCheckBufi=read_1byteRecFlash();/先读高字节*pBuffer =read_1byteRecFlash();/先读高字节 pBuffer+;delay_1us(5);/延时10us;RecFlashCs_inactive;/CS控制脚高,无效delay_1us(5);/延时10us;sleep_RecFlashcom(); /无效SPI通信delay_1us(5);/延时10us;_gcUpload.t.FlashRecBusy=0; return 1;/* Function name: Flash_WritePage(uint8 * pBuffer, uint32 WriteAddr, uint16 NumByteToWrite)* Descriptions: 写一页* input parameters: none.* output argument: none* Note: * brief Writes more than one byte to the FLASH with a single WRITE cycle * (Page WRITE sequence). * note The number of byte cant exceed the FLASH page size. * param pBuffer: pointer to the buffer containing the data to be written * to the FLASH. * param WriteAddr: FLASHs internal address to write to. * param NumByteToWrite: number of bytes to write to the FLASH, must be equal * or less than Flash_PAGESIZE value. * retval None */uint8 Flash_WritePage(uint8 *pBuffer, uint32 WriteAddr, uint16 NumByteToWrite) uint8 HightAddr = 0,rst = 0; uint16 i,WriteNum = NumByteToWrite; uint8 * pData = pBuffer; Flash_SendByteRec(FLASH_CMD_WREN);/写使能 /*! Enable the write access to the FLASH */Flash_SendByteRec(FLASH_CMD_PARALLEL);/并口模式 ready_RecFlashcomWrite();/SPI操作前准备 RecFlashCs_active;/SPI有效delay_1us(5);/us_delay(10); write_1byteRecFlash(FLASH_CMD_PP); /*! 页编程 */ if(HightAddr) /*! 24); write_1byteRecFlash(WriteAddr & 0xFF0000) 16); /*! 8); /*! Send SectorAddr medium nibble address byte */ write_1byteRecFlash(WriteAddr & 0xFF); /*! Send SectorAddr low nibble address byte */ for(i=0;iNumByteToWrite;i+) /*! while there is data to be written on the FLASH */ / write_1byteFlash(*pBuffer); /*! Send the current byte */RecDataPort=*pBuffer;/并口delay_1us(1);SclkToRec_on;delay_1us(1);SclkToRec_off;delay_1us(1);pBuffer+; /*! Point on the next byte to be written */ delay_1us(5);/us_delay(10); RecFlashCs_inactive; /无效SPI delay_1us(5);/us_delay(10); sleep_RecFlashcom(); /无效SPI通信 delay_1us(5);/us_delay(10); /* if(Flash_WaitForWriteEnd() = 0)return 0; if(Flash_ReadRecBuffer(WriteAddr,SpiCheckBuf,WriteNum) = 0) return 0;for(i=0; iWriteNum; i+) if(pDatai != SpiCheckBufi) return 0; */ return 1;/* * brief Writes block of data to the FLASH. In this function, the number of * WRITE cycles are reduced, using Page WRITE sequence. * param pBuffer: pointer to the buffer containing the data to be written * to the FLASH. * param WriteAddr: FLASHs internal address to write to. * param NumByteToWrite: number of bytes to write to the FLASH. * retval None/*/uint8 Flash_WriteBuffer(uint32 WriteAddr,uint8 *pBuffer,uint16 NumByteToWrite) uint16 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % FLASH_SPI_PAGESIZE; count = FLASH_SPI_PAGESIZE - Addr; NumOfPage = NumByteToWrite / FLASH_SPI_PAGESIZE; NumOfSingle = NumByteToWrite % FLASH_SPI_PAGESIZE; if (Addr = 0) /*! WriteAddr is Flash_PAGESIZE aligned */ if (NumOfPage = 0) /*! NumByteToWrite Flash_PAGESIZE */ if(Flash_WritePage(pBuffer, WriteAddr, NumByteToWrite) = 0) return 0; else /*! Flash_PAGESIZE */ while (NumOfPage-) if(Flash_WritePage(pBuffer, WriteAddr, FLASH_SPI_PAGESIZE) = 0) return 0; WriteAddr += FLASH_SPI_PAGESIZE; pBuffer += FLASH_SPI_PAGESIZE; if (NumOfSingle != 0) if(Flash_WritePage(pBuffer, WriteAddr, NumOfSingle) = 0) return 0; else /*! WriteAddr is not Flash_PAGESIZE aligned */ if (NumOfPage = 0) /*! NumByteToWrite count) /*! Flash_PAGESIZE */ temp = NumOfSingle - count; if(Flash_WritePage(pBuffer, WriteAddr, count) = 0) return 0; WriteAddr += count; pBuffer += count; if(Flash_WritePage(pBuffer, WriteAddr, temp) = 0) return 0; else if(Flash_WritePage(pBuffer, WriteAddr, NumByteToWrite) = 0) return 0; else /*! Flash_PAGESIZE */ NumByteToWrite -= count; NumOfPage = NumByteToWrite / FLASH_SPI_PAGESIZE; NumOfSingle = NumByteToWrite % FLASH_SPI_PAGESIZE; if(Flash_WritePage(pBuffer, WriteAddr, count) = 0) return 0; WriteAddr += count; pBuffer += count; while (NumOfPage-) if(Flash_WritePage(pBuffer, WriteAddr, FLASH_SPI_PAGESIZE) = 0) return 0; WriteAddr += FLASH_SPI_PAGESIZE; pBuffer += FLASH_SPI_PAGESIZE; if (NumOfSingle != 0) if(Flash_WritePage(pBuffer, WriteAddr, NumOfSingle) = 0) return 0; return 1;/* * brief Polls the status of the Write In Progress (WIP) flag in the FLASHs * status register and loop until write opertaion has completed. * param None * retval None/*/uint8 Flash_WaitForWriteEnd(void) uint8 rst = 0; /uint32 CurTick; /*! Send Read Status Register instruction */NSec = 5;/CurTick = NSec;/GetSystemSecond() + 3;/*! Loop as long as the memory is busy with a write cycle */do/*! Send a dummy byte to generate the clock needed by the FLASH and put the value of the status register in FLASH_Status variable */ /flashstatus = Flash_SendByte(FLASH_DUMMY_BYTE);ready_RecFlashcomRead();/SPI操作前准备delay_1us(5);/延时10us;RecFlashCs_active;/SPI有效delay_1us(5);/延时10us;write_1byteRecFlash(FLASH_CMD_RDSR);delay_1ms(10); rst = read_1byteRecFlash();ClrWdt(); if( NSec = 0 )/CurTickGetSystemSecond() return 0; while (rst & FLASH_WIP_FLAG) = 1); /* Write in progress */delay_1us(5);/延时10us; RecFlashCs_inactive; /无效SPIdelay_1us(5);/延时10
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初级经济学期末复习题
- 钢结构实习报告总结
- 2027届濉溪县六年级数学第一学期期末考试模拟试题含解析
- 施工通讯对讲机信号中断应急处置
- 2026年中国刮刮油墨市场调查研究报告
- 2026年产科治疗室消毒隔离制度培训试卷及答案
- 2026年二季度医院感染管理培训考核试题及答案
- 智慧工地软件平台方案
- 非金属矿山检修员定期维护安全操作规程
- 工厂食堂管理制度模板
- DB32/ 4043-2021池塘养殖尾水排放标准
- DB31/T 451-2021净水厂用煤质颗粒活性炭选择、使用及更换技术规范
- 钣金与铆接实训常用量具课件
- 城市轨道交通智慧车站认知课件
- 矿产资源开发合作框架协议书范本
- 2024风力发电场后评价及改造技术规范
- 粮食应急预案与应急演练
- 延长石油招聘笔试试题
- 项目实施、验收组织方案
- 《我爱上班》朗诵稿
- 名著导读《水浒传》教学设计-部编版语文九年级上册
评论
0/150
提交评论