📄 test_spi_w25x.c
字号:
#define uint8 unsigned char
#define uint16 unsigned int
#define uchar unsigned char
#define uint unsigned int
#define uint32 unsigned long
#include <SST89x5xxRD2.H>
#include <intrins.h>
#include <W25X_M.H>
void init_cpu(void);
void delay(uchar tt);
void trace(uchar *str,uchar len);
void test_page(uchar addr);
void read_page(uchar addr);
void Verify(uchar byte, uchar cor_byte);
uint8 Rxtemp;
bit MYTI;
uint8 tx_buff[16];
uint8 upper_128[16];
bit rx_ok;
void main(void)
{ uint i;
init_cpu();
SPI_init();
tx_buff[0]='O';
tx_buff[1]='K';
trace(tx_buff,2);
for(;;)
{ if(rx_ok == 1)
{ rx_ok = 0;
switch(Rxtemp)
{ case 0x01:
Rxtemp = 0;
tx_buff[0] = SPI_Read_ID1();
trace(tx_buff,1);
break;
case 0x02:
i = SPI_Read_ID2(0x00);
tx_buff[1] = (uchar)i;
tx_buff[0] = (uchar)(i>>8);
trace(tx_buff,2);
break;
case 0x03:
i = SPI_Read_ID3();
tx_buff[1] = (uchar)i;
tx_buff[0] = (uchar)(i>>8);
trace(tx_buff,3);
break;
case 0x04:
tx_buff[0] = SPI_Read_Byte(0x00000000);
trace(tx_buff,1);
break;
case 0x05:
tx_buff[0] = 0x55;
SPI_Write_Byte(0x00000000,0xa5);
trace(tx_buff,1);
break;
case 0x06:
tx_buff[0] = SPI_Read_StatusReg();
trace(tx_buff,1);
break;
case 0x07:
SPI_Write_Enable();
break;
case 0x08:
upper_128[0]=0x01;upper_128[1]=0x02;upper_128[2]=0x03;upper_128[3]=0x04;
SPI_Write_nBytes(0x00000000,4);
break;
case 0x09:
SPI_Erase_Chip();
break;
case 0x0a:
SPI_Erase_Sector(0x000ff000);
while(1)
{ tx_buff[0] = SPI_Read_StatusReg();
if(tx_buff[0] == 0)
{ trace(tx_buff,1);
break;
}
}
break;
case 0x0b:
test_page(0x00);
break;
case 0x0c:
read_page(0x00);
break;
default:
break;
}
}
}
}
void init_cpu(void)
{ TMOD = 0x21;
PCON = PCON | 0x80; //波特率加倍
SCON = 0x50; //异步、10位、波特率可变,无校验位
TH1 = 0xfd; //在11.0592M晶振下,波特率是9600,
TL1 = 0xfd;
TR1 = 1; //T1 timer run
ES = 1; //uart interrupt enable
EA = 1; //all interrupt enable
}
//串口中断程序
void UART_isr(void) interrupt 4
{
if(RI)
{
RI = 0;
Rxtemp = SBUF; //接收
//SBUF = Rxtemp; //发送
rx_ok = 1;
return;
}
if(TI)
{
TI = 0;
MYTI = 1;
}
}
void test_page(uchar addr)
{ uint i; uchar byte;
uint32 Dst_Addr;
W25X_CS = 0; // enable device
SPI_Write_Enable(); // set WEL
W25X_CS = 0;
Dst_Addr = (uint32)addr*256;
Dst_Addr = 0x0ff000;//(uint32)addr*256;
SPI_Send_Byte(W25X_PageProgram); // send Byte Program command
SPI_Send_Byte((uchar)((Dst_Addr & 0xFFFFFF) >> 16)); // send 3 address bytes
SPI_Send_Byte((uchar)((Dst_Addr & 0xFFFF) >> 8));
SPI_Send_Byte((uchar)(Dst_Addr & 0xFF));
for (i = 0; i < 256; i++) // send byte to be programmed
SPI_Send_Byte(i);
W25X_CS = 1;
delay_nms(5);
W25X_CS = 0;
while(1)
{ tx_buff[0] = SPI_Read_StatusReg();
trace(tx_buff,1);
if(tx_buff[0] == 0) break;
}
Dst_Addr = 0x0ff000;
for (i = 0; i < 256; i++)
{ byte = SPI_Read_Byte(Dst_Addr+i);
ES = 0;
SBUF = byte;
while (TI == 0);
TI = 0;
ES = 1;
}
W25X_CS = 1;
}
//=================================================================================================
void read_page(uchar addr)
{ uint i;
uchar byte;
uint32 Dst_Addr;
Dst_Addr = addr*256;
Dst_Addr = 0x0ff000;
W25X_CS = 0;
for (i = 0; i < 256; i++)
{ byte = SPI_Read_Byte(Dst_Addr+i);
ES = 0;
SBUF = byte;
while (TI == 0);
TI = 0;
ES = 1;
}
W25X_CS = 1;
}
//=================================================================================================
void Verify(uchar byte, uchar cor_byte)
{ if (byte != cor_byte)
{ while(1);
//LED_Error = 0; /* display to view error on LED. */
}
}
//=================================================================================================
void myputchar(uchar c)
{
ES = 0;
SBUF = c;
while (TI == 0);
TI = 0;
ES = 1;
}
//=================================================================================================
void trace(uchar *str,uchar len)
{ uint i;
for(i=0;i<len;i++) { myputchar(*str); str++; }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -