y87797215 发表于 2012-4-16 12:42:43

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]
查看完整版本: at45db021d用不起来,求助