at45db021d用不起来,求助
我用的lpc2132的,参照的是at45db021b的驱动函数,程序如下:/********************************************************************************
* *
* ATML AT45DB021B FLASH 操作函数 *
* 2007年4月28日调试成功 *
* 编写:周思友 *
*********************************************************************************/
#include "flash.h"
uint8 DF_buffer={1,2};
uint8 DF_buffer2;
//OK FLASH RESET
void FlashReset (void)
{
uint8 i=255;
DF_RST_0;
while(i--);
DF_RST_1;
DF_wait_busy();
}
//OK往SPI口写一个字节的数据
uint8 write_SPI(uint8 byte)
{
uint8 bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
if (byte>=0x80)
MOSI11_1; //Data=1;
else
MOSI11_0; //Date=0;
byte=byte<<1;
SCK11_1; //CLK1=1;
byte |= MISO_IN;
SCK11_0; //CLK1=0;
}
return(byte); // return read uint8
}
//OK格式化主存储器以block(0~127)为单位删除所有页数据)
void DF_format(void)
{
uint8 i;
for (i=0;i<128;i++) //循环擦除0~127总共128块
{
DF_wait_busy();
DF_SELECT_1;
write_SPI(BLOCK_ERASE);
write_SPI(i>>4);
write_SPI(i<<4);
write_SPI(0x00);
DF_DESELECT_1;
}
}
//OK擦除指定的主存储器页(地址范围0-1023)
void DF_page_earse(uint32 page)
{
DF_wait_busy();
DF_SELECT_1;
write_SPI(PAGE_ERASE);
write_SPI((uint8)(page >> 7));
write_SPI((uint8)(page << 1));
write_SPI(0x00);
DF_DESELECT_1;
}
//OK将保存在数组DF_buffer[]中的一页数据写入第二缓冲区后送入主存储区
//(先擦除后写入模式,页地址范围0-1023)
void DF_write_page(uint32 page)
{
uint32 i;
DF_wait_busy();
DF_SELECT_1;
write_SPI(BUFFER_2_WRITE);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for (i=0;i<264;i++)
write_SPI(DF_buffer);
DF_DESELECT_1;
if (page<1024)
{
DF_SELECT_1;
write_SPI(B2_TO_MM_PAGE_PROG_WITH_ERASE);
write_SPI((uint8)(page>>7));
write_SPI((uint8)(page<<1));
write_SPI(0x00);
DF_DESELECT_1;
DF_wait_busy();
}
}
//OK将指定主存储器页的数据转入第一缓冲区后读出,保存在DF_buffer[]数组中
//(页地址范围0-1023)
void DF_read_page(uint32 page)
{
uint32 i;
DF_wait_busy();
DF_SELECT_1;
write_SPI(MM_PAGE_TO_B1_XFER);
write_SPI((uint8)(page >> 7));
write_SPI((uint8)(page << 1));
write_SPI(0x00);
DF_DESELECT_1;
DF_wait_busy();
DF_SELECT_1;
write_SPI(BUFFER_1_READ);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for (i=0;i<264;i++)
{
DF_buffer2=write_SPI(0xFF);
}
DF_DESELECT_1;
}
//OK以直接读取方式读取指定的主存储器页数据(页地址范围0-1025)
void DF_mm_read_page(uint32 page)
{
uint32 i;
DF_wait_busy();
DF_SELECT_1;
write_SPI(MAIN_MEMORY_PAGE_READ);
write_SPI((uint8)(page >> 7));
write_SPI((uint8)(page << 1));
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for (i=0;i<264;i++)
{
DF_buffer2=write_SPI(0x00);
}
DF_DESELECT_1;
}
//OK读取状态寄存器
// bit7 bit6 bit6 bit6 bit6 bit6 bit6 bit6
//RDY/BUSY COMP 0 1 0 1 x x
uint8 DF_read_reg(void)
{
uint8 temp;
DF_SELECT_1;
write_SPI(READ_STATE_REGISTER);
write_SPI(0x00);
write_SPI(0x00);
temp=write_SPI(0x00);
temp=write_SPI(0x00);
DF_DESELECT_1;
return temp;
}
//OK检查状态寄存器最高位是否为忙,并等待空闲
void DF_wait_busy(void)
{
uint8 state_reg=0x00;
DF_SELECT_1;
write_SPI(READ_STATE_REGISTER);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
while((state_reg&0x80) == 0)
{
state_reg=write_SPI(0x00);
}
DF_DESELECT_1;
}
//OK将指定主存储器页的数据转入指定缓冲区
void DF_mm_to_buf(uint8 buffer,uint32 page)
{
DF_wait_busy();
DF_SELECT_1;
if (buffer==1)
write_SPI(MM_PAGE_TO_B1_XFER);
else
write_SPI(MM_PAGE_TO_B2_XFER);
write_SPI((uint8)(page >> 7));
write_SPI((uint8)(page << 1));
write_SPI(0x00);
DF_DESELECT_1;
}
//OK读取指定缓冲区指定单元的数据,保存在DF_buffer[]数组中
uint8 DF_read_buf(uint8 buffer,uint32 start_address,uint32 length)
{
uint32 i;
if ((264-start_address)>=length)
{
DF_wait_busy();
DF_SELECT_1;
if (buffer==1)
write_SPI(BUFFER_1_READ);
else
write_SPI(BUFFER_2_READ);
write_SPI(0x00);
write_SPI((uint8)(start_address >> 8));
write_SPI((uint8)start_address);
write_SPI(0x00);
for (i=0;i<length;i++)
{
DF_buffer2 =write_SPI(0xFF);
}
DF_DESELECT_1;
return 1;
}
else
return 0;
}
//OK将DF_buffer[]数组中指定长度的数据写入指定缓冲区
uint8 DF_write_buf(uint8 buffer,uint32 start_address,uint32 length)
{
uint32 i;
if((264-start_address)>=length)
{
DF_wait_busy();
DF_SELECT_1;
if (buffer==1)
write_SPI(BUFFER_1_WRITE);
else
write_SPI(BUFFER_2_WRITE);
write_SPI(0x00);
write_SPI((uint8)(start_address >> 8));
write_SPI((uint8)start_address);
for (i=0;i<length;i++)
write_SPI(DF_buffer);
DF_DESELECT_1;
return 1;
}
else
return 0;
}
//0K将指定缓冲区中的数据写入主存储区的指定页
void DF_buf_to_mm(uint8 buffer,uint32 page)
{
DF_wait_busy();
if (page<1024)
{
DF_SELECT_1;
if (buffer==1)
write_SPI(B1_TO_MM_PAGE_PROG_WITH_ERASE);
else
write_SPI(B2_TO_MM_PAGE_PROG_WITH_ERASE);
write_SPI((uint8)(page>>7));
write_SPI((uint8)(page<<1));
write_SPI(0x00);
DF_DESELECT_1;
}
}
正在慢慢看,但是时间又点来不及了,哪位大哥有程序的给我参考下吧
页:
[1]