找回密码
 立即注册
查看: 49|回复: 3

关于STC32G的外部SRAM使用问题

[复制链接]
  • TA的每日心情
    开心
    2024-4-20 20:25
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    1

    回帖

    21

    积分

    新手上路

    积分
    21
    发表于 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, 下载次数: 0)

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:34
  • 签到天数: 66 天

    [LV.6]常住居民II

    4

    主题

    414

    回帖

    1114

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 159 天

    [LV.7]常住居民III

    9

    主题

    834

    回帖

    3253

    积分

    论坛元老

    积分
    3253
    发表于 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;
                }
            }
        }
    }



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-20 20:25
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    1

    回帖

    21

    积分

    新手上路

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

    STC32G-DEMO-CODE-V9.6-20240226

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-1 03:57 , Processed in 0.060272 second(s), 43 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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