测试SPI Flash代码

This commit is contained in:
tpu
2025-05-08 17:19:22 +08:00
parent 0e83e78204
commit 19e46b08b4
6 changed files with 118 additions and 112 deletions

View File

@@ -120,7 +120,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>DLGUARM</Key>
<Name>d</Name>
<Name></Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@@ -149,6 +149,14 @@
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<MemoryWindow1>
<Mm>
<WinNumber>1</WinNumber>
<SubType>0</SubType>
<ItemText>0x07f8ff00</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
</MemoryWindow1>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>

BIN
pinout_0.xlsx Normal file

Binary file not shown.

BIN
pinout_1.xlsx Normal file

Binary file not shown.

View File

@@ -17,11 +17,12 @@ int gpio_get(int index);
// spi flash
int fspi_init(u32 gpio_word);
int epcs_readid(void);
int epcs_sector_erase(int addr);
int epcs_page_write(int addr, u8 *buf, int size);
int epcs_read(int addr, int len, u8 *buf);
int fspi_config(u32 gpio_word);
int fspi_init(void);
int sf_readid(void);
int sf_sector_erase(int addr);
int sf_page_write(int addr, u8 *buf, int size);
int sf_read(int addr, int len, u8 *buf);
// epd_hw
void epd_hw_init(u32 config0, u32 config1);

View File

@@ -3,230 +3,222 @@
#define SPI_CTRL0 *(volatile unsigned short*)(0x50001200)
#define SPI_RXTX0 *(volatile unsigned short*)(0x50001202)
#define SPI_RXTX1 *(volatile unsigned short*)(0x50001204)
#define SPI_IACK *(volatile unsigned short*)(0x50001206)
#define SPI_CTRL1 *(volatile unsigned short*)(0x50001208)
static int spio_clk;
static int spio_cs;
static int spio_di;
static int spio_do;
#define BIT_8 0
#define BIT_16 1
#define BIT_32 2
static int spi_bitmode;
/******************************************************************************/
#define FSPI_DELAY 10
#define FSPI_CS(n) gpio_set(spio_cs, (n));
void fspi_delay(void)
void fspi_set_bitmode(int mode)
{
int i;
spi_bitmode = mode;
for(i=0; i<FSPI_DELAY; i++){
__asm("nop");
}
SPI_CTRL0 &= 0xfe7e;
SPI_CTRL0 |= (mode&3)<<7;
SPI_CTRL0 |= 0x0001;
}
#define FSPI_CS(n) gpio_set(spio_cs, (n));
#define FSPI_CK(n) gpio_set(spio_clk, (n));
#define FSPI_SI(n) gpio_set(spio_di, (n));
#define FSPI_SO() gpio_get(spio_do);
int fspi_trans(int byte)
int fspi_trans(int data)
{
int i, data;
data = 0;
for(i=0; i<8; i++){
FSPI_SI(byte&0x80);
FSPI_CK(0);
fspi_delay();
data <<= 1;
data |= FSPI_SO();
FSPI_CK(1);
fspi_delay();
byte <<= 1;
if(spi_bitmode==BIT_32){
SPI_RXTX1 = data>>16;
}
SPI_RXTX0 = data;
while((SPI_CTRL0&0x2000)==0);
SPI_IACK = 0;
data = SPI_RXTX0;
if(spi_bitmode==BIT_8){
data &= 0xff;
}else if(spi_bitmode==BIT_32){
data |= (SPI_RXTX1)<<16;
}
return data;
}
int fspi_init(u32 gpio_word)
int fspi_config(u32 gpio_word)
{
spio_clk = (gpio_word>>24)&0xff;
spio_cs = (gpio_word>>16)&0xff;
spio_di = (gpio_word>> 8)&0xff;
spio_do = (gpio_word>> 0)&0xff;
spio_do = (gpio_word>> 8)&0xff;
spio_di = (gpio_word>> 0)&0xff;
return 0;
}
int fspi_init(void)
{
SetBits16(CLK_PER_REG, SPI_ENABLE, 1);
gpio_config(spio_clk, 0x0300, 0);
gpio_config(spio_cs, 0x0300, 1);
gpio_config(spio_di, 0x0300, 1);
gpio_config(spio_do, 0x0100, 1);
gpio_config(spio_clk, 0x0307, 0);
gpio_config(spio_do, 0x0306, 1);
gpio_config(spio_di, 0x0105, 1);
SPI_CTRL0 = 0x0010;
fspi_set_bitmode(BIT_32);
FSPI_CS(0);
fspi_delay();
fspi_trans(0xab);
fspi_trans(0xab000000);
FSPI_CS(1);
return 0;
}
int fspi_exit(void)
{
SPI_CTRL0 = 0;
SetBits16(CLK_PER_REG, SPI_ENABLE, 0);
gpio_config(spio_cs, 0x0300, 1);
gpio_config(spio_clk, 0x0300, 0);
gpio_config(spio_do, 0x0300, 0);
gpio_config(spio_di, 0x0100, 0);
return 0;
}
/******************************************************************************/
/* SPI flash */
/******************************************************************************/
int epcs_readid(void)
int sf_readid(void)
{
int mid, pid;
fspi_set_bitmode(BIT_32);
FSPI_CS(0);
fspi_delay();
fspi_trans(0x90);
fspi_trans(0);
fspi_trans(0);
fspi_trans(0);
mid = fspi_trans(0);
pid = fspi_trans(0);
fspi_trans(0x90000000);
int id = fspi_trans(0);
FSPI_CS(1);
fspi_delay();
return (mid<<8)|pid;
return id;
}
int epcs_status(void)
int sf_status(void)
{
int status;
fspi_set_bitmode(BIT_16);
FSPI_CS(0);
fspi_delay();
fspi_trans(0x05);
status = fspi_trans(0);
status = fspi_trans(0x0500);
FSPI_CS(1);
fspi_delay();
return status;
}
int epcs_wstat(int stat)
int sf_wstat(int stat)
{
// status write enable
fspi_set_bitmode(BIT_8);
FSPI_CS(0);
fspi_delay();
fspi_trans(0x50);
FSPI_CS(1);
fspi_delay();
fspi_set_bitmode(BIT_16);
FSPI_CS(0);
fspi_delay();
fspi_trans(0x01);
fspi_trans(stat);
fspi_trans(0x0100|stat);
FSPI_CS(1);
fspi_delay();
return 0;
}
int epcs_wen(int en)
int sf_wen(int en)
{
fspi_set_bitmode(BIT_8);
FSPI_CS(0);
fspi_delay();
if(en)
fspi_trans(0x06);
else
fspi_trans(0x04);
FSPI_CS(1);
fspi_delay();
return 0;
}
int epcs_wait()
int sf_wait()
{
int status;
while(1){
status = epcs_status();
status = sf_status();
if((status&1)==0)
break;
fspi_delay();
}
return 0;
}
int epcs_sector_erase(int addr)
int sf_sector_erase(int addr)
{
epcs_wen(1);
sf_wen(1);
fspi_set_bitmode(BIT_32);
FSPI_CS(0);
fspi_delay();
fspi_trans(0x20);
fspi_trans((addr>>16)&0xff);
fspi_trans((addr>> 8)&0xff);
fspi_trans((addr>> 0)&0xff);
fspi_trans(0x20000000|addr);
FSPI_CS(1);
fspi_delay();
epcs_wait();
sf_wait();
return 0;
}
int epcs_page_write(int addr, u8 *buf, int size)
int sf_page_write(int addr, u8 *buf, int size)
{
int i;
epcs_wen(1);
sf_wen(1);
fspi_set_bitmode(BIT_32);
FSPI_CS(0);
fspi_delay();
fspi_trans(0x02);
fspi_trans((addr>>16)&0xff);
fspi_trans((addr>> 8)&0xff);
fspi_trans((addr>> 0)&0xff);
for(i=0; i<size; i++){
fspi_trans(buf[i]);
fspi_trans(0x02000000|addr);
for(i=0; i<size; i+=4){
fspi_trans(*(u32*)(buf+i));
}
FSPI_CS(1);
fspi_delay();
epcs_wait();
sf_wait();
return 0;
}
int epcs_read(int addr, int len, u8 *buf)
int sf_read(int addr, int len, u8 *buf)
{
int i;
fspi_set_bitmode(BIT_32);
FSPI_CS(0);
fspi_delay();
fspi_trans(0x0b);
fspi_trans((addr>>16)&0xff);
fspi_trans((addr>> 8)&0xff);
fspi_trans((addr>> 0)&0xff);
fspi_trans(0x03000000|addr);
fspi_trans(0);
for(i=0; i<len; i++){
buf[i] = fspi_trans(0);
for(i=0; i<len; i+=4){
*(u32*)(buf+i) = fspi_trans(0);
}
FSPI_CS(1);
fspi_delay();
return len;
}

View File

@@ -143,8 +143,13 @@ void user_app_init(void)
app_clock_timer_used = EASY_TIMER_INVALID_TIMER;
adv_count = 0;
fspi_config(0x00030605);
epd_hw_init(0x23200700, 0x05210006); // for 2.13 board BW
fspi_init();
int id = sf_readid();
printk("Flash ID: %08x\n", id);
default_app_on_init();
}