搜索
bottom↓
回复: 1

各位帮忙看看ATMEGA128 读写HM628128里数据的程序

[复制链接]

出0入0汤圆

发表于 2013-3-14 22:11:33 | 显示全部楼层 |阅读模式
程序如下,主要的问题是这样的,无法分开读取高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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-3-15 22:10:30 | 显示全部楼层
顶下,望有人给个回复,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 02:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表