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

📄 at45db041b.c

📁 ti msp430 用c编写的串行eeprom at45db041b的驱动程序
💻 C
字号:
#include "pedometerv01.h"

   
const unsigned char CMD_FLASH_CARRYREAD = 0x68;  //Continues Array Read
const unsigned char CMD_FLASH_MMPAGEREAD = 0x52; //Main Memory Page Read
const unsigned char CMD_FLASH_BUF1READ = 0x54;  // Buffer 1 Read
const unsigned char CMD_FLASH_BUF2READ = 0x56;  // Buffer 2 Read
const unsigned char CMD_FLASH_SRREAD = 0x57;    // Status Register Read
const unsigned char CMD_FLASH_BUF1WRITE = 0x84; // Buffer1 Write
const unsigned char CMD_FLASH_BUF2WRITE = 0x87; // Buffer2 Write
const unsigned char CMD_FLASH_BUF1TOMAIN_E = 0x83; // Buffer1 to Main Memory Page Program with Built-in Erase
const unsigned char CMD_FLASH_BUF2TOMAIN_E = 0x86; // Buffer2 to Main Memory Page Program with Built-in Erase
const unsigned char CMD_FLASH_BUF1TOMAIN = 0x88; // Buffer1 to Main Memory Page Program without Built-in Erase
const unsigned char CMD_FLASH_BUF2TOMAIN = 0x89; // Buffer2 to Main Memory Page Program without Built-in Erase
const unsigned char CMD_FLASH_PAGEERASE = 0x81; // Page Erase
const unsigned char CMD_FLASH_BLOCKERASE = 0x50; // Block Erase
const unsigned char CMD_FLASH_MAIN_TR_BUF1 = 0x82; // Main Memory Page Program through Buffer 1
const unsigned char CMD_FLASH_MAIN_TR_BUF2 = 0x85; // Main Memory Page Program through Buffer 2
const unsigned char CMD_FLASH_MAIN_TO_BUF1 = 0x53; // Main Memory Page to Buffer 1
const unsigned char CMD_FLASH_MAIN_TO_BUF2 = 0x55; // Main Memory Page to Buffer 2
const unsigned char CMD_FLASH_MAIN_CM_BUF1 = 0x60; // Main Memory Page to Buffer 1 compare
const unsigned char CMD_FLASH_MAIN_CM_BUF2 = 0x61; // Main Memory Page to Buffer 2 compare
const unsigned char CMD_FLASH_REWRITE_TR_BUF1 = 0x58; // Auto Page Rewrite through Buffer 1
const unsigned char CMD_FLASH_REWRITE_TR_BUF2 = 0x59; // Auto Page Rewrite through Buffer 2

void  send_Byte(unsigned char data);
unsigned char  read_Byte(void);

void Flash_Setup()
{
  unsigned short j;
  FLASH_PORT_SEL = 0;
  FLASH_PORT_DIR |= PIN_FLASH_CS + PIN_FLASH_SCK + PIN_FLASH_SI;
  FLASH_PORT_OUT |= PIN_FLASH_SCK + PIN_FLASH_SI;
  FLASH_PORT_DIR &= ~PIN_FLASH_SO;  
  SET_FLASH_CS_LOW();
  SET_FLASH_RESET_LOW();
  Adr_Page_us=0;
  Adr_Buf_us=0;
  
  for (j = 0xFFFF; j > 0; j--);           // Time for flag to set    
  
  SET_FLASH_CS_HIGH();
  
  for (j = 0xFFFF; j > 0; j--);           // Time for flag to set    
  
  SET_FLASH_RESET_HIGH();
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////  
void LoadDumyData()
{
      unsigned char data1,data2;
      data1=0;
      data2=25;
      for(;;)
      {
          if(Error_Code!=RESULT_FLASHFULL)
          {
             //++data1;
             //++data2;
             while(WriteMemory_through_Buf1((unsigned short *)&Adr_Page_us,(unsigned short *)&Adr_Buf_us,data1) == RESULT_BUSY);
             while(WriteMemory_through_Buf1((unsigned short *)&Adr_Page_us,(unsigned short *)&Adr_Buf_us,data2) == RESULT_BUSY);
             if(Adr_Buf_us==0)
             {
                while(MainMemoryPage_Read(Adr_Page_us-1,Flash_data)==RESULT_BUSY);
                _NOP();
             }
          }
          else
          {
             P1OUT|=BIT7;
          }
      }
}
  
//////////////////////////////////////////////////////////////////////////////////////////////////////////  
void LoadChannelHead()
{
     Adr_Buf_us=0;
     for(;;)
     {
       while(WriteMemory_through_Buf1((unsigned short *)&Adr_Page_us,(unsigned short *)&Adr_Buf_us,0xff) == RESULT_BUSY);
#ifdef TWO_CHANAL       
       while(WriteMemory_through_Buf1((unsigned short *)&Adr_Page_us,(unsigned short *)&Adr_Buf_us,0x0) == RESULT_BUSY);
#endif       
       if(Adr_Buf_us==0)return;
     }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char MainMemoryPage_Read(unsigned short adr_page,unsigned char *data)
{
    unsigned char send_data[4];
    unsigned char i;
    unsigned short j;
    
    if(Error_Code >RESULT_ERROR)return(RESULT_READY);
    if((read_Status()&FLASH_READY)!=FLASH_READY)return(RESULT_BUSY);
    SET_FLASH_SCK_LOW();
    SET_FLASH_CS_LOW();
    send_data[0] = CMD_FLASH_MMPAGEREAD;
    send_data[1] = adr_page >> 7;     
    send_data[2] = adr_page << 1; 
    send_data[2] &= ~1;   //read from the frist byte of this page      
    send_data[3] = 0;

    for(i=0;i<4;i++)
       send_Byte(send_data[i]);

    for(i=0;i<4;i++)
       send_Byte(0xff);

    SET_FLASH_SCK_HIGH();      
    SET_FLASH_SCK_LOW();  

    for(j=BUF_LEN_FLASH;j>0;j--)
    {
       * data = read_Byte();
       data++;
    }
       
    SET_FLASH_CS_HIGH(); 
    return(RESULT_READY);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char MainMemory_to_Buf1(unsigned short adr_page)
{
    unsigned char send_data[4];
    unsigned char i;
    if(Error_Code >RESULT_ERROR)return(RESULT_READY);
    if((read_Status()&FLASH_READY)!=FLASH_READY)return(RESULT_BUSY);
    send_data[0] = CMD_FLASH_MAIN_TO_BUF1;
    send_data[1] = adr_page >> 7;     
    send_data[2] = adr_page << 1;        
    SET_FLASH_CS_LOW(); 
    for(i=0;i<4;i++)
       send_Byte(send_data[i]);
    SET_FLASH_CS_HIGH();    
    return(RESULT_READY);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char Read_Buf1(unsigned short adr_buff)
{
    unsigned char send_data[4];
    unsigned char i,data;
    if(Error_Code >RESULT_ERROR)return(RESULT_READY);
    if((read_Status()&FLASH_READY)!=FLASH_READY)return(RESULT_BUSY);
    send_data[0] = CMD_FLASH_BUF1READ;
    
    if((adr_buff & 0x100)==0x100)
       send_data[2] |= 1;
    else 
       send_data[2] &= ~1;    
    send_data[3] = adr_buff;  
    
    SET_FLASH_CS_LOW(); 
    
    for(i=0;i<4;i++)
       send_Byte(send_data[i]);
    send_Byte(0);

    SET_FLASH_SCK_HIGH();      
    SET_FLASH_SCK_LOW();  

    data=read_Byte();

    SET_FLASH_CS_HIGH();     
    return(data);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char WriteMemory_through_Buf2(unsigned short * adr_page,unsigned short * adr_buff,unsigned char data)
{
    unsigned char send_data[4];
    unsigned char i;
    if(Error_Code >RESULT_ERROR)return(RESULT_READY);
    
    send_data[0] = CMD_FLASH_MAIN_TR_BUF2;
    if(* adr_buff==0)
    {
        if((read_Status()&FLASH_READY)!=FLASH_READY)return(RESULT_BUSY);
        
        SET_FLASH_CS_LOW(); 
        send_data[1] = * adr_page >> 7;     
        send_data[2] = * adr_page << 1;        
        
        if((* adr_buff & 0x100)==0x100)
          send_data[2] |= 1;
        else 
          send_data[2] &= ~1;    
        
        send_data[3] = * adr_buff;  
        for(i=0;i<4;i++)
          send_Byte(send_data[i]);
    }
    send_Byte(data); 
    
    if(++ * adr_buff >= BUF_LEN_FLASH)
    {
        * adr_buff=0;  
        if(++ * adr_page>=TOTAL_PAGE_FLASH)Error_Code=RESULT_FLASHFULL;
        SET_FLASH_CS_HIGH();
        return(RESULT_PAGEFINISHED);
    }    
    return(RESULT_READY);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char WriteMemory_through_Buf1(unsigned short * adr_page,unsigned short * adr_buff,unsigned char data)
{
    unsigned char send_data[4];
    unsigned char i;
    if(Error_Code >RESULT_ERROR)return(RESULT_READY);
    send_data[0] = CMD_FLASH_MAIN_TR_BUF1;
    if(* adr_buff==0)
    {
        if((read_Status()&FLASH_READY)!=FLASH_READY)return(RESULT_BUSY);
        
        SET_FLASH_CS_LOW(); 
        send_data[1] = * adr_page >> 7;     
        send_data[2] = * adr_page << 1;        
        
        if((* adr_buff & 0x100)==0x100)
          send_data[2] |= 1;
        else 
          send_data[2] &= ~1;    
        
        send_data[3] = * adr_buff;  
        for(i=0;i<4;i++)
          send_Byte(send_data[i]);
    }
    send_Byte(data); 
    
    if(++ * adr_buff >= BUF_LEN_FLASH)
    {
        * adr_buff=0;  
        if(++ * adr_page>=TOTAL_PAGE_FLASH)Error_Code=RESULT_FLASHFULL;
        SET_FLASH_CS_HIGH();
        return(RESULT_PAGEFINISHED);
    }    
    return(RESULT_READY);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char  read_Status()
{
    unsigned char data;
    SET_FLASH_SCK_LOW();
    SET_FLASH_CS_LOW();
    send_Byte(CMD_FLASH_SRREAD);
    SET_FLASH_SCK_HIGH();      
    SET_FLASH_SCK_LOW();  
    data = read_Byte();
    SET_FLASH_CS_HIGH();
    return(data);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char  read_Byte()
{
    unsigned char i;
    unsigned data = 0;
    for (i=0;i<8;i++)
    {
       data <<=1;
       SET_FLASH_SCK_HIGH();      
//       _NOP();
//       _NOP();
       if((FLASH_PORT_IN & PIN_FLASH_SO)==PIN_FLASH_SO)++data;
       SET_FLASH_SCK_LOW();  
//       _NOP();
//       _NOP();
    }
    return(data);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
void  send_Byte(unsigned char data)
{
    unsigned char i;
    for (i=0;i<8;i++)
    {
       if((data & 0x80)==0x80)SET_FLASH_SI_HIGH();
       else SET_FLASH_SI_LOW();
       SET_FLASH_SCK_HIGH();      
       data = data<<1;
       SET_FLASH_SCK_LOW();  
    }
}




⌨️ 快捷键说明

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