导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请教版主[spadaks]

 *第20660篇: 请教版主

  
楼 主:spadaks 2004年4月1日11:40
 请教版主
你好:

     我在用SM5964C40J RTL8019AS 等作51WEB模块, REMOTE DMA 出现一些问

题, 用REMOTE DMA WRITE 方式向从0X4000地址开始的地址块写入80字节,再用

REMOTE DMA READ 方式从0X4000地址开始的地址块中读,所读非所写. 所用代码

列如下,请指教 !

/*****************************************************************************/
/*                RTL8019AS  Initialize                                  */
/*****************************************************************************/
void ethernet_init(void)
{
    print("\n\r\n\r ethernet_init_begin ");  
    HW_RESET = 1;           
    delay(8000); 
    HW_RESET = 0;
    delay(8000);
    temp=EN_RESET;
    print("\n\r EN_RESET = ");
    putb_ser(temp);
    delay(8000);
    EN_RESET = 0x0;        
    delay(8000);

    EN_CMD = EN_PAGE0 + EN_NODMA + EN_STOP; /* 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP */

    delay(8000);

    EN0_RCNTLO =0;
    EN0_RSARHI =0;

    *((char xdata *)0x8001)=0x46;//PSTART
    *((char xdata *)0x8002)=0x60;//PSTOP
    *((char xdata *)0x8003)=0x46;//BNRY
    *((char xdata *)0x8004)=0x40;//TPSR

    *((char xdata *)0x800c)=0x04;//RCR
    *((char xdata *)0x800d)=0x02;//TCR

    *((char xdata *)0x800e)=0x48;
    *((char xdata *)0x800f)=0x0ff;
    *((char xdata *)0x800f)=0x0;

    EN_CMD = EN_PAGE1 + EN_NODMA + EN_STOP; /* 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP */

    EN1_PAR0 = 0x90;
    EN1_PAR1 = 0x34;
    EN1_PAR2 = 0x10;
    EN1_PAR3 = 0x10;
    EN1_PAR4 = 0x44;
    EN1_PAR5 = 0x10;

    EN1_CURR=0x40;  

    EN1_MAR0 = 0xff;  
    EN1_MAR1 = 0xff;
    EN1_MAR2 = 0xff;
    EN1_MAR3 = 0xff;
    EN1_MAR4 = 0xff;
    EN1_MAR5 = 0xff;
    EN1_MAR6 = 0xff;
    EN1_MAR7 = 0xff;
    
    EN_CMD = EN_PAGE3 + EN_NODMA + EN_STOP;  

    print("\n\r 9346CR = ");
    temp=*((char xdata *)0x8001);
    putb_ser(temp);

    EN_CMD = EN_PAGE2 + EN_NODMA + EN_STOP;  // 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP 

    EN_CMD = EN_PAGE0 + EN_NODMA + EN_STOP;  // 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP 

    *((char xdata *)0x800d)=0x0;//TCR

}

void DMA_write(byte *buffer, word StartAddr, word Count)
{

    print("\n\r\n\r DMA_write : "); 

    EN_CMD= EN_PAGE0 + EN_NODMA + EN_START; /* Remote DMA, Start the chip, clear reset */

    EN0_ISR=0x0ff;

    EN0_RCNTLO = (byte)(Count & 0xff);  /*  LSB Remote byte count reg  */
    EN0_RCNTHI = (byte)(Count >  >   8);  /*  MSB Remote byte count reg  */

    EN0_RSARLO = (byte)(StartAddr & 0xff);   /*  LSB Remote start address reg  */
    EN0_RSARHI = (byte)(StartAddr >  >   8);     /*  MSB Remote start address reg  */
 
    EN_CMD= EN_PAGE0 + EN_START + EN_RWRITE ; 

    for(loop=0;loop   < Count;loop++)
    { 
        EN_DATA =*buffer++;   
    }

    EN0_RCNTLO =0;
    EN0_RSARHI =0;
    EN_CMD = EN_PAGE0 + EN_NODMA + EN_START; 

}

void DMA_read(word StartAddr, word Count)
{
    
    EN_CMD = EN_PAGE0 + EN_NODMA + EN_START;
    /* Set Remote byte count */
    EN0_RCNTLO = (byte)(Count & 0xff);       /*  Low  byte of tx byte count  */
    EN0_RCNTHI = (byte)(Count >  >   8);  /*  High byte of tx byte count  Transmit byte count register */

    /* Set Remote Start Address */
    EN0_RSARLO = (byte)(StartAddr & 0xff);     /*LSB Remote start address reg  */
    EN0_RSARHI = (byte)(StartAddr >  >   8);     /*  MSB Remote start address reg  */
  
    EN_CMD = EN_PAGE0 + EN_RREAD + EN_START;
 
    for(loop=0;loop   < Count;loop++)
    {
        dmaread[loop] = EN_DATA; 
    }

    EN_CMD = EN_PAGE0 + EN_NODMA + EN_START; 

    for(loop=0;loop   < Count;loop++)
    {
          putb_ser(dmaread[loop]);
    }
}



>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:[求助]80c51 用keil c51 编程时 能用idat

[下一篇主题]:谁有IAR Embedded Workbench for 6