搜索
bottom↓
回复: 0

at45db021d用不起来,求助

[复制链接]

出0入0汤圆

发表于 2012-4-16 12:42:43 | 显示全部楼层 |阅读模式
我用的lpc2132的,参照的是at45db021b的驱动函数,程序如下:
/********************************************************************************
*                                                                               *
*                 ATML AT45DB021B FLASH 操作函数                                                                *
*                      2007年4月28日调试成功                                                                        *
*                         编写:周思友                                                                                        *
*********************************************************************************/
#include "flash.h"


uint8 DF_buffer[264]={1,2};
uint8 DF_buffer2[264];
//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[i]);
        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[i]=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[i]=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[i] =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[i]);
                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;
        }
}

正在慢慢看,但是时间又点来不及了,哪位大哥有程序的给我参考下吧

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表