jiangliq_2000
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1225回复:3

MCU+D12+外部RAM,读数据时出问题,紧急求救!!!help me

楼主#
更多 发布于:2004-06-05 22:20
各位,我用的MCU+D12+外部RAM,但是我现在发现读写存储器时老出问题,我的驱动用的是周立

功的,顺便也用了EsayD12.dll,我首先是通过端点2用 WritePort2(databuff,64)写数据给MCU

,主端点OUT固件如下
//主端点OUT控制
void main_rxdone(void)
{
unsigned char len,epstatus;
unsigned char i;
D12_ReadLastTransactionStatus(4); //清中断标志位
//接收数据
len = D12_ReadEndpoint(4, 64, EpBuf);
epstatus=D12_ReadEndpointStatus(4);
epstatus &= 0x60;
if (epstatus == 0x60)
len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
    MCU_D12CS = 0x1;
    MCU_RAMCS =0x0;
    for(i=0;i<len;i++)
         XBYTE[RAMdata+i] = EpBuf;
    MCU_RAMCS =0x1;
MCU_D12CS = 0x0;
   if (epstatus == 0x60)
len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据    

}

然后我通过端点1发个字符'c'来通知MCU,PC机要开始读数据了
//端点1OUT处理
void ep1_rxdone(void)
{
unsigned char len;
D12_ReadLastTransactionStatus(2); //清中断标志位
len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
if(len != 0)
bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
    
if(GenEpBuf[0]=='c')  //自己定义:判断是不是要读数据
      main_txdone();        //这个就是主端点IN控制
}

//主端点IN控制如下
void main_txdone(void)
{
// unsigned char len,epstatus;
    unsigned char i;
D12_ReadLastTransactionStatus(5); //清中断标志位

    MCU_D12CS = 0x1;
    MCU_RAMCS = 0x0;
    for(i=0;i<64;i++)            //自己定义,写数据到外部RAM
      EpBuf = XBYTE[RAMdata+i];
    MCU_RAMCS =0x1;
    MCU_D12CS = 0x0;
D12_WriteEndpoint(5, 64, EpBuf);
}

然后我在PC机端用ReadPort2(databuff,64)读数据,发现读出来的数据与写进去的不一致,比如我写的数据是64个'i',读出来的却是iiiiiiiiiiiiiiiiyyyyyyyyyyyyyyyyiiiiiiiiiiiiiiiiyyyyyyyyyyyyyyyy,真不知道错了那
里,后来我把存储器的首地址从0X0000改为0X0030,却发现写了64个'i'进去,读出来的却是yyyyyyyyyyyyyyyiiiiiiiiiiiiiiiiyyyyyyyyyyyyyyyyiiiiiiiiiiiiiiii,真是奇怪了。
    
    另外我在程序里不用外部RAM时,读写都是正常的,所以我估计主要问题就是出在读写外部RAM时的问题。但是我在KEIL C的仿镇环境(也有读写外部RAM)下发现与预期的目标是一致的也就是说写64个'i'进去,读出来的也是64个'i'。。

   各位大虾,这个到底是怎么回事啊!,这个与存储器的读写速度有没有关系啊!!忘大侠指点迷津,不胜感激。。
jiangliq_2000
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-08 12:18
jlmay
   谢谢你的思路,按照你说的把读写RAM的程序放到主循环里去做,我稍微试了一下,好象可以做哦,先给15分,余下的等我做好了再给了,呵呵,谢谢!!
jiangliq_2000
驱动牛犊
驱动牛犊
  • 注册日期2003-07-31
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-06 21:02
jlmay,谢谢
   我的MCU_D12用的是P3.3,MCU_RAMCS用的是P3.4,所以我觉的把首地址定义为0X0000应该是没问题的,你说的在MAIN循环里处理命令我没试过,明天试试,多谢了,到时有问题再向你请教!!
  
jlmay
驱动牛犊
驱动牛犊
  • 注册日期2001-09-15
  • 最后登录2004-12-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-06 15:32
    我以前也用过外部RAM,提一点点建议啊。会不会是外部数据存储器的首地址定义的问题?MCU_D12CS 、MCU_RAMCS 是什么口?

    还有在中断的函数里处理数据的读写操作不知道会不会有影响,我看例程都是放在MAIN循环里处理命令的。在中断函数里只是设置标志位。
游客

返回顶部