XJX 发表于 2024-4-17 19:45:47

关于STC32G的外部SRAM使用问题

新人求助!!!

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

电路图:



程序:
SRAM.C文件
#include "sram.h"

void SRAM_Init()
{
        GPIO_InitTypeDef SRAM_Gpio_User;
       
        SRAM_Gpio_User.Mode = GPIO_PullUp;
        SRAM_Gpio_User.Pin= GPIO_Pin_All;
       
        GPIO_Inilize(SRAM_DataPort,&SRAM_Gpio_User);
        GPIO_Inilize(SRAM_AddrPortH,&SRAM_Gpio_User);
        GPIO_Inilize(SRAM_AddrPortL,&SRAM_Gpio_User);
       
        GPIO_Initnumber(SRAM_LE,GPIO_PullUp);
        GPIO_Initnumber(SRAM_OE,GPIO_PullUp);
        GPIO_Initnumber(SRAM_WE,GPIO_PullUp);
        GPIO_Initnumber(SRAM_CE,GPIO_PullUp);
       
        P41 = 0;    //扩展SRAM使能
    P27 = 0;    //最高地址位置零
        P45 = 0;
       
        BUS_SPEED_4T();
}

u8 SRAM_Test()
{
        u8 a;
        u32 i;
        for(i=0;i<XDATA_LENTH;i++)
        {
                if(i%2)EXRAM = 0XFF;
                EXRAM = 0X00;
                delay_ms(1);
        }
        delay_ms(1000);
        for(i=0;i<XDATA_LENTH;i++)
        {
                if(EXRAM != 0X55)
                {               
                        printf("0X55 ADDRESS %ld 0X%X\r\n",i,EXRAM);//测试输出用
##第一集
##第二集
##第三集

                }               
        }
       
        for(i=0;i<XDATA_LENTH;i++)
        {
                EXRAM = 0XAA;
        }
        for(i=0;i<XDATA_LENTH;i++)
        {
                if(EXRAM != 0XAA)
                {               
                        printf("0XAA ADDRESS %ld 0X%X\r\n",i,EXRAM);
                }               
        }
       
        a=0;
        for(i=0;i<XDATA_LENTH;i++)
        {
                a++;
                if(a > 254)a=0;
                EXRAM = a;
        }
        a=0;
        for(i=0;i<XDATA_LENTH;i++)
        {
                a++;
                if(a > 254)a=0;
                if(EXRAM != a)
                {               
                        printf("%d ADDRESS %ld 0X%X\r\n",a,i,EXRAM);
                }               
        }
}


SRAM.H头文件
#ifndef _SRAM_H_
#define _SRAM_H_

#include"STC32G_GPIO.h"
#include        "public/config.h"
#include        "public/STC32G_Delay.h"

/*************本地常量声明    **************/
#define   Baudrate1       115200L

#define   XDATA_LENTH   65536   //xdata长度

#define   BUS_SPEED_1T()BUS_SPEED = 0
#define   BUS_SPEED_2T()BUS_SPEED = 1
#define   BUS_SPEED_4T()BUS_SPEED = 2
#define   BUS_SPEED_8T()BUS_SPEED = 3

#define EXRAM         ((unsigned char volatile far *)0x7f0000)

#define EXRAM_Enble() EXTRAM = 1
#define EXRAM_Disble() EXTRAM = 0

#define SRAM_DataPort GPIO_P0
#define SRAM_AddrPortH GPIO_P2
#define SRAM_AddrPortL GPIO_P0

#define SRAM_LE P45
#define SRAM_OE P44
#define SRAM_WE P42
#define SRAM_CE P41

void SRAM_Init();
u8 SRAM_Test();
#endif

串口输出:


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



小飞侠 发表于 2024-4-18 08:55:11

扩展外部ram,不如直接选一款ram大的单片机

angmall 发表于 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(); //1T2T4T8T    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;
            }
      }
    }
}



XJX 发表于 2024-4-18 17:43:50

angmall 发表于 2024-4-18 09:27
可以参考示范例程。

STC32G-DEMO-CODE-V9.6-20240226


好的,我这就去试试!

上海旻星 发表于 2024-8-8 09:23:47

需要外扩SPI  PSRAM-LY68L6400、SPISRAM、传统SRAM可以联系我陶先生13764140309(管理员别屏蔽我了,我是给大家解决问题的)
页: [1]
查看完整版本: 关于STC32G的外部SRAM使用问题