找回密码
 立即注册
查看: 606|回复: 4

关于STC32G的外部SRAM使用问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-08-04 17:29:34

1

主题

5

回帖

49

积分

新手上路

积分
49
发表于 2024-4-17 19:45:47 | 显示全部楼层 |阅读模式
新人求助!!!

我自己做了块板,上面其他功能都正常,但唯独板子上的扩展SRAM不能使用,读取数据时全部都是乱码,调了好久了,还请各位大佬指点一二!

电路图:



程序:
SRAM.C文件
  1. #include "sram.h"
  2. void SRAM_Init()
  3. {
  4.         GPIO_InitTypeDef SRAM_Gpio_User;
  5.        
  6.         SRAM_Gpio_User.Mode = GPIO_PullUp;
  7.         SRAM_Gpio_User.Pin  = GPIO_Pin_All;
  8.        
  9.         GPIO_Inilize(SRAM_DataPort,&SRAM_Gpio_User);
  10.         GPIO_Inilize(SRAM_AddrPortH,&SRAM_Gpio_User);
  11.         GPIO_Inilize(SRAM_AddrPortL,&SRAM_Gpio_User);
  12.        
  13.         GPIO_Initnumber(SRAM_LE,GPIO_PullUp);
  14.         GPIO_Initnumber(SRAM_OE,GPIO_PullUp);
  15.         GPIO_Initnumber(SRAM_WE,GPIO_PullUp);
  16.         GPIO_Initnumber(SRAM_CE,GPIO_PullUp);
  17.        
  18.         P41 = 0;    //扩展SRAM使能
  19.     P27 = 0;    //最高地址位置零
  20.         P45 = 0;
  21.        
  22.         BUS_SPEED_4T();
  23. }
  24. u8 SRAM_Test()
  25. {
  26.         u8 a;
  27.         u32 i;
  28.         for(i=0;i<XDATA_LENTH;i++)
  29.         {
  30.                 if(i%2)EXRAM[i] = 0XFF;
  31.                 EXRAM[i] = 0X00;
  32.                 delay_ms(1);
  33.         }
  34.         delay_ms(1000);
  35.         for(i=0;i<XDATA_LENTH;i++)
  36.         {
  37.                 if(EXRAM[i] != 0X55)
  38.                 {               
  39.                         printf("0X55 ADDRESS %ld 0X%X\r\n",i,EXRAM[i]);//测试输出用[apoyl_multivideo]
  40. ##第一集
  41. ##第二集
  42. ##第三集
  43. [/apoyl_multivideo]
  44.                 }               
  45.         }
  46.        
  47.         for(i=0;i<XDATA_LENTH;i++)
  48.         {
  49.                 EXRAM[i] = 0XAA;
  50.         }
  51.         for(i=0;i<XDATA_LENTH;i++)
  52.         {
  53.                 if(EXRAM[i] != 0XAA)
  54.                 {               
  55.                         printf("0XAA ADDRESS %ld 0X%X\r\n",i,EXRAM[i]);
  56.                 }               
  57.         }
  58.        
  59.         a=0;
  60.         for(i=0;i<XDATA_LENTH;i++)
  61.         {
  62.                 a++;
  63.                 if(a > 254)a=0;
  64.                 EXRAM[i] = a;
  65.         }
  66.         a=0;
  67.         for(i=0;i<XDATA_LENTH;i++)
  68.         {
  69.                 a++;
  70.                 if(a > 254)a=0;
  71.                 if(EXRAM[i] != a)
  72.                 {               
  73.                         printf("%d ADDRESS %ld 0X%X\r\n",a,i,EXRAM[i]);
  74.                 }               
  75.         }
  76. }
复制代码



SRAM.H头文件
  1. #ifndef _SRAM_H_
  2. #define _SRAM_H_
  3. #include  "STC32G_GPIO.h"
  4. #include        "public/config.h"
  5. #include        "public/STC32G_Delay.h"
  6. /*************  本地常量声明    **************/
  7. #define     Baudrate1       115200L
  8. #define     XDATA_LENTH     65536   //xdata长度
  9. #define     BUS_SPEED_1T()  BUS_SPEED = 0
  10. #define     BUS_SPEED_2T()  BUS_SPEED = 1
  11. #define     BUS_SPEED_4T()  BUS_SPEED = 2
  12. #define     BUS_SPEED_8T()  BUS_SPEED = 3
  13. #define EXRAM           ((unsigned char volatile far *)0x7f0000)
  14. #define EXRAM_Enble() EXTRAM = 1
  15. #define EXRAM_Disble() EXTRAM = 0
  16. #define SRAM_DataPort GPIO_P0
  17. #define SRAM_AddrPortH GPIO_P2
  18. #define SRAM_AddrPortL GPIO_P0
  19. #define SRAM_LE P45
  20. #define SRAM_OE P44
  21. #define SRAM_WE P42
  22. #define SRAM_CE P41
  23. void SRAM_Init();
  24. u8 SRAM_Test();
  25. #endif
复制代码


串口输出:
截图202404171943456683.jpg

SRAM芯片使用的IS61WV5128BL
64KB 8BIT
我第一下次使用这个扩展SRAM功能,应该是我的配置有问题,还烦请各位大佬帮忙查正,谢谢!

sram.zip (1.05 KB, 下载次数: 69)

截图202404171936371321.jpg
截图202404171937268237.jpg
截图202404171937381894.jpg
截图202404171938471891.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

积分
2470
发表于 2024-4-18 08:55:11 | 显示全部楼层
扩展外部ram,不如直接选一款ram大的单片机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2024-4-18 09:27:01 | 显示全部楼层
可以参考示范例程。

STC32G-DEMO-CODE-V9.6-20240226
35-板上的32K xdata测试程序

本例程基于STC32G为主控芯片的实验箱进行编写测试。

使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。

edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。

测试外挂的32K xdata程序。
测试方式:
1: 写入0x55, 并读出判断是否全部是0x55.
2: 写入0xaa, 并读出判断是否全部是0xaa.
3: 写入32768字节的汉字字库(类似于随机数据), 并读出比较.

通过串口2发送单个字符x或X, 开始测试, 并返回相关的测试结果.

串口设置115200bps, 8, N, 1. 切换到P4.6 P4.7.

下载时, 选择时钟 22.1184MHz (用户可自行修改频率).


/********************* 主函数 *************************/
void main(void)
{
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

//    P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
//    P1M1 = 0x32;   P1M0 = 0x32;   //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
//    P2M1 = 0x3c;   P2M0 = 0x3c;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
//    P3M1 = 0x50;   P3M0 = 0x50;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
//    P4M1 = 0x3c;   P4M0 = 0x3c;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
//    P5M1 = 0x0c;   P5M0 = 0x0c;   //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
//    P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
//    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
   
    delay_ms(10);
    UART2_config(2);
    EA = 1;     //打开总中断
   
    P41 = 0;    //扩展SRAM使能
    P27 = 0;    //最高地址位置零

    PrintString2("STC32G xdata test programme!\r\n"); //UART2发送一个字符串
    PrintString2("\r\n串口发送单个字符x或X, 开始测试.\r\n");

    BUS_SPEED_8T(); //1T  2T  4T  8T    3V@22MHZ用1T会访问错误
    ExternalRAM_enable();   //允许外部XDATA
//  InternalRAM_enable();   //允许内部XDATA

    while(1)
    {
        delay_ms(1);
        if(RX2_TimeOut > 0)     //超时计数
        {
            if(--RX2_TimeOut == 0)  //串口通讯结束
            {
                if(RX2_Cnt > 0)     //收到数据字节数
                {
                    if(RX2_Cnt == 1)    Xdata_Test();   //单字节命令
                }
                RX2_Cnt = 0;
            }
        }
    }
}



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-08-04 17:29:34

1

主题

5

回帖

49

积分

新手上路

积分
49
发表于 2024-4-18 17:43:50 | 显示全部楼层
angm*** 发表于 2024-4-18 09:27
可以参考示范例程。

STC32G-DEMO-CODE-V9.6-20240226

好的,我这就去试试!
回复 支持 反对

使用道具 举报 送花

0

主题

5

回帖

12

积分

新手上路

积分
12
发表于 2024-8-8 09:23:47 | 显示全部楼层
需要外扩SPI  PSRAM-LY68L6400、SPI  SRAM、传统SRAM可以联系我陶先生13764140309(管理员别屏蔽我了,我是给大家解决问题的)
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:42 , Processed in 0.228178 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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