flashat45db161d驱动模块源码CWord格式.docx
- 文档编号:21676800
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:18
- 大小:19.26KB
flashat45db161d驱动模块源码CWord格式.docx
《flashat45db161d驱动模块源码CWord格式.docx》由会员分享,可在线阅读,更多相关《flashat45db161d驱动模块源码CWord格式.docx(18页珍藏版)》请在冰豆网上搜索。
版本:
V1.0
修改及日期:
*******************************************************************************/
#include<
STC15F2K60S2.H>
string.h>
#include"
../delay.h"
../uart.h"
../stc_spi.h"
#define__DELCALE_IN_THIS_FILE__
at45db161d.h"
//#defineDEBUG_THIS_MODULE
#if0//defDEBUG_THIS_MODULE
#defineDEBUG_uart1_Sendbuf(buffer,bytes16)uart1_Sendbuf(buffer,bytes16)
#defineDEBUG_uart1_SendString(str)uart1_SendString(str)
#defineDEBUG_uart1_SendByte(dat8)uart1_SendByte(dat8)
#else
#defineDEBUG_uart1_Sendbuf(buffer,bytes16)
#defineDEBUG_uart1_SendString(str)
#defineDEBUG_uart1_SendByte(dat8)
#endif
///////////////////////////////////////////移植相关///////////////////////////////////////////////////////////////////////////
#defineSPI_CSP12//外部flashSPI使能信号
#defineSelect_Flash()SPI_CS=0
#defineUnSelect_Flash()SPI_CS=1
#definewrite1Byte(x)spi_WriteRead1Byte(x)
#defineread1Byte()spi_WriteRead1Byte(0)
///////////////////////////////////////////FLASH操作命令///////////////////////////////////////////////////////////////////////////
#definePAGE_TO_B1_XFER0x53//mainmemorypagetobuffer1transfer
#definePAGE_TO_B2_XFER0x55//mainmemorypagetobuffer2transfer
#definePAGE_TO_B2_COMP0x61//mainmemorypagecomparetobuffer2
#defineB2_TO_PAGE_WITH_ERASE0x86//buffer2tomainmemorypageprogramwithbuilt-inerase
#defineSTATUS_REGISTER0xD7
#defineBUFFER_1_READ0xD1//D4buffer1read(changeto0xD4forSPImode0,3)
#defineFLASH_CMD_ReadID0x9f//读取芯片32位ID.
#defineBUFFER_2_WRITE0x87//buffer2write
#defineBUFFER_2_READ0xD3//D6buffer2read(changeto0xD6forSPImode0,3)
///////////////////////////////////////////纯软件部分///////////////////////////////////////////////////////////////////////////
typedefstruct
{
UINT16pageIdRead;
//[0~4095]当前读的页地址
UINT16pageIdWrite;
//[0~4095]当前写的页地址
}T_FlashCtrl;
staticT_FlashCtrlctl;
typedefenum
E_ReadBuffer,
E_WriteBuffer
}ET_BufReadWrite;
/****************************************************************************************
*Function:
检测并等待器件忙状态
*Description:
过读状态寄存器来检测忙状态
*Calls:
-
*Input:
*Output:
*Return:
*****************************************************************************************/
staticvoidFLASH_Wait_Busy(void)
Select_Flash();
write1Byte(STATUS_REGISTER);
while
(1)
{
if(read1Byte()&
0x80)//读取的最高位1时器件忙
break;
}
UnSelect_Flash();
}
缓冲区(writebuffer)数据与FLASH指定页比较
状态寄存器bit6为0表示比较数据想匹配,1表示比较数据不相匹配
TRUE不相同
FALSE相同
staticUINT8flash_buffer_compareUnsame(UINT16page)
write1Byte(PAGE_TO_B2_COMP);
write1Byte((UINT8)(page>
>
6));
write1Byte((UINT8)(page<
<
2));
write1Byte(0x00);
FLASH_Wait_Busy();
if(read1Byte()&
0x40)//读取的比较状态位
UnSelect_Flash();
return1;
else
return0;
/****************************************************************
原型:
功能:
从flash里读给定page的数据到flash的部ram.
入参:
uintpageflash的页,[0~4095]
ET_BufReadWritebufferType
出参:
运行环境:
调用说明:
作者:
****************************************************************/
staticvoidLoad_Page_To_Buffer(UINT16page,ET_BufReadWritebufferType)
write1Byte(bufferType==E_ReadBuffer?
PAGE_TO_B1_XFER:
PAGE_TO_B2_XFER);
将"
写缓冲区容"
写入到主存储器中指定页
-页地址,缓冲区
*****************************************************************************************/
staticvoidWrite_Page_From_Buffer(UINT16page)
write1Byte(B2_TO_PAGE_WITH_ERASE);
//don'
tcare
从读缓冲区读数据(BUFFER1),读出字节可选
-页字节地址,缓冲接收数组,读数据长度
staticvoidRead_DataFromFlashBuffer(uintaddr,UINT8*dat,UINT16bytes)
uinti;
write1Byte(BUFFER_1_READ);
write1Byte((UINT8)(addr>
8));
write1Byte((UINT8)addr);
for(i=0;
i<
bytes;
i++)
dat[i]=read1Byte();
staticvoidRead_DataFromWriteBuffer(uintaddr,UINT8*dat,UINT16bytes)
write1Byte(BUFFER_2_READ);
将数据写入写缓冲区(BUFFER2),写入字节可选
;
-页字节地址,缓冲发送数组,写读数据长度
staticvoidWrite_Data2FlashBuffer(uintaddr,UINT8*dat,UINT16bytes)
write1Byte(BUFFER_2_WRITE);
write1Byte(dat[i]);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//以下是全局函数
voidflash_init(void)
memset(&
ctl,0,sizeof(ctl));
Load_Page_To_Buffer(ctl.pageIdWrite,E_WriteBuffer);
Load_Page_To_Buffer(ctl.pageIdRead,E_ReadBuffer);
BOOLflash_write_ok(UINT32addr,UINT8*buf,UINT16bytes)
把数据写到flash的绝对地址中,可能只是写到其buf里面.
约定:
任何时候的ctl.pageIdWrite所对应的页都会被读到相应writebuf里,并且只可能比flash里新.
UINT32addrflash的绝对字节地址(0~2MByte,每个page最后16字节不要,但认为是连续的2MBytes)
UINT8*buf等待保存的数据
UINT16bytes要保存数据字节数
TRUE写成功
FALSE写失败,地址越界
BOOLflash_write_ok(UINT32addr,UINT8*buf,UINT16bytes)
UINT16page=addr/BYTES_PER_PAGE;
UINT16beginAddr=addr%BYTES_PER_PAGE;
UINT8bytes_will_write;
if(addr>
=FLASH_TOTAL_BYTES||addr+bytes>
FLASH_TOTAL_BYTES)returnFALSE;
DEBUG_uart1_SendString("
FFWWBBBB\r\n"
);
if(page!
=ctl.pageIdWrite)//写的不是当前页,先保存当前页到flash.
DEBUG_uart1_SendString("
FFWW0000\r\n"
DEBUG_uart1_Sendbuf((UINT8*)&
page,sizeof(page));
ctl.pageIdWrite,sizeof(ctl.pageIdWrite));
Write_Page_From_Buffer(ctl.pageIdWrite);
ctl.pageIdWrite=page;
while(beginAddr+bytes>
BYTES_PER_PAGE)
{//超出原来的页
FFWW1111\r\n"
beginAddr,sizeof(beginAddr));
bytes,sizeof(bytes));
bytes_will_write=BYTES_PER_PAGE-beginAddr;
Write_Data2FlashBuffer(beginAddr,buf,bytes_will_write);
if(flash_buffer_compareUnsame(ctl.pageIdWrite))
{
DEBUG_uart1_SendString("
FFWW2222\r\n"
Write_Page_From_Buffer(ctl.pageIdWrite);
}
buf+=bytes_will_write;
bytes-=bytes_will_write;
beginAddr=0;
ctl.pageIdWrite++;
if(bytes!
=0)
FFWW3333\r\n"
DEBUG_uart1_Sendbuf(buf,bytes);
Write_Data2FlashBuffer(beginAddr,buf,bytes);
returnTRUE;
UINT16flash_read(UINT32addr,UINT8*savebuf,UINT16bytes)
从flash的绝对地址中,读出特定的字节数,可能只是读readbuffer,也可能两个都读.
实际读成功的字节数.
UINT16flash_read(UINT32addr,UINT8*savebuf,UINT16bytes)
UINT16beginAddr=addr%BYTES_PER
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- flashat45db161d 驱动 模块 源码