📄 at45db161.c
字号:
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 write_page(uint16 page,uint16 paddr,uint8 buf,uint16 number,uint8 *sp)//
{
uint8 i;
// uint32 read_cnt=0;
while(1)
{
i=status_read();
if(i&0x80) break;
// if(++read_cnt > read_cnt) return(FALSE);
}
IO3CLR |= SPICE0;
if(buf) spi_write(0x85);
else spi_write(0x82);
spi_write(page>>6);
i=page<<2;
i+=paddr>>8;
spi_write(i);
spi_write(paddr);
for(;number!=0;number--)
{
spi_write(*sp);
sp++;
}
IO3SET |= SPICE0;
return(TRUE);
}
/*********************************************************************************************************
** Function name: page_erase
**
** Descriptions: 页擦除
**
** input parameters: uint16 page :页编号
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 flash_page_erase(uint16 page)//
{
uint8 i;
// uint32 read_cnt=0;
// uint8 err;
// OSMutexPend(SPIMutex,0,&err);
while(1)
{
i=status_read();
if(i&0x80) break;
// if(++read_cnt > read_cnt)
// {
//OSMutexPost(SPIMutex);
// return(FALSE);
// }
}
IO3CLR |= SPICE0;
spi_write(0x81);
spi_write(page>>6);
i=page<<2;
spi_write(i);
spi_write(0);
IO3SET |= SPICE0;
// OSMutexPost(SPIMutex);
return(TRUE);
}
/*********************************************************************************************************
** Function name: block_erase
**
** Descriptions: 块擦除
**
** input parameters: uint16 block :块编号
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 flash_block_erase(uint16 block)//
{
uint8 i;
// uint32 read_cnt=0;
// OSMutexPend(SPIMutex,0,&i);
while(1)
{
i=status_read();
if(i&0x80) break;
// if(++read_cnt > read_cnt)
// {
// OSMutexPost(SPIMutex);
// return(FALSE);
// }
}
IO3CLR |= SPICE0;
spi_write(0x50);
spi_write(block>>3);
i=block<<5;
spi_write(i);
spi_write(0);
IO3SET |= SPICE0;
// OSMutexPost(SPIMutex);
return(TRUE);
}
/*********************************************************************************************************
** Function name: auto_page_rewrite
**
** Descriptions: auto_page_rewrite
**
** input parameters: uint16 page :页编号 uint8 buf:buf号
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 auto_page_rewrite(uint16 page,uint8 buf)
{
uint8 i;
// uint32 read_cnt=0;
while(1)
{
i=status_read();
if(i&0x80) break;
// if(++read_cnt > read_cnt) return(FALSE);
}
IO3CLR |= SPICE0;
if(buf) spi_write(0x59);
else spi_write(0x58);
spi_write(page>>6);
i=page<<2;
spi_write(i);
spi_write(0);
IO3SET |= SPICE0;
return(TRUE);
}
/*********************************************************************************************************
** Function name: buf_read
**
** Descriptions: buf read
**
** input parameters: uint8 buf:buf号 uint16 paddr: buf内部地址
uint16 number :数据个数 uint8 *dp:目的数据指针
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 buf_read(uint8 buf,uint16 paddr,uint16 number,uint8 *dp)//
{
uint8 i;
// uint32 read_cnt=0;
while(1)
{
i=status_read();
if(i&0x80) break;
// if(++read_cnt > read_cnt) return(FALSE);
}
IO3CLR |= SPICE0;
if(buf) spi_write(0xD6);
else spi_write(0xD4);
spi_write(0);
spi_write(paddr>>8);
spi_write(paddr);
spi_write(0);
for(;number!=0;number--)
{
*dp=spi_read();
dp++;
}
IO3SET |= SPICE0;
return(TRUE);
}
/*********************************************************************************************************
** Function name: buf_write
**
** Descriptions: buf_write
**
** input parameters: uint8 buf:buf号 uint16 paddr: buf内部地址
uint16 number :数据个数 uint8 *sp:源数据指针
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static uint8 buf_write(uint8 buf,uint16 paddr,uint16 number,uint8 *sp)//
{
uint8 i;
// uint32 read_cnt=0;
while(1)
{
i=status_read();
if(i&0x80) break;
// if(++read_cnt > read_cnt) return(FALSE);
}
IO3CLR |= SPICE0;
if(buf) spi_write(0x87);
else spi_write(0x84);
spi_write(0);
spi_write(paddr>>8);
spi_write(paddr);
for(;number!=0;number--)
{
spi_write(*sp);
sp++;
}
IO3SET |= SPICE0;
return(TRUE);
}
/*********************************************************************************************************
** Function name: flash_page_write
**
** Descriptions: port funtion flash_page_write
**
** input parameters: page:扇区编号 sp :源数据指针 num:数据个数
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/08/23
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 flash_page_write(uint16 page,uint16 num,uint8 * sp)
{
uint8 err;
if(num == 0 || num > 512)
return(0);
//OSMutexPend(SPIMutex,0,&err);
page_to_buf(page,0);
err = write_page(page,0,0,num,sp);
//OSMutexPost(SPIMutex);
return(err);
}
/*********************************************************************************************************
** Function name: flash_read
**
** Descriptions: port funtion flash_read
**
** input parameters: uint32 addr: flash addr uint16 number:欲读数据个数
uint8 *dp:目的数据指针
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void flash_read(uint32 addr,uint16 number,uint8 *dp)
{
//uint8 err;
uint16 i;
uint16 j;
if(number == 0) return;
// OSMutexPend(SPIMutex,0,&err);
i=addr/512;
j=addr%512;
if(j+number>512)
{
array_read(i,j,512-j,dp);
dp+=(512-j);
number-=(512-j);
i++;
while(1)
{
if(number>512)
{
array_read(i,0,512,dp);
dp+=512;
number-=512;
i++;
}
else
{
array_read(i,0,number,dp);
break;
}
}
}
else
{
array_read(i,j,number,dp);
}
// OSMutexPost(SPIMutex);
}
/*********************************************************************************************************
** Function name: flash_write
**
** Descriptions: port funtion flash_write
**
** input parameters: uint32 addr: flash addr uint16 number:欲读数据个数
uint8 *sp:源数据指针
** Returned value: 0 失败 1 成功
**
** Used global variables: None
** Calling modules: None
**
** Created by: winfeng
** Created Date: 2005/07/12
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void flash_write(uint32 addr,uint16 cnt,uint8 *p)
{
uint16 i;
uint16 j;
//uint8 err;
if(cnt == 0 ) return;
// OSMutexPend(SPIMutex,0,&err);
i=addr/512;
j=addr%512;
if(j+cnt>512)
{
page_to_buf(i,0);
write_page(i,j,0,512-j,p);
p+=(512-j);
cnt-=(512-j);
i++;
for(;;)
{
if(cnt>512)
{
page_to_buf(i,0);
write_page(i,0,0,512,p);
cnt-=512;
p+=512;
i++;
}
else
{
page_to_buf(i,0);
write_page(i,0,0,cnt,p);
break;
}
}
}
else
{
page_to_buf(i,0);
write_page(i,j,0,cnt,p);
}
// OSMutexPost(SPIMutex);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -