⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at45db021b ò»

📁 AT45DB021B的C51驱动程序
💻
字号:
                /***************************/
                /*   atmel dataflash       */
                /****AT45DB021B 驱动程序****/
                /***************************/
                /****模拟SPI端口驱动方式****/
                /*copyright GreenStar  2002*/
 //擦除 第 page_addr 页
void erase_page(unsigned int idata page_addr)
{
        unsigned int idata a;
        a=page_addr;
        a<<=1;
        send_byte(0x81);
        send_byte((unsigned char)(a>>8));
        send_byte((unsigned char)(a));
        send_byte(0x00);
        flash_cs=1;
        waitNms(8);
}
//模拟SPI数据输出
void send_byte(unsigned char a)
{
        unsigned char idata i;
        flash_sck=0;
        flash_cs=0;
        for (i=0;i<8;i++)
        {
                a<<=1;
                flash_si=CY;
                flash_sck=1;
                flash_sck=0;
        }
}
//模拟SPI数据输入
unsigned char get_byte()
{
        unsigned char idata i,d=0;
        flash_cs=0;
        flash_sck=0;
        for(i=8;i>0;i--)
        {
                flash_sck=1;
                flash_sck=0;
                d=2*d+(unsigned char)flash_so;
        }
        return(d);
}
//读状态寄存器
unsigned char flash_status() 
{
        unsigned char idata d;
        send_byte(0x57);
        d=get_byte();
        flash_cs=1;
        return(d);
}
//写缓冲
void flash_buff_write(unsigned char idata index ,unsigned int idata star_addr,
                      unsigned int idata len,unsigned char idata *buffer)
{
       unsigned char idata  i;
       send_byte(0x84+index*3);         //缓冲区1为84H  缓冲区2为87H
       send_byte(0x00);
       send_byte((unsigned char)(star_addr>>8));
       send_byte((unsigned char)star_addr);

       for (i=0;i<len;i++)
           send_byte(buffer[i]);

       flash_cs=1;
}
//读缓冲
void flash_buff_read(unsigned char idata index ,unsigned int idata star_addr,
                     unsigned int idata len, unsigned char idata *buffer)
{                                       
       unsigned char idata i;
       send_byte(0x54+index*2); //缓冲区1为54H  缓冲区2为56H
       send_byte(0x00);
       send_byte((unsigned char)(star_addr>>8));
       send_byte((unsigned char)star_addr);
       send_byte(0x00);

       for (i=0;i<len;i++)
           buffer[i]=get_byte();
       flash_cs=1;
}
// buff1 给第page页//
void flash_prog_no_erase(unsigned int idata page) 
{
        unsigned long idata a;
        a=page;
        a<<=9;
        send_byte(0x88);
        send_byte((unsigned char)(a>>16));
        send_byte((unsigned char)(a>>8));
        send_byte(0x00);
        flash_cs=1;
        waitNms(16);
}
//读取指定页
void flash_read(unsigned int idata star_page,unsigned int idata star_addr,
                unsigned int idata len, unsigned char idata *in_out)
{
        unsigned char idata i;
        unsigned long idata a=0;
        a=star_page;
        a<<=9;
        a=a+star_addr;
        send_byte(0x68);
        send_byte((unsigned char)(a>>16));
        send_byte((unsigned char)(a>>8));
        send_byte((unsigned char)a);

        send_byte(0x00);
        send_byte(0x00);
        send_byte(0x00);
        send_byte(0x00);

        for (i=0;i<len;i++)
            in_out[i]=get_byte();
        flash_cs=1;
}
//页比较
void flash_buf_comp(unsigned int idata page)
{
        unsigned long idata a;
        a=page;
        a<<=9;
        send_byte(0x60);
        send_byte((unsigned char)(a>>16));
        send_byte((unsigned char)(a>>8));
        send_byte(0x00);
        flash_cs=1;
        waitNms(1);
}
//将FLASH 指定页复制到缓冲
void flash_pageto_buffer(unsigned char idata index,unsigned int idata page_addr)
{
        unsigned long idata a=0;
        a=page_addr;
        a<<=9;
        send_byte(0x53+index*2);
        send_byte((unsigned char)(a>>16));
        send_byte((unsigned char)(a>>8));
        send_byte((unsigned char)a);
        flash_cs=1;
        NOP1ms;
}
//将缓冲写入FLASH
void flash_write(unsigned int idata star_page,unsigned int idata star_addr,
                 unsigned int idata len, unsigned char idata *in_out)
{
         unsigned char idata c,d;
         flash_pageto_buffer(0x00,star_page);
         erase_page(star_page);
         flash_buff_write(0x00,star_addr,len,in_out);
         flash_prog_no_erase(star_page);
}
//延时 Nms
void waitNms(unsigned char idata n) 
{
        unsigned char idata i,ii;
        for(i=n;i>0;i--)
        for (ii=100;ii>0;ii--)
        {
                _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();    
        }
}


//测试段
void main()
{
         unsigned char idata a,i,j;
         unsigned char idata buff1[66];
         unsigned int idata d;
  
       
         erase_page(1);
         flash_buff_write(0x00,10,0x08,buff1);
         flash_prog_no_erase(1);
         flash_pageto_buffer(0,1);
         flash_buf_comp(1);
         flash_read(1,10,8,buff2);
         c=flash_status();

         a=10;
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -