?? read_write(能進行m25p80的讀寫操作,寄存器寫讀,擦除,保護,低功耗等模式).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 + -