文件我用了沁恒公司提供的原程序CH375HFT.C 和库6,只修改了CH375地址和RAM区长度。 CH375A 初始化没问题,接下来的 CH375DiskConnect( ),CH375DiskReady( ) 第一次就通过了,再接下来的i = CH375FileOpen( ); /* 打开文件 */总是返回A1 在RAM(首地址0X8000,长度16K) 地址区0X8000--0X8003的4个数据总是变成了00,00,00,20H 用CH375EV4.C这个程又可正确读出指定文件的数据到指定的RAM中,也不出现RAM数据变了现象。真是怪。这问题困我很久了。RAM用多种数据多次读写测试也没问题。我真不知道是我的仿真器有问题,还是编译器有问题!(WAVE6000.EXE H51/S)[Emot]4[/Emot][Emot]4[/Emot][Emot]4[/Emot][Emot]6[/Emot]
那你将程序烧到单片机里面试下看会出现你这样的问题吗?
早试过的,写芯片也一样啊,用P1口接8个LED显示返回字,执行完i = CH375FileOpen();就让它停下来,LED 显示值为A1。
A1H错误,基本是都是RAM问题,包括RAM地址错误,DISK_BASE_BUF指向空的地址无物理RAM,与别的器件地址冲突,pDISK_BASE_BUF初值不正确等
图是我后加上的。仔细看图会发现编译后的内码有错误。绝对不是硬件有问题!而是你们的封装有问题:RAM只能适应以地址0000开始的地址。
RAM起始地址可以0到0FE00H之间的任意地址,并且也可以是动态的,用程序测试一下RAM,看MAP文件.M51中的地址分配到底是多少
这样看来,可能是编译器没能正确编译?0000H这样的地址在程序中是没有定义的。
遇到同样的问题。 外扩64K SRAM ,使用CPLD译码,将CH375映射到32K以上的地址(映射地址将使SRAM 的片选无效)
目前使用的是SST89C58MCU,使用MCU内部自带1K SRAM,EXAM3例子运行正常,禁止使用MCU自带1K SRAM后,也运行,至少说明外扩的SRAM的低端1K部分正常。
将下面语句修改后就出现返回A1 错误码 原文件语句: #define DISK_BASE_BUF_ADDR 0x0000 #define FILE_DATA_BUF_ADDR 0x0000 #define FILE_DATA_BUF_LEN 0x0200
修改后语句: #define DISK_BASE_BUF_ADDR 0x0000 #define FILE_DATA_BUF_ADDR 0x0200 #define FILE_DATA_BUF_LEN 0x7800
你确定你的外部RAM的地址是从0X0000开始的?还有就是地址有没有错误和冲突?
看编译后的M51或MAP文件,看有没有哪个变量的地址超过实际的RAM地址范围, 库除了DISK-BASE-BUF之外,还需要几个字节的XDATA作为变量,所以你分配RAM时不要将XRAM全部用完, SIZEOF(DISK_BASE_BUF)+SIZEOF(FILE_DATA_BUF)+N < SIZEOF(XDATA RAM TOTAL SIZE) 其中N要看库的版本,库6需要约20个字节,库C需要约80个字节
我的硬件和地址定义肯定是没问题的,这一点不需要异议,HCN 你可以定义一个不是以0000H开始的XRAM,用WAVE6000.EXE H51/S 编译CH375HFT.C 和库6,然后去看disassembly窗口,肯定会看到有许多地方出现访问0000H XRAM的语句。就像我发的图。