我在用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]);
}
}