关于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功能,应该是我的配置有问题,还烦请各位大佬帮忙查正,谢谢!
扩展外部ram,不如直接选一款ram大的单片机 可以参考示范例程。
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;
}
}
}
}
angmall 发表于 2024-4-18 09:27
可以参考示范例程。
STC32G-DEMO-CODE-V9.6-20240226
好的,我这就去试试!
需要外扩SPI PSRAM-LY68L6400、SPISRAM、传统SRAM可以联系我陶先生13764140309(管理员别屏蔽我了,我是给大家解决问题的)
页:
[1]