|
程序如下,主要的问题是这样的,无法分开读取高64K 的数据或低64K的数据,发现,即使把最高位A16的地址线高电平,也和A16的地址线低电平的时候数据一样,还有一个问题要写入 4个数据,读前三个是正确的,读第四个都是 0 ,高位低位数据都一样的
假如低位 写入 00 11 22 33
高位 写入 AA BB CC DD 读到的数据都是 AA BB CC 00 ,高位低位都一样,
希望给点帮助,谢谢
使用了 两片 74HC373 作为高8位低8位地址锁存
//*************************************************************
void ram_init_out(void)//对读取的RAM控制管脚初始化
{
storage_hc373_high_cli();
ouput_hc244_set();
ouput_hc373_cli();
storage_hc373_low_cli();
}
//**************************************************************
void sram_output_init(void)
{
init_output_ddr();
ram_init_out();//对读取的RAM控制管脚初始化 244 373h 372l
storage_p_cs_set();
storage_p_rd_set();
storage_p_wr_set();
}
//*************************************************************
void sram_input_init(void)
{
init_input_ddr();
ram_init_out();//对读取的RAM控制管脚初始化 244 373h 372l
storage_p_cs_set();
storage_p_rd_set();
storage_p_wr_set();
}
//**************************************************************
uchar read_storage_data_low(uchar addh,uchar addl)//地址高,地址低,低64K标志位
{
uchar read_data;
sram_output_init(); //端口初始化
// storage_a16_cli(); //低64K数据位
// asm("nop");asm("nop");
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addl;
asm("nop");asm("nop");
ram_low_out_set(); //地址低位373锁存输出
asm("nop");asm("nop");
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addh; //输出地址高
asm("nop");asm("nop");
ram_high_out_set();//地址高位373锁存输出
asm("nop");asm("nop");
ram_high_out_cli();
asm("nop");asm("nop");
//-------------------------------
init_input_ddr(); //端口配置为输入
asm("nop");asm("nop");
storage_p_cs_cli();
asm("nop");asm("nop");
storage_p_rd_cli();
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
read_data=PINA;
storage_p_rd_set();
storage_p_cs_set();
return read_data;
//-------------------------------
}
//**************************************************************
void write_storage_data_low(uchar addh,uchar addl,uchar write_data)//地址高,地址低, 低64K标志位
{
sram_output_init();//端口初始化
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addl;
asm("nop");asm("nop");
ram_low_out_set(); //地址低位373锁存输出
asm("nop");asm("nop");
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addh; //输出地址高
asm("nop");asm("nop");
ram_high_out_set(); //地址高位373锁存输出
asm("nop");asm("nop");
ram_high_out_cli();
asm("nop");asm("nop");
//-------------------------------
PORTA=write_data;
asm("nop");asm("nop");
storage_p_cs_cli();
asm("nop");asm("nop");
storage_p_wr_cli();
asm("nop");asm("nop");
storage_p_wr_set();
storage_p_cs_set();
asm("nop");asm("nop");
//--------------------------------
}
//**************************************************************
uchar read_storage_data_high(uchar addh,uchar addl)//地址高,地址低,低64K标志位
{
uchar read_data;
sram_output_init(); //端口初始化
// storage_a16_set(); //低64K数据位
// asm("nop");asm("nop");
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addl;
asm("nop");asm("nop");
ram_low_out_set(); //地址低位373锁存输出
asm("nop");asm("nop");
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addh; //输出地址高
asm("nop");asm("nop");
ram_high_out_set(); //地址高位373锁存输出
asm("nop");asm("nop");
ram_high_out_cli();
asm("nop");asm("nop");
//-------------------------------
init_input_ddr(); //端口配置为输入
asm("nop");asm("nop");
storage_p_cs_cli();
asm("nop");asm("nop");
storage_p_rd_cli();
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
read_data=PINA;
storage_p_rd_set();
storage_p_cs_set();
return read_data;
//-------------------------------
}
//**************************************************************
void write_storage_data_high(uchar addh,uchar addl,uchar write_data)//地址高,地址低, 低64K标志位
{
sram_output_init();//端口初始化
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addl;
asm("nop");asm("nop");
ram_low_out_set(); //地址低位373锁存输出
asm("nop");asm("nop");
ram_low_out_cli();
asm("nop");asm("nop");
PORTA=addh; //输出地址高
asm("nop");asm("nop");
ram_high_out_set(); //地址高位373锁存输出
asm("nop");asm("nop");
ram_high_out_cli();
asm("nop");asm("nop");
//-------------------------------
PORTA=write_data;
asm("nop");asm("nop");
storage_p_cs_cli();
asm("nop");asm("nop");
storage_p_wr_cli();
asm("nop");asm("nop");
storage_p_wr_set();
storage_p_cs_set();
asm("nop");asm("nop");
//--------------------------------
}
//**************************************************************
void read_storage_total_dada(void)//读取内存中总数量
{
uchar aa;
storage_a16_cli(); //低64K数据位
asm("nop");asm("nop");
write_storage_data_low(0x00,0x00,0x01);//地址高,地址低,低64K标志位
write_storage_data_low(0x00,0x01,0x23);//地址高,地址低, 低64K标志位
write_storage_data_low(0x00,0x02,0x45);//地址高,地址低, 低64K标志位
write_storage_data_low(0x00,0x03,0x67);//地址高,地址低, 低64K标志位
asm("nop");asm("nop");
storage_a16_set(); //低64K数据位
asm("nop");asm("nop");
write_storage_data_high(0x00,0x00,0xaa);//地址高,地址低,高64K
write_storage_data_high(0x00,0x01,0xbb);//地址高,地址低,高64K
write_storage_data_high(0x00,0x02,0xcc);//地址高,地址低,高64K
write_storage_data_high(0x00,0x03,0xdd);//地址高,地址低,高64K
storage_a16_cli(); //低64K数据位
asm("nop");asm("nop");
aa=read_storage_data_low(0x00,0x00);//地址高,地址低, 低64K标志位
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
aa=read_storage_data_low(0x00,0x01);//地址高,地址低, 低64K标志位
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
aa=read_storage_data_low(0x00,0x02);//地址高,地址低, 低64K标志位
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
aa=read_storage_data_low(0x00,0x03);//地址高,地址低, 低64K标志位
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
storage_a16_set(); //高64K数据位
asm("nop");asm("nop");
aa=read_storage_data_high(0x00,0x00);//地址高,地址低,高64K
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
aa=read_storage_data_high(0x00,0x01);//地址高,地址低,高64K
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
aa=read_storage_data_high(0x00,0x02);//地址高,地址低,高64K
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
aa=read_storage_data_high(0x00,0x03);//地址高,地址低,高64K
UDR0=aa;
while(!(UCSR0A&(1<<UDRE0))){;}
_delay_us(1);
}
//**************************************************************
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|