at45db642 程序代码

AT45DB642操作
本文介绍了一种用于AT45DB642闪存芯片的操作方法,包括初始化写入、读取状态寄存器、擦除块、页面到缓冲区传输等功能。提供了连续读取、缓冲区读取、快速编程等详细指令集。

at45db642_WR.C

 

#include  "main.h"     //#include "at45db642_WR.h"     //================================================================================     //define data and flag moudle     //================================================================================         //==================================================read command     #define       RESERVED_BITS         4     #define       PAGE_ADDRESS_BITS     13     #define       BUFF_ADDRESS_BITS     9     #define       FLASH_READY           BIT7+BIT5+BIT4+BIT3     #define       COMP                  BIT6         const unsigned char CMD_flash_continousread   = 0xE8;  //Continues Array Read  and 60 pluse no care     const unsigned char CMD_flash_continousRead_a = 0x69;  //Continues Array Read  and 61 pluse no care     const unsigned char CMD_flash_mainpagesread   = 0xd2;  //Main Memory Page Read and 60 pluse no care     const unsigned char CMD_flash_mainpagesRead_a = 0x52;  //Main Memory Page Read and 61 pluse no care     const unsigned char CMD_flash_buffer1read     = 0xd4;  // Buffer 1 Read and 1 pules no care     const unsigned char CMD_flash_buffer1Read_a   = 0x54;  // Buffer 1 Read and 2 pules no care     const unsigned char CMD_flash_buffer2read     = 0xd6;  // Buffer 2 Read and 1 pules no care     const unsigned char CMD_flash_buffer2Read_a   = 0x56;  // Buffer 2 Read and 2 pules no care     const unsigned char CMD_flash_registerread    = 0xd7;  // register 1 Read and 0 pules no care     const unsigned char CMD_flash_registerRead_a  = 0x57;  // register 1 Read and 1 pules no care     //------------------------------------------------write command     const unsigned char CMD_flash_buffer1thmain   = 0x82; // Main Memory Page Program through Buffer 1      const unsigned char CMD_flash_buffer1thmain_f = 0x92; // Main Memory Page Program through Buffer 1 ,fast programme     const unsigned char CMD_flash_buffer2thmain   = 0x85; // Main Memory Page Program through Buffer 2     const unsigned char CMD_flash_buffer2thmain_f = 0x95; // Main Memory Page Program through Buffer 2 ,fast programme         const unsigned char CMD_flash_page_erase      = 0x81; //page erase     const unsigned char CMD_flash_block_erase     = 0x50; //block erase     const unsigned char CMD_flash_buffer1_write   = 0x84; // Buffer1 Write     const unsigned char CMD_flash_buffer2_write   = 0x87; // Buffer2 Write         const unsigned char CMD_flash_buffer1tomain_e  = 0x83; // Buffer1 to Main Memory Page Program with Built-in Erase     const unsigned char CMD_flash_buffer2tomain_e  = 0x86; // Buffer2 to Main Memory Page Program with Built-in Erase     const unsigned char CMD_flash_buffer1tomain    = 0x88; // Buffer1 to Main Memory Page Program without Built-in Erase     const unsigned char CMD_flash_buffer2tomain    = 0x89; // Buffer2 to Main Memory Page Program without Built-in Erase     const unsigned char CMD_flash_buffer1tomain_ef = 0x93; // Buffer1 to Main Memory Page Program with Built-in Erase ,fast programme     const unsigned char CMD_flash_buffer2tomain_ef = 0x96; // Buffer2 to Main Memory Page Program with Built-in Erase ,fast programme     const unsigned char CMD_flash_buffer1tomain_f  = 0x98; // Buffer1 to Main Memory Page Program without Built-in Erase ,fast programme     const unsigned char CMD_flash_buffer2tomain_f  = 0x99; // Buffer2 to Main Memory Page Program without Built-in Erase ,fast programme     //-----------------------------------------------additional command     const unsigned char CMD_flash_maintobuffer1    = 0x53; // Main Memory Page to Buffer 1     const unsigned char CMD_flash_maintobuffer2    = 0x55; // Main Memory Page to Buffer 2     const unsigned char CMD_flash_maincmpbuffer1   = 0x60; // Main Memory Page to Buffer 1 compare     const unsigned char CMD_flash_maincmpbuffer2   = 0x61; // Main Memory Page to Buffer 2 compare     const unsigned char CMD_flash_rewritethbuffer1 = 0x58; // Auto Page Rewrite through Buffer 1     const unsigned char CMD_flash_rewritethbuffer2 = 0x59; // Auto Page Rewrite through Buffer 2         //-------------------------------         #define       CLOCK_DELAY()           _NOP();_NOP();_NOP()     #define       SET_FLASH_CS_LOW()      at45db642ctr_out &= ~cs_ctr;CLOCK_DELAY()         #define       SET_FLASH_CS_HIGH()     at45db642ctr_out |= cs_ctr;CLOCK_DELAY()         #define       SET_FLASH_PORT_OUT()    at45db642io_dir = 0xff     #define       SET_FLASH_PORT_INPUT()     at45db642io_dir = 0x0     //-------------------------------     unsigned char check_busy(void);    void write_a_Byte(unsigned char w_type);    void write_nocareBit(unsigned short nocare_number);    void  write_comand(unsigned char cmd,unsigned short adr_page,unsigned short buffer);        ////////////////////////////////////////////////////////////////////////////////////////////     //=============================================================================================     //this is a subcountine  for read and write a programme     //--------------------------------------         unsigned char Intialize_Write_at45db642memory(void)    {            unsigned short j;            if(Error_Code>RESULT_READY)return(Error_Code);                        at45db642ctr_sel &= ~(parall_ctr + busy_ctr +cs_ctr);                                     at45db642spi_dir |= clk_ctr;            at45db642spi_out |= clk_ctr;                                 at45db642io_sel = 0x00;            at45db642io_dir = 0xff;            at45db642io_out = 0x00;              //built on output port                          at45db642ctr_dir |= parall_ctr;      //select the parall port for transmit                 at45db642ctr_dir |= cs_ctr;            CLOCK_DELAY();                        at45db642ctr_dir &= ~busy_ctr;            at45db642ctr_out &= ~busy_ctr;            //--------------------------                 CLOCK_DELAY();            at45db642spi_sel &= ~clk_ctr;         //spi mode at45db642spi_sel |= clk_ctr;             at45db642spi_dir |= clk_ctr;            at45db642spi_out &= ~clk_ctr;         //clk =0                   //-----------------------------             CLOCK_DELAY();                        at45db642ctr_out &= ~parall_ctr;            at45db642ctr_out |= cs_ctr;        //cs = 1    """""""""""\_________________             at45db642spi_out &= ~clk_ctr;      //clk = 0  _____________|""|__|""|______                      for(j=1000;j>0;j--);               Error_Location=1;            if((Read_Status()&FLASH_READY)!=FLASH_READY)return(ERROR_FLASH_BUSY);            return(NO_ERROR);                }        ////////////////////////////////////////////////////////////////////////////////////////////////////////     unsigned char Wait_busy(void)    {            unsigned short j;            if(Error_Code>RESULT_READY)return(Error_Code);            for(j=10000;j>0;j--)if(check_busy()==0)return(NO_ERROR);   /// check flash ready             Error_Location=5;            return(ERROR_FLASH_BUSY);    }        ////////////////////////////////////////////////////////////////////////////////////////////////////////read a stutes register     unsigned char Read_Status(void)    {            unsigned char cmd_adr[1];            unsigned char i;            cmd_adr[0] = CMD_flash_registerread;  //no add pulse//60             //----------------------------------------             SET_FLASH_PORT_OUT();            SET_FLASH_CS_LOW();                        write_a_Byte(cmd_adr[0]);                SET_FLASH_PORT_INPUT();            i = Read_a_Byte();            SET_FLASH_CS_HIGH();            return (i);    }    //-------------------------------     //-------------------------------     //////////////////////////////////////////////////////////////////////////////////////     unsigned char Erease_Block(unsigned short BlockNo)    {            if(Error_Code>RESULT_READY)return(Error_Code);            //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);             write_comand(CMD_flash_block_erase,0,0);            SET_FLASH_CS_HIGH();            return(NO_ERROR);    }        //////////////////////////////////////////////////////////////////////////////////////     unsigned char Transfer_Page_to_Buffer(unsigned char bufferNo,unsigned short adr_page)    {            unsigned char cmd;            if(Error_Code>RESULT_READY)return(Error_Code);            //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);             if(bufferNo==0)cmd = CMD_flash_maintobuffer1;            else cmd = CMD_flash_maintobuffer2;                        write_comand(cmd,adr_page,0);            SET_FLASH_CS_HIGH();            return(NO_ERROR);    }        //////////////////////////////////////////////////////////////////////////////////////     unsigned char Compare_Page_to_Buffer(unsigned char bufferNo,unsigned short adr_page)    {       unsigned char cmd;            if(Error_Code>RESULT_READY)return(Error_Code);            //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);             if(bufferNo==0)cmd = CMD_flash_maintobuffer1;            else cmd = CMD_flash_maintobuffer2;                        write_comand(cmd,adr_page,0);            SET_FLASH_CS_HIGH();            return(NO_ERROR);    }        //////////////////////////////////////////////////////////////////////////////////////     unsigned char Auto_Page_rewrite(unsigned char bufferNo,unsigned short adr_page)    {            unsigned char cmd;            if(Error_Code>RESULT_READY)return(Error_Code);                    //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);             if(bufferNo==0)cmd = CMD_flash_rewritethbuffer1;            else cmd = CMD_flash_rewritethbuffer2;                        write_comand(cmd,adr_page,0);                        SET_FLASH_CS_HIGH();                        return(NO_ERROR);    }        /////////////////////////////////////////////////////////////////////////////////////////////////////////     unsigned char Start_Continuous_Array_Read(unsigned short adr_page,unsigned short adr_buffer)    {            if(Error_Code>RESULT_READY)return(Error_Code);            //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);  /// check flash ready             write_comand(CMD_flash_continousRead_a,adr_page,adr_buffer);            write_nocareBit(60);                          //write no care             SET_FLASH_PORT_INPUT();            Read_a_Byte();            return(NO_ERROR);    }        void    End_Continuous_Array_Read(void)    {            SET_FLASH_CS_HIGH();    }        ///////////////////////////////////////////////////////////////////////////////////////////////////read a type from buffer1     unsigned char Read_nByte_buffer(unsigned char bufferNo,type_datas_toFlash *rdata,unsigned short adr_buffer)    {            unsigned char cmd;            unsigned short i;            unsigned char * data = rdata->data;            unsigned short data_len = rdata->data_len;            if(Error_Code>RESULT_READY)return(Error_Code);                    //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);   /// check flash ready             if(bufferNo==0)cmd = CMD_flash_buffer1read;            else cmd = CMD_flash_buffer2read;                        write_comand(cmd,0,adr_buffer);                    write_nocareBit(0x01);                          //write no care                         SET_FLASH_PORT_INPUT();                for (i = 0; i <DATA_LEN; data="rdata-" * char unsigned i; short { *flash_address) *rdata,type_flash_address Read_nByte_main(type_datas_toFlash } (NO_ERROR); return SET_FLASH_CS_HIGH(); ++data; *data="Read_a_Byte();" i++)>data;            unsigned short data_len = rdata->data_len;                if(Error_Code>RESULT_READY)return(Error_Code);                    //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);   /// check flash ready                         write_comand(CMD_flash_mainpagesread,flash_address->adr_page,flash_address->adr_buffer);            write_nocareBit(60);                          //write no care                         SET_FLASH_PORT_INPUT();                        for (i = 0; i <DATA_LEN; data="rdata-" * char unsigned short { *flash_address) *rdata,type_flash_address } (NO_ERROR); return SET_FLASH_CS_HIGH(); ++data; *data="Read_a_Byte();" i++) i,adr_buff; cmd; bufferNo,type_datas_toFlash Write_mainpage_thr_buffer(unsigned buffer1 throuth pages main to types 1056 write>data;            unsigned short data_len = rdata->data_len;                        if(Error_Code>RESULT_READY)return(Error_Code);                    if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);            Error_Location=4;                    adr_buff=flash_address->adr_buffer;            if(adr_buff>=AT45DB642_BUFFER_LENGTH)return(ERROR_FLASH_BUFFER_ADR);                if(bufferNo==0)cmd = CMD_flash_buffer1thmain;            else cmd = CMD_flash_buffer2thmain;                        write_comand(cmd,flash_address->adr_page,flash_address->adr_buffer);                        for (i = 0 ; i < data_len; i++)            {                    write_a_Byte(*data);                 ++data;                 if(++adr_buff>AT45DB642_BUFFER_LENGTH)                 {                   SET_FLASH_CS_HIGH();                   return(ERROR_FLASH_BUFFER_ADR);                 }            }                            SET_FLASH_CS_HIGH();            return(NO_ERROR);            }        //////////////////////////////////////////////////////////////////////////////////////////////////////write two types to buffer2     unsigned char Write_1byte_to_buffer(unsigned char bufferNo,unsigned char data,unsigned short adr_buffer)    {            unsigned char cmd;            // if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);   /// check flash ready             if(Error_Code>RESULT_READY)return(Error_Code);                    if(adr_buffer>=AT45DB642_BUFFER_LENGTH)return(ERROR_FLASH_BUFFER_ADR);            if(bufferNo==0)cmd = CMD_flash_buffer1_write;            else cmd = CMD_flash_buffer2_write;                        write_comand(cmd,0,adr_buffer);            write_a_Byte(data);                        SET_FLASH_CS_HIGH();                       return(NO_ERROR);    }            ////////////////////////////////////////////////////////////////////////////////////     unsigned char  Write_nbyte_to_buffer(unsigned char bufferNo,type_datas_toFlash *rdata,unsigned short adr_buffer)    {            unsigned char cmd;            unsigned short i;            unsigned char * data = rdata->data;            unsigned short data_len = rdata->data_len;                                if(Error_Code>RESULT_READY)return(Error_Code);                            // if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);  /// check flash ready                     if(adr_buffer>=AT45DB642_BUFFER_LENGTH)return(ERROR_FLASH_BUFFER_ADR);            if(bufferNo==0)cmd = CMD_flash_buffer1_write;            else cmd = CMD_flash_buffer2_write;                write_comand(cmd,0,adr_buffer);            for (i = 0 ; i < data_len; i++)            {                write_a_Byte(*data);                data++;                 if(++adr_buffer>AT45DB642_BUFFER_LENGTH)                 {                   SET_FLASH_CS_HIGH();                   return(ERROR_FLASH_BUFFER_ADR);                 }            }                            SET_FLASH_CS_HIGH();                        return(NO_ERROR);    }        //////////////////////////////////////////////////////////////////////////////////////////////////     unsigned char Write_buffer_to_main_Erase_Fast(unsigned char bufferNo,unsigned short adr_page)    {            unsigned char cmd;            if(Error_Code>RESULT_READY)return(Error_Code);                    //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);                         if(bufferNo==0)cmd = CMD_flash_buffer1tomain_ef;            else cmd = CMD_flash_buffer1tomain_ef;  //no add pulse//60                         write_comand(cmd,adr_page,0);            SET_FLASH_CS_HIGH();                return(NO_ERROR);    }        //////////////////////////////////////////////////////////////////////////////////////////////////     unsigned char Write_buffer_to_main_Erase(unsigned char bufferNo, unsigned short adr_page)    {            unsigned char cmd;            if(Error_Code>RESULT_READY)return(Error_Code);                    //if(Wait_busy()>RESULT_READY)return(ERROR_FLASH_BUSY);                                 if(bufferNo==0)cmd = CMD_flash_buffer1tomain_e;            else cmd = CMD_flash_buffer2tomain_e;  //no add pulse//60                 write_comand(cmd,adr_page,0);            SET_FLASH_CS_HIGH();                            return(NO_ERROR);    }        ///////////////////////////////////////////////////////////////////////////////////////////////////     ////////////////////////////////////////////////////////////////////////////////////////////////     void  write_comand(unsigned char cmd,unsigned short adr_page,unsigned short adr_buff)    {            unsigned char cmd_adr[4];            unsigned short i,j;            cmd_adr[0] = cmd;                        i = adr_page;            i >>= 5;            cmd_adr[1] = i;                        i = adr_page;            i <<= 3;            cmd_adr[2] = i;                i &= 0xf8;            j = adr_buff;            j >>= 8;            j &= 0x07;            i += j;            cmd_adr[2] = i;            cmd_adr[3] = adr_buff;            //----------------------------------------             SET_FLASH_PORT_OUT();            SET_FLASH_CS_LOW();            for (i = 0 ; i < 4; i++)write_a_Byte(cmd_adr[i]);    }        //-------------------------------     unsigned char check_busy(void)    {            if((at45db642ctr_in & busy_ctr)==0)return(1);            return (0);    }    //-------------------------------     void write_a_Byte(unsigned char w_type)    {              at45db642io_out = w_type;            at45db642spi_out |= clk_ctr;    //clk = 1              CLOCK_DELAY();            at45db642spi_out &= ~clk_ctr;   //clk =0     }        //--------------------------------     unsigned char Read_a_Byte(void)    {          unsigned char r_type;          at45db642spi_out |= clk_ctr;    //clk = 1           CLOCK_DELAY();          r_type = at45db642io_in;                  at45db642spi_out &= ~clk_ctr;   //clk =0           return r_type;    }        //--------------------------------     void write_nocareBit(unsigned short nocare_number)    {          unsigned short i;          for  (i = 0; i < nocare_number; i++)          {               at45db642io_out = i;               at45db642spi_out |= clk_ctr;    //clk = 1                 CLOCK_DELAY();               at45db642spi_out &= ~clk_ctr;   //clk =0           }   

}  

 

 

at45db642_WR.h

 

 

 #include "Mem_Global.h"
#ifdefEXTERN
#undefEXTERN
#endif

#ifdefMAIN_INCLUDE
#defineEXTERN 
#else
#defineEXTERN extern
#endif

#ifdef DEFINE_AT45DB642
#else
  #define DEFINE_AT45DB642
  #define       AT45DB642_BUFFER_LENGTH         1024
  #define       AT45DB642_TOTAL_BLOCK      1024
  #define       AT45DB642_TOTAL_PAGE       8192
  #define       AT45DB642_TOTAL_SECTOR     33
#endif 

#define at45db642io_sel    P4SEL
#define at45db642io_dir    P4DIR
#define at45db642io_out    P4OUT
#define at45db642io_in     P4IN

#define clk_ctr            BIT3
#define simo_ctr           BIT1
#define somi_ctr           BIT2
#define at45db642spi_sel   P3SEL
#define at45db642spi_in    P3IN
#define at45db642spi_out   P3OUT
#define at45db642spi_dir   P3DIR

#define at45db642ctr_sel   P2SEL
#define at45db642ctr_dir   P2DIR
#define at45db642ctr_out   P2OUT
#define at45db642ctr_in    P2IN
#define parall_ctr         BIT0
#define cs_ctr             BIT1
#define gnd_ctr            BIT2
#define busy_ctr           BIT3

EXTERN       unsigned char Intialize_Write_at45db642memory(void);
EXTERN       unsigned char Read_Status(void);
EXTERN       unsigned char Wait_busy(void);
EXTERN       unsigned char Read_a_Byte(void);

EXTERN       unsigned char Erease_Block(unsigned short BlockNo);
EXTERN       unsigned char Transfer_Page_to_Buffer(unsigned char bufferNo,unsigned short adr_page);
EXTERN       unsigned char Compare_Page_to_Buffer(unsigned char bufferNo,unsigned short adr_page);
EXTERN       unsigned char Auto_Page_rewrite(unsigned char bufferNo,unsigned short adr_page);

EXTERN       unsigned char Start_Continuous_Array_Read(unsigned short adr_page,unsigned short adr_buffer);
EXTERN       void          End_Continuous_Array_Read(void);

EXTERN       unsigned char Read_nByte_buffer(unsigned char bufferNo,type_datas_toFlash *rdata,unsigned short adr_buffer);
EXTERN       unsigned char Read_nByte_main(type_datas_toFlash *rdata,type_flash_address *flash_address);

EXTERN       unsigned char Write_1byte_to_buffer(unsigned char buffer,unsigned char data,unsigned short adr_buffer);
EXTERN       unsigned char Write_nbyte_to_buffer(unsigned char bufferNo,type_datas_toFlash *rdata,unsigned short adr_buffer);
EXTERN       unsigned char Write_buffer_to_main_Erase(unsigned char bufferNo,unsigned short adr_page);
EXTERN       unsigned char Write_buffer_to_main_Erase_Fast(unsigned char bufferNo,unsigned short adr_page);
EXTERN       unsigned char Write_mainpage_thr_buffer(unsigned char bufferNo,type_datas_toFlash *rdata,type_flash_address *flash_address);
#undefEXTERN
//---------------------------------------------------------------------------------  

转载于:https://www.cnblogs.com/slcfhr/archive/2010/07/05/1771084.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值