📄 read_write.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 + -