<p>采用软件或硬件SPI方式读写串口psram,最近想用串口psram当显示屏的缓存,买了乐鑫psram64h和来扬LY68L6400芯片进行测试,用SPI方式读写成功,代码如下:</p>
<p>主代码文件:main.c</p>
- //
- //PSRAM演示程序,采用普通SPI功能读写芯片,编译时定义 HARDWARE_SPI,则使用硬件SPI功能
- //否则使用软件模拟SPI,读写芯片
- // # psram id:0x0D5D-46A02A547A67--PSRAM64H,SPI模式2、模式3测试能成功
- // # psram id:0x0D5D-5312A4D13899--LY68L6400SLI,SPI模式0、模式3测试能成功
- #include "sysdef.h"
- #define BUFSIZE 256
- unsigned char Device_ID[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
- unsigned char xdata test_buf[BUFSIZE];
- u32 systick = 0;
- sbit LED = P5^4;
- void Print_Drive_ID(void);
- void Timer0_Init(void);
- // 主函数
- void main(void)
- {
- unsigned int i;
- unsigned long addr = 0;
-
- P1M1 = 0x00; P1M0 = 0x00;
- P2M1 = 0x00; P2M0 = 0x00;
- P3M0 = 0x80; P3M1 = 0x00; //P3.7设置为推挽输出,用于PSRAM启动供电
- P4M1 = 0x00; P4M0 = 0x00;
- P5M1 = 0x00; P5M0 = 0x00;
-
- P1PU = 0xff; P3PU = 0xff;
-
- Uart1_Init();
- Timer0_Init();
- EA = 1;
- printf("uart init.\r\n");
- Delay_ms(50);
- printf("[%ldms]:Psram Init.\r\n",systick);
- PSRAM_Init();
- PSRAM_ReadID(Device_ID,8);
- Delay_ms(1);
- PSRAM_ReadID(Device_ID,8);
- Delay_ms(1);
- printf("[%ldms]:Psram Init OK.\r\n",systick);
-
- while(1)
- {
- #if defined(HARDWARE_SPI)
- printf("<<<<*********** USING HARDWARE SPI *************>>>>\r\n");
- printf("SPI PIN--CS(P1.0), MOSI(P3.4), MISO(P3.3), SCLK(P3.2)\r\n");
- #else
- printf("<<<<*************** USING SOFT SPI ************>>>>\r\n");
- printf("SOFT-SPI PIN--CS(P1.0), MOSI(P3.6), MISO(P1.1), SCLK(P3.5)\r\n");
- #endif
- PSRAM_ReadID(Device_ID,8);
- printf("PSRAM64H ID: ");
- Print_Drive_ID();
- for(i = 0; i < 8;i++)
- Device_ID[i] = 0;
- printf("\r\n");
- printf("[ %ld ms]:Write Data to psram. Addr:%#lx.\r\n",systick,addr);
- for(i = 0; i < sizeof(test_buf); i++)
- test_buf[i] = i;
- PSRAM_Write(addr,test_buf,sizeof(test_buf));
- printf("[ %ld ms]:Write Psram finish.\r\n",systick);
- Delay_ms(1);
- printf("[ %ld ms]:Clear cache.\r\n",systick);
- for(i = 0; i < sizeof(test_buf); i++)
- test_buf[i] = 0;
- printf("[ %ld ms]:Start Read Psram Data.\r\n",systick);
- PSRAM_Read(addr,test_buf,sizeof(test_buf));
-
-
- printf("<<<<***************** READ DATA *****************>>>>\r\n");
- for(i = 0; i < sizeof(test_buf); i++){
- PrintLong2Str(addr);
- PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);
- PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);
- PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);
- PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i]);
- addr+= 16;
- printf("\r\n");
- }
- printf("[ %ld ms]:Read Psram finish.\r\n",systick);
- Delay_ms(1000);
- }
- }
- void Print_Drive_ID(void){
- PrintHex2Str(Device_ID[0]);
- PrintHex2Str(Device_ID[1]);
- PrintHex2Str(Device_ID[2]);
- PrintHex2Str(Device_ID[3]);
- PrintHex2Str(Device_ID[4]);
- PrintHex2Str(Device_ID[5]);
- PrintHex2Str(Device_ID[6]);
- PrintHex2Str(Device_ID[7]);
- }
-
- void Timer0_Isr(void) interrupt 1
- {
- systick++;
- if(systick % 500 == 0)
- LED = !LED;
- }
-
- void Timer0_Init(void) //1毫秒@24.000MHz
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x40; //设置定时初始值
- TH0 = 0xA2; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
复制代码
<p>spi.c文件</p>
- #include "spi.h"
- #if defined(HARDWARE_SPI)
-
- #define SPIF 0x80
- #define WCOL 0x40
- #define SSIG 0x80
- #define SPEN 0x40
- #define DORD 0x20
- #define MSTR 0x10
-
- void SPI_Init(void){
- P_SW1 |= 0x0c; //SPI: SS(P3.5), MOSI(P3.4), MISO(P3.3), SCLK(P3.2)
- SPCTL = 0x9C; //SSIG=1,SPEN=0,DORD=0,MSTR=1,CPOL=0,CPHA=0,SPR[1:0]=00b
- SPCTL |= SPI_MODE<<2;
- SPSTAT = 0xC0; //SPIF、WCOL写1清空
- SPCTL |= SPEN; //使能硬件SPI
- }
-
- u8 SPI_ReadWrite(u8 dat){
- SPDAT = dat;
- while(!(SPSTAT & SPIF));
- SPSTAT = 0xC0;
- return SPDAT;
- }
-
- #else
- void SPI_Init(void){
- CS = 1;
- MOSI = 1;
- MISO = 1;
- CLK = S_CPOL;
- }
-
- u8 SPI_ReadWrite(u8 dat){
- u8 rst = 0;
- u8 i;
- for(i = 0; i < 8; i++){
- #if (S_CPHA) //数据前沿驱动后沿采样
- {
- CLK = !S_CPOL;
- MOSI = (bit)(dat & 0x80);
- dat <<= 1;
- CLK = S_CPOL;
- rst <<= 1;
- rst |= MISO;
- }
- #else //数据前沿采样后沿驱动
- {
- MOSI = (bit)(dat & 0x80);
- dat <<= 1;
- CLK = !S_CPOL;
- rst <<= 1;
- rst |= MISO;
- CLK = S_CPOL;
- }
- #endif
- }
- return rst;
- }
- #endif
复制代码
<p>uart.c文件</p>
复制代码
PSRAM64.zip
(2.79 MB, 下载次数: 1)
|