flashat45db161d驱动模块源码CWord格式.docx

上传人:b****6 文档编号:21676800 上传时间:2023-01-31 格式:DOCX 页数:18 大小:19.26KB
下载 相关 举报
flashat45db161d驱动模块源码CWord格式.docx_第1页
第1页 / 共18页
flashat45db161d驱动模块源码CWord格式.docx_第2页
第2页 / 共18页
flashat45db161d驱动模块源码CWord格式.docx_第3页
第3页 / 共18页
flashat45db161d驱动模块源码CWord格式.docx_第4页
第4页 / 共18页
flashat45db161d驱动模块源码CWord格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

flashat45db161d驱动模块源码CWord格式.docx

《flashat45db161d驱动模块源码CWord格式.docx》由会员分享,可在线阅读,更多相关《flashat45db161d驱动模块源码CWord格式.docx(18页珍藏版)》请在冰豆网上搜索。

flashat45db161d驱动模块源码CWord格式.docx

版本:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1