找回密码
 立即注册
查看: 29|回复: 0

8G1K08的SPI读写串口psram

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:88
  • 最近打卡:2025-07-11 08:21:26
已绑定手机

3

主题

31

回帖

469

积分

中级会员

积分
469
发表于 4 天前 | 显示全部楼层 |阅读模式
<p>采用软件或硬件SPI方式读写串口psram,最近想用串口psram当显示屏的缓存,买了乐鑫psram64h和来扬LY68L6400芯片进行测试,用SPI方式读写成功,代码如下:</p>
<p>主代码文件:main.c</p>
  1. //
  2. //PSRAM演示程序,采用普通SPI功能读写芯片,编译时定义 HARDWARE_SPI,则使用硬件SPI功能
  3. //否则使用软件模拟SPI,读写芯片
  4. //    # psram id:0x0D5D-46A02A547A67--PSRAM64H,SPI模式2、模式3测试能成功
  5. //    # psram id:0x0D5D-5312A4D13899--LY68L6400SLI,SPI模式0、模式3测试能成功
  6. #include "sysdef.h"
  7. #define BUFSIZE 256
  8. unsigned char Device_ID[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  9. unsigned char xdata test_buf[BUFSIZE];
  10. u32 systick = 0;
  11. sbit LED = P5^4;
  12. void Print_Drive_ID(void);
  13. void Timer0_Init(void);
  14. // 主函数
  15. void main(void)
  16. {   
  17.     unsigned int i;
  18.     unsigned long addr = 0;
  19.    
  20.     P1M1 = 0x00;   P1M0 = 0x00;
  21.     P2M1 = 0x00;   P2M0 = 0x00;
  22.     P3M0 = 0x80;   P3M1 = 0x00; //P3.7设置为推挽输出,用于PSRAM启动供电
  23.     P4M1 = 0x00;   P4M0 = 0x00;
  24.     P5M1 = 0x00;   P5M0 = 0x00;
  25.     P1PU = 0xff;   P3PU = 0xff;
  26.     Uart1_Init();
  27.     Timer0_Init();
  28.     EA = 1;
  29.     printf("uart init.\r\n");
  30.     Delay_ms(50);
  31.     printf("[%ldms]:Psram Init.\r\n",systick);
  32.     PSRAM_Init();
  33.     PSRAM_ReadID(Device_ID,8);
  34.     Delay_ms(1);
  35.     PSRAM_ReadID(Device_ID,8);
  36.     Delay_ms(1);
  37.     printf("[%ldms]:Psram Init OK.\r\n",systick);
  38.     while(1)
  39.     {        
  40. #if defined(HARDWARE_SPI)
  41.         printf("<<<<***********   USING HARDWARE SPI   *************>>>>\r\n");
  42.         printf("SPI PIN--CS(P1.0), MOSI(P3.4), MISO(P3.3), SCLK(P3.2)\r\n");
  43. #else
  44.         printf("<<<<***************   USING SOFT SPI    ************>>>>\r\n");
  45.         printf("SOFT-SPI PIN--CS(P1.0), MOSI(P3.6), MISO(P1.1), SCLK(P3.5)\r\n");
  46. #endif
  47.         PSRAM_ReadID(Device_ID,8);
  48.         printf("PSRAM64H ID: ");
  49.         Print_Drive_ID();        
  50.         for(i = 0; i < 8;i++)
  51.             Device_ID[i] = 0;
  52.         printf("\r\n");
  53.         printf("[ %ld ms]:Write Data to psram. Addr:%#lx.\r\n",systick,addr);
  54.         for(i = 0; i < sizeof(test_buf); i++)
  55.             test_buf[i] = i;
  56.         PSRAM_Write(addr,test_buf,sizeof(test_buf));
  57.         printf("[ %ld ms]:Write Psram finish.\r\n",systick);
  58.         Delay_ms(1);
  59.         printf("[ %ld ms]:Clear cache.\r\n",systick);
  60.         for(i = 0; i < sizeof(test_buf); i++)
  61.             test_buf[i] = 0;
  62.         printf("[ %ld ms]:Start Read Psram Data.\r\n",systick);
  63.         PSRAM_Read(addr,test_buf,sizeof(test_buf));        
  64.         
  65.         printf("<<<<*****************   READ DATA   *****************>>>>\r\n");
  66.         for(i = 0; i < sizeof(test_buf); i++){
  67.             PrintLong2Str(addr);
  68.             PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);
  69.             PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);
  70.             PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);
  71.             PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i++]);PrintHex2Str(test_buf[i]);
  72.             addr+= 16;
  73.             printf("\r\n");
  74.         }
  75.         printf("[ %ld ms]:Read Psram finish.\r\n",systick);
  76.         Delay_ms(1000);
  77.     }
  78. }
  79. void Print_Drive_ID(void){
  80.     PrintHex2Str(Device_ID[0]);
  81.     PrintHex2Str(Device_ID[1]);
  82.     PrintHex2Str(Device_ID[2]);
  83.     PrintHex2Str(Device_ID[3]);
  84.     PrintHex2Str(Device_ID[4]);
  85.     PrintHex2Str(Device_ID[5]);
  86.     PrintHex2Str(Device_ID[6]);
  87.     PrintHex2Str(Device_ID[7]);
  88. }
  89. void Timer0_Isr(void) interrupt 1
  90. {
  91.     systick++;
  92.     if(systick % 500 == 0)
  93.         LED = !LED;
  94. }
  95. void Timer0_Init(void)                //1毫秒@24.000MHz
  96. {
  97.         AUXR |= 0x80;                        //定时器时钟1T模式
  98.         TMOD &= 0xF0;                        //设置定时器模式
  99.         TL0 = 0x40;                                //设置定时初始值
  100.         TH0 = 0xA2;                                //设置定时初始值
  101.         TF0 = 0;                                //清除TF0标志
  102.         TR0 = 1;                                //定时器0开始计时
  103.         ET0 = 1;                                //使能定时器0中断
  104. }
复制代码
<p>spi.c文件</p>
  1. #include "spi.h"
  2. #if defined(HARDWARE_SPI)
  3.     #define SPIF 0x80
  4.     #define WCOL 0x40
  5.     #define SSIG 0x80
  6.     #define SPEN 0x40
  7.     #define DORD 0x20
  8.     #define MSTR 0x10
  9.     void SPI_Init(void){      
  10.         P_SW1 |= 0x0c;                //SPI: SS(P3.5), MOSI(P3.4), MISO(P3.3), SCLK(P3.2)
  11.         SPCTL = 0x9C;   //SSIG=1,SPEN=0,DORD=0,MSTR=1,CPOL=0,CPHA=0,SPR[1:0]=00b
  12.         SPCTL |= SPI_MODE<<2;
  13.         SPSTAT = 0xC0;  //SPIF、WCOL写1清空
  14.         SPCTL |= SPEN;  //使能硬件SPI
  15.     }
  16.    
  17.     u8 SPI_ReadWrite(u8 dat){
  18.         SPDAT = dat;
  19.         while(!(SPSTAT & SPIF));
  20.         SPSTAT = 0xC0;
  21.         return SPDAT;
  22.     }
  23. #else
  24.     void SPI_Init(void){
  25.         CS = 1;
  26.         MOSI = 1;
  27.         MISO = 1;
  28.         CLK = S_CPOL;
  29.     }
  30.     u8 SPI_ReadWrite(u8 dat){
  31.         u8 rst = 0;
  32.         u8 i;
  33.         for(i = 0; i < 8; i++){
  34.     #if (S_CPHA)        //数据前沿驱动后沿采样
  35.         {
  36.             CLK = !S_CPOL;
  37.             MOSI = (bit)(dat & 0x80);
  38.             dat <<= 1;
  39.             CLK = S_CPOL;
  40.             rst <<= 1;
  41.             rst |= MISO;        
  42.         }
  43.     #else            //数据前沿采样后沿驱动
  44.         {
  45.             MOSI = (bit)(dat & 0x80);
  46.             dat <<= 1;
  47.             CLK = !S_CPOL;
  48.             rst <<= 1;
  49.             rst |= MISO;
  50.             CLK = S_CPOL;
  51.         }
  52.     #endif   
  53.         }
  54.         return rst;
  55.     }
  56. #endif
复制代码
<p>uart.c文件</p>
  1. #include "uart.h"
  2. bit serial_busy;
  3. char wptr;
  4. char rptr;
  5. char buffer[16];
  6. void Uart1_Isr(void) interrupt 4
  7. {
  8.         if (TI)                                //检测串口1发送中断
  9.         {
  10.                 TI = 0;                        //清除串口1发送中断请求位
  11.         serial_busy = 0;
  12.         }
  13.         if (RI)                                //检测串口1接收中断
  14.         {
  15.                 RI = 0;                        //清除串口1接收中断请求位
  16.         buffer[wptr++] = SBUF;
  17.         wptr &= 0x0F;
  18.         }
  19. }
  20. void Uart1_Init(void)        //115200bps@24.000MHz
  21. {
  22.         SCON = 0x50;                //8位数据,可变波特率
  23.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  24.         AUXR |= 0x04;                //定时器时钟1T模式
  25.         T2L = 0xCC;                        //设置定时初始值
  26.         T2H = 0xFF;                        //设置定时初始值
  27.         AUXR |= 0x10;                //定时器2开始计时
  28.         ES = 1;                                //使能串口1中断
  29. }
  30. void UartSend(char dat)
  31. {
  32.     while (serial_busy);
  33.     serial_busy = 1;
  34.     SBUF = dat;
  35. }
  36. char putchar(char c){
  37.     UartSend(c);
  38.     return c;
  39. }
  40. void PrintHex2Str(unsigned char dat){
  41.     unsigned char i,j;
  42.     i = (dat & 0xF0)>>4;
  43.     j = dat & 0x0F;
  44.     if(i >= 0 && i <=9)
  45.         i += '0';
  46.     else if(i >= 10 && i <= 15)
  47.         i = i - 10 + 'A';
  48.     if(j >= 0 && j <=9)
  49.         j += '0';
  50.     else if(j >= 10 && j <= 15)
  51.         j = j - 10 + 'A';
  52.     UartSend(i);
  53.     UartSend(j);
  54.     UartSend(' ');
  55. }
  56. void PrintLong2Str(long addr){
  57.     unsigned char dat,i,j;
  58.     dat = (addr >> 16) & 0xFF;
  59.     i = (dat & 0xF0)>>4;
  60.     j = dat & 0x0F;
  61.     if(i >= 0 && i <=9)
  62.         i += '0';
  63.     else if(i >= 10 && i <= 15)
  64.         i = i - 10 + 'A';
  65.     if(j >= 0 && j <=9)
  66.         j += '0';
  67.     else if(j >= 10 && j <= 15)
  68.         j = j - 10 + 'A';
  69.     UartSend(i);
  70.     UartSend(j);
  71.    
  72.     dat = (addr >> 8) & 0xFF;
  73.     i = (dat & 0xF0)>>4;
  74.     j = dat & 0x0F;
  75.     if(i >= 0 && i <=9)
  76.         i += '0';
  77.     else if(i >= 10 && i <= 15)
  78.         i = i - 10 + 'A';
  79.     if(j >= 0 && j <=9)
  80.         j += '0';
  81.     else if(j >= 10 && j <= 15)
  82.         j = j - 10 + 'A';
  83.     UartSend(i);
  84.     UartSend(j);
  85.    
  86.     dat = addr & 0xFF;
  87.     i = (dat & 0xF0)>>4;
  88.     j = dat & 0x0F;
  89.     if(i >= 0 && i <=9)
  90.         i += '0';
  91.     else if(i >= 10 && i <= 15)
  92.         i = i - 10 + 'A';
  93.     if(j >= 0 && j <=9)
  94.         j += '0';
  95.     else if(j >= 10 && j <= 15)
  96.         j = j - 10 + 'A';
  97.     UartSend(i);
  98.     UartSend(j);
  99.     UartSend(' ');UartSend(' ');UartSend(' ');UartSend(' ');
  100. }
复制代码
PSRAM64.zip (2.79 MB, 下载次数: 1)



回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-13 23:13 , Processed in 0.105998 second(s), 50 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表