📄 memory.c
字号:
/****************************************************************************
**
** 文件名: momery.c
** 功能: C8051Fxxx的SRAM驱动;
** 创建时间:2005.08.05
** 修改时间:2005.12.01
** 修改说明:
** 作者: 李立学
** 版权申明:可以拷贝,可以修改,但必须保留修改时间和作者信息
**
****************************************************************************/
#include "LZK.H"
/****************************************************************************
** 函数名称: ExInSRAM_Select()
** 功能描述: 片外/片内SRAM选择
** 入口参数: ExInSRAM,
0:选择片内SRAM;
1:选择片外SRAM;
** 出口参数: 无
** 全局变量: 无
** 调用模块: 无
** 说明:
****************************************************************************/
void ExInSRAM_Select(bit ExInSRAM)
{
SFRPAGE = 0x00;
if( ExInSRAM ) // ExInSRAM = 1: Use External SRAM,800k/S.
{
EMI0CF = 0x25; // 0010_1101, ALE: 2SYSCLK. External SRAM Only.
EMI0TC = 0x49; // 01_0010_01: AST:1,nWR/nRd:3SYSCLK,AHT:1.
}
else // ExInSRAM = 0: Use Internal SRAM,900k/S.
{
EMI0CF = 0x00; // 0000 0000, ALE: 1SYSCLK. Internal SRAM Only.
EMI0TC = 0x00; // 00 0000 00: AST:0,nWR/nRd:0SYSCLK,AHT:0.
}
}
/****************************************************************************
** 函数名称: ExSRAM_PageSetting()
** 功能描述: 片外SRAM页选择,每页64kB
** 入口参数: PageNum,片外SRAM页号,0~31;
** 出口参数: 无
** 全局变量: ucP4DATA
** 调用模块: 无
** 说明:
****************************************************************************/
void ExSRAM_PageSetting(uint8 PageNum)
{
uint8 ucTMP;
if( PageNum >= 16 )
return;
/*******************************
*** Switch to ExSRAM ***
*******************************/
SFRPAGE = 0x00;
EMI0CF = 0x2d; // 0010 1101, ALE: 2SYSCLK. External SRAM Only.
EMI0TC = 0x49; // 01 0010 01: AST:1,nWR/nRd:3SYSCLK,AHT:1.
SFRPAGE = 0x0f;
ucTMP = ucP4DATA & 0xC0 | PageNum; // ExSRAM Page Caculate,nMCS = 0;
P4 = ucTMP; // ExSRAM Page Setting.
SFRPAGE = 0x00;
}
/****************************************************************************
** 函数名称: InSRAM_SelfTest()
** 功能描述: 片内SRAM自检测试
** 入口参数: 无
** 出口参数: 0/1:自检错误/自检正常
** 全局变量: 无
** 调用模块: 无
** 说明:
****************************************************************************/
bit InSRAM_SelfTest(void) // Toatal bytes: 4k( from 0x0000~0x0fff)
{
uint16 data i;
uint8 data j,ucTMP;
uint8 xdata *idata p1;
p1 = 0x0000;
for(i=0x0000;i<0x0fff;i++)
{
j = i >> 8; // 256 bytes every SmallPage.
*p1 = j;
p1++; // Address Increase 1.
}
p1 = 0x0000;
for(i=0x0000;i<0x0fff;i++)
{
j = i >> 8;
ucTMP = *p1;
p1++;
if(ucTMP != j)
return 1;
}
p1 = 0x0000;
for(i=0;i<0x0fff;i++)
{
*p1 = 0x55;
p1++;
}
p1 = 0x0000;
for(i=0;i<0x0fff;i++)
{
ucTMP = *p1;
if(ucTMP != 0x55)
return 1;
}
p1 = 0x0000;
for(i=0;i<0x0fff;i++)
{
*p1 = 0xaa;
p1++;
}
p1 = 0x0000;
for(i=0;i<0x0fff;i++)
{
ucTMP = *p1;
if(ucTMP != 0xaa)
return 1;
}
j=0;
p1 = 0x0000;
for(i=0x0000;i<0x0fff;i++)
{
*p1 = j;
p1++;
j++;
}
j=0;
p1 = 0x0000;
for(i=0x0000;i<0x0fff;i++)
{
ucTMP = *p1;
p1++;
if(ucTMP != j)
return 1; // Testing fail
j++;
}
return 0; // Testing success
}
/****************************************************************************
** 函数名称: ExSRAM_SelfTest()
** 功能描述: 片外SRAM自检测试
** 入口参数: 无
** 出口参数: 0/1:自检错误/自检正常
** 全局变量: 无
** 调用模块: ExSRAM_PageSetting();
** 说明:
****************************************************************************/
bit ExSRAM_SelfTest(void)
{
uint16 data i;
uint8 data j, ucTMP, PageNum;
uint8 xdata *idata p1;
for(PageNum=0;PageNum<8;PageNum++) // Step 1;
{
ExSRAM_PageSetting(PageNum);
p1 = 0x0000;
for(i=0x0000;i<0xffff;i++)
{
j = i >> 8; // 256 bytes every SmallPage.
*p1 = j;
p1++; // Address Increase 1.
}
p1 = 0x0000;
for(i=0x0000;i<0xffff;i++)
{
j = i >> 8;
ucTMP = *p1;
p1++;
if(ucTMP != j)
return 1;
}
}
for(PageNum=0;PageNum<8;PageNum++) // Step 2;
{
ExSRAM_PageSetting(PageNum);
p1 = 0x0000;
for(i=0;i<0xffff;i++)
{
*p1 = 0x55;
p1++;
}
p1 = 0x0000;
for(i=0;i<0xffff;i++)
{
ucTMP = *p1;
if(ucTMP != 0x55)
return 1;
}
}
for(PageNum=0;PageNum<8;PageNum++) // Step 3;
{
ExSRAM_PageSetting(PageNum);
p1 = 0x0000;
for(i=0;i<0xffff;i++)
{
*p1 = 0xaa;
p1++;
}
p1 = 0x0000;
for(i=0;i<0xffff;i++)
{
ucTMP = *p1;
if(ucTMP != 0xaa)
return 1;
}
}
for(PageNum=0;PageNum<8;PageNum++) // Step 4;
{
ExSRAM_PageSetting(PageNum);
j=0;
p1 = 0x0000;
for(i=0x0000;i<0xffff;i++)
{
*p1 = j;
p1++;
j++;
}
j=0;
p1 = 0x0000;
for(i=0x0000;i<0xffff;i++)
{
ucTMP = *p1;
p1++;
if(ucTMP != j)
return 1; // Testing fail
j++;
}
}
ExSRAM_PageSetting(0);
return 0; // Testing success
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -