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

📄 read_write.c

📁 基于msp430的m25p80 flash芯片读写擦除写保护控制程序
💻 C
字号:
//P4.7---SDA
//P4.6---SCL
#include "msp430x43x.h"
#define V80   0X01;
#define HOLD  0X02;
#define W     0X04;
#define STE   0X01;
#define SI    0X02;
#define SO    0X04;
#define UCLK  0X08;
#define Ram_addr 0x250;
#define uchar unsigned char
#define uint unsigned int


void SpiWrite(char *Bufer,int cnt);
void SpiRead(int cnt);
void ReadID(void);
uchar  RXBufer[5];
char  send_value[5]= {3,2,5,4,5};
uchar  recv_value[5];

void SpiWrite(char *Bufer,int cnt){ //Bufer是写入的字符串,cnt是字符串的长度
  char data;
  int i,j;
  for(j=0;j<cnt;j++){
    data=Bufer[j];
    for(i=0;i<8;i++){
      P3OUT &= ~UCLK;      //SCK下降沿
      if(data&BIT7){        //高位是1;
        P3OUT |= SI;
      }       //主机输出1
      else{
        P3OUT &= ~SI;
      }      //主机输出0
      P3OUT |= UCLK;       //SCK上升沿
      data<<=1;
    }
  }
}
void instrwrite(char num){
  int i;
  for(i=0;i<8;i++){
    P3OUT &= ~UCLK;      //SCK下降沿
    if(num&BIT7){        //高位是1;
      P3OUT |= SI;
    }       //主机输出1
    else{
      P3OUT &= ~SI;
    }      //主机输出0
    P3OUT |= UCLK;       //SCK上升沿
    num<<=1;
  }
}

void SpiRead(int cnt){ //cnt是读入数据的个数,读入数据在RxBufrer[]中
  char data;
  int i,j;
  for(j=0;j<cnt;j++){
    for(i=0;i<8;i++){
      P3OUT &= ~UCLK;      //SCK下降沿
      if(P3IN&BIT2){
        data<<=1;
        data =data+BIT0;
      }
      else{
        data<<=1;
      }
      P3OUT |= UCLK;       //SCK上升沿
    }
    RXBufer[j] = data;
  }
}

void ReadID(void){ //read device’S ID;
  //int i;
  char command[4]={0xAB,0x00,0x00,0x01};     //0xAB是sst25P80的读ID指令 
  P3OUT &= ~STE;                             //选中芯片
  SpiWrite(command,4);                       //给flash芯片发指令
  SpiRead(1);                                //读取5个字符
  P3OUT |= STE;                              //CE拉高
}

void WREN(void){
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0x06);
  P3OUT |= STE;                              //CE拉高
}

void PageProgram(char add1,char add2,char add3,char *send_value,int cont){
  char address[3]={add1,add2,add3};     //0x02是sst25P80写指令
  WREN();
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0x02);
  SpiWrite(address,3);                       //给flash芯片发指令
  SpiWrite(send_value,cont);
  SpiRead(cont);                           //读取5个字符
  P3OUT |= STE;                              //CE拉高
} 

void READ(char add1,char add2,char add3,int cont){
  char address[3]={add1,add2,add3};          //0x02是sst25P80写指令
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0x03);
  SpiWrite(address,3);                       //给flash芯片发指令
  //SpiWrite(send_value,cont);
  SpiRead(cont);                           //读取5个字符
  P3OUT |= STE;                              //CE拉高
} 
void RDSR(void){
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0x05);
  SpiRead(1);
  P3OUT |= STE;                              //CE拉高
}

void WRDI(void){
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0x04);
  P3OUT |= STE;                              //CE拉高
}
void WRSR(char num){
  WREN();
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0x01);
  instrwrite(num);
  P3OUT |= STE;                              //CE拉高
}
void sector_erase(char add1,char add2,char add3){
  char command[3]={add1,add2,add3};
  WREN();
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0xd8);
  SpiWrite(command,3);                       //给flash芯片发指令
  P3OUT |= STE;                              //CE拉高
}
void bulk_erase(void){
  WREN();
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0xc7);
  P3OUT |= STE;                              //CE拉高
}
void deep_powerdown(void){
  P3OUT &= ~STE;                             //选中芯片
  instrwrite(0xb9);
  P3OUT |= STE;                              //CE拉高
}
void main(void)
{
  P1DIR |= 0x07;
  P3DIR |= 0x0B;
  P3DIR &= ~SO;                              //430的SO脚置为输入模式            
  P1OUT |= V80;                              //芯片供电
  P3OUT &= ~STE;                             //选中芯片
  P1OUT |= W;                                //芯片非写保护
  P1OUT |= HOLD;                             //芯片非hold模式
  P3OUT |= UCLK;                             //时钟线先置高
  //P4OUT |= 0x08; 
  WDTCTL = WDTHOLD+WDTPW;
  ReadID();
  RDSR();
  WREN();
  deep_powerdown();
  WRSR(0x00);
  RDSR();
  sector_erase(0x00,0x00,0x00);
  RDSR();
  RDSR();
  ReadID();
  PageProgram(0x00,0x00,0x05,send_value,5);
  READ(0x00,0x00,0x05,5);
  //bulk_erase();
  RDSR();
  RDSR();
  READ(0x00,0x00,0x05,5);
  while(1);  
}

⌨️ 快捷键说明

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