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

📄 test_flash.c

📁 AT45DB161驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include  <msp430x14x.h>
   
extern unsigned char Flash_Data[528]={0}; //当作为写操作中间变量时        //横向每中断100次写一次FLASH,那么需要500个字节
                                                                  //纵向每中断167次写一次FLASH,那么需要501个字节 
                                  //当作为读操作中间变量时        //横向:从FLASH中读出数据,计算Hi,然后把Hi再放到Flash_Data[500],再写回FLASH
                                                                  //纵向:从FLASH中读出数据,计算方差
extern unsigned char Zong_target[528]={0};        //用于存放纵向测量的指标,每88个横截面存一次指标88×6=528
extern unsigned char Heng_target[528]={0};        //用于存放横向测量的指标,每176个100m存一次指标176×3=528


unsigned char Flash_Data1[528]={0};
//unsigned char Flash_Data2[528]={0};
                                                              
void AT45DB161_cs_availability(void);
void AT45DB161_cs_invalidationy(void);
void AT45DB161_si_low(void);
void AT45DB161_si_high(void);
void AT45DB161_sck_low(void);
void AT45DB161_sck_high(void);
unsigned char AT45DB161_so(void);
void init_read_write(void);
void resolve_read_write(void);
void write_AT45DB161_byte(unsigned char data);
unsigned char read_AT45DB161_byte(void);
void sck_high_low(void);
void Auto_cmd_Through_buf(unsigned char cmd,unsigned int page,unsigned int adr);
//===============================================================================
//extern unsigned char Flash_Data[528];Flash_Data[528]
void memory_Page_to_Buffer(unsigned char cmd,unsigned int page);
void buffer_read(unsigned char cmd,unsigned int adr);
void buffer_write(unsigned char cmd,unsigned int adr);
void Buffer_Main_Memory(unsigned char cmd,unsigned int page,unsigned int adr);
void Main_Memory_Page_Read(unsigned int page,unsigned int adr);
unsigned char read_AT45DB161_register(void);
void  M430_to_MemoryE(unsigned char cmd,unsigned int page,unsigned int adr);
void  M430_to_MemoryE1(unsigned char cmd,unsigned int page,unsigned int adr);
void  M430_to_MemoryE2(unsigned char cmd,unsigned int page,unsigned int adr);
void  M430_to_MemoryNOE(unsigned char cmd,unsigned int page,unsigned int adr);
void  M430_Buffer_MemoryE(unsigned char cmd,unsigned int page,unsigned int adr);
void  M430_Buffer_MemoryE1(unsigned char cmd,unsigned int page,unsigned int adr);
void  M430_Buffer_MemoryE2(unsigned char cmd,unsigned int page,unsigned int adr);
//================================================================================
void  init_AT45DB161(void);
void  read_AT45DB161_430(unsigned int page_adr);
void  write_AT45DB161_430(unsigned int page_adr);
//===============================================================================
//
//P64 SO            IN
//P65 CS            OUT       低有效
//P66 SCK           OUT
//P67 SI            OUT


// RDY/BUSY       接高电平
//RESET        接高电平,不复位
// WP  接     高电平允许写
void init_AT45DB161(void)
    {
    P6OUT|=0xe0;           //1110 0000     CS SCK SI输出1
    }
//片选有效
void AT45DB161_cs_availability(void)
    {
    P6OUT&=0xDF;      //1101 1111     CS=0   P65 CS 
    }
//片选无效
void AT45DB161_cs_invalidationy(void)
    {
    P6OUT|=0x20;       //0010 0000    CS=1   P65 CS 
    }
//SI置低
void AT45DB161_si_low(void)
    {
    P6OUT&=0x7F;    //0111 1111         SI=0    P67 SI
    }
//p23--SI置高
void AT45DB161_si_high(void)
    {
    P6OUT|=0x80;     //1000 0000        SI=1    P67 SI
    }
//SCK置低
void AT45DB161_sck_low(void)
    {
    P6OUT&=0xbf;    //1011 1111         SCK=0     P66 SCK 
    }
//SCK置高
void AT45DB161_sck_high(void)
    {
    P6OUT|=0x40;     //0100 0000        SCK=1      P66 SCK 
    }    
//准备读写FLASH,创造条件
void init_read_write(void)
    {
    AT45DB161_sck_low();              //SCK=0
    AT45DB161_cs_availability();      //CS=0
    } 
//放弃读写FLASH
void resolve_read_write(void)
    {
    AT45DB161_sck_low();             //SCK=0
    AT45DB161_cs_invalidationy();    //CS=1
    }

//读SO状态
unsigned char AT45DB161_so(void)
    {
    unsigned char c;
    c=P6IN;
    c=c&0x10;
    if(c==0)
        {
        c=0;
        }
    else
        {
        c=1;
        }
    return(c);
    }
    
    
//写1个字节
void write_AT45DB161_byte(unsigned char data)//-------------------------
    {
    unsigned int i;
    AT45DB161_sck_low();
    for(i=0;i<8;i++)
          {
          if(data>=0x80)
                {
                AT45DB161_si_high();
                }
          else
                {
                AT45DB161_si_low();
                }
          AT45DB161_sck_high();
          AT45DB161_sck_low();
          data=data<<1;
          }
    AT45DB161_sck_low();
    }
//读1个字节
unsigned char read_AT45DB161_byte(void)//-------------------------
    {
    unsigned int i,j;
    unsigned char data,c;
    AT45DB161_sck_low();//AT45DB161_sck_high();
    data=0;
    for(i=0;i<8;i++)
          {
          data=data<<1;
          AT45DB161_sck_high();//AT45DB161_sck_low();
          
         for(j=0;j<=10;j++);
          c=AT45DB161_so();
          if(c==1)
              {
              data=data|0x01;
              }
         AT45DB161_sck_low();// AT45DB161_sck_high();
          }
    AT45DB161_sck_low(); //AT45DB161_sck_high();
    
    return(data);
    }
void sck_high_low(void)
    {
    AT45DB161_sck_high();
    AT45DB161_sck_low();
    }

//
void Auto_cmd_Through_buf(unsigned char cmd,unsigned int page,unsigned int adr)//-------------------------
    {                           
    // 例如:page=0000 1111 1111 0000   adr=0000 0000 1000 1111  
    	int lzg1,lzg2;
	char lcx1,lcx2,lcx3;
	
        

	lzg1=page<<2;           // 0011 1111 1100 0000
	lzg2=adr>>8;            // 0000 0000 0000 0000
	lzg1=lzg1|lzg2;        // lzg1=  0011 1111 1100 0000

	lzg2=adr&0x00ff;       // lzg2=  0000 0000 1000 1111   
	lcx1=(char)lzg1;            //lcx1放中间地址 1100 0000
	lcx2=(char)(lzg1>>8);       //lcx2放高地址   0011 1111
	lcx3=(char)(adr&0xff);      //lcx3放低地址   1000 1111
	
	init_read_write();
        write_AT45DB161_byte(cmd);	
        write_AT45DB161_byte(lcx2);
        write_AT45DB161_byte(lcx1);
        write_AT45DB161_byte(lcx3); // 最终命令字帧:0011 1111 1100 0000 1000 1111
        //resolve_read_write();     //其他方式的结束符号 
    }
//==============================================================================================
//=============应用程序 1============
//======直接从主存储器读到430中======
//==============================================================================================
void Main_Memory_Page_Read(unsigned int page,unsigned int adr)//从FLASH中读数据,放到Flash_Data1[528]中//-------------------------
    {
    unsigned int i;
    Auto_cmd_Through_buf(0x52,page,adr);   
    write_AT45DB161_byte(0);
    write_AT45DB161_byte(1);
    write_AT45DB161_byte(2);
    write_AT45DB161_byte(3);
    sck_high_low();
    for(i=adr;i<528;i++)
          {
          Flash_Data1[i-adr]=read_AT45DB161_byte();
          
          }
    resolve_read_write();               //10011100 RDY/BUSY CMP
   
    }
//==============================================================================================
//=============应用程序 2============
//======= 从缓冲区到430内存 ========
//====缓冲器读====
//54H   Buffer 1 Read
//56H   Buffer 2 Read
//==============================================================================================
void buffer_read(unsigned char cmd,unsigned int adr)
    {
    unsigned  int i;
    Auto_cmd_Through_buf(cmd,0,adr);
    write_AT45DB161_byte(0);
    sck_high_low();
    for(i=adr;i<528;i++)
          {
          Flash_Data[i-adr]=read_AT45DB161_byte();
          }
    resolve_read_write();               //10011100 RDY/BUSY CMP
    }
//==============================================================================================
//=============应用程序 3============
//=======从430内存到缓冲区=========
//====缓冲器写===
//84H  Buffer 1 Write   87H  Buffer 2 Write
//==============================================================================================
void buffer_write(unsigned char cmd,unsigned int adr)//-------------------------
    {
    unsigned int i;
    Auto_cmd_Through_buf(cmd,0,adr);
    for(i=adr;i<528;i++)
          {
          write_AT45DB161_byte(Flash_Data[i-adr]);
          }
    resolve_read_write();               //10011100 RDY/BUSY CMP
    }
    
void buffer_write1(unsigned char cmd,unsigned int adr)//-------------------------
    {
    unsigned int i;
    Auto_cmd_Through_buf(cmd,0,adr);
    for(i=adr;i<528;i++)
          {
         
          write_AT45DB161_byte(Zong_target[i-adr]);
          }
    resolve_read_write();               //10011100 RDY/BUSY CMP
    }
void buffer_write2(unsigned char cmd,unsigned int adr)//-------------------------
    {
    unsigned int i;
    Auto_cmd_Through_buf(cmd,0,adr);
    for(i=adr;i<528;i++)
          {
          write_AT45DB161_byte(Heng_target[i-adr]);
          }
    resolve_read_write();               //10011100 RDY/BUSY CMP
    }
//==============================================================================================
//=============应用程序 4============
//===主存储器写到BUFF===
//53H  Main Memory Page to Buffer 1 Transfer
//55H  Main Memory Page to Buffer 2 Transfer
//===主存储器和BUFF比较===
//60H  Main Memory Page to Buffer 1 Compare
//61H  Main Memory Page to Buffer 2 Compare
//==============================================================================================
void memory_Page_to_Buffer(unsigned char cmd,unsigned int page)
    {
    Auto_cmd_Through_buf(cmd,page,0);
    resolve_read_write();
    }
//==============================================================================================
//=============应用程序 5============
//====================
//83H   Buffer 1 to Main Memory Page Program with Built-In Erase
//      缓冲器1到主存储器页并檫除
//86H   Buffer 2 to Main Memory Page Program with Built-In Erase
//      缓冲器2到主存储器页并檫除
//88H   Buffer 1 to Main Memory Page Program without Built-In Erase
//      缓冲器1到主存储器页不檫除
//89H   Buffer 2 to Main Memory Page Program without Built-In Erase
//      缓冲器2到主存储器页不檫除
//====================
//82H   Main Memory Page Program Through Buffer 1  (含BA8 BA7 。。。BA0)
//      主存储器到BUFFER1
//85H   Main Memory Page Program Through Buffer 2  (含BA8 BA7 。。。BA0)
//      主存储器到BUFFER2
//58H   Auto Page Rewrite Through Buffer 1
//      自动写到缓冲器1
//59H   Auto Page Rewrite Through Buffer 2
//      自动写到缓冲器2
//==============================================================================================
void Buffer_Main_Memory(unsigned char cmd,unsigned int page,unsigned int adr)
      {
      Auto_cmd_Through_buf(cmd,page,adr);
      //write_AT45DB161_byte(0);
      //write_AT45DB161_byte(1);
      resolve_read_write();
      }
//==============================================================================================
//=============应用程序 6============
//===========状态积存器的读=========
//==============================================================================================
unsigned char  read_AT45DB161_register(void)
    {
    unsigned char c;
    init_read_write();

⌨️ 快捷键说明

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