1、u8 DM9000_Init(void)函数中有如下语句,想问下0x1FFFF7E8这个地址为什么是这个值,怎么来的??
temp=*(vu32*)(0x1FFFF7E8); //获取STM32的唯一ID的前24位作为MAC地址后三字节
dm9000cfg.mode=DM9000_AUTO;
dm9000cfg.queue_packet_len=0;
//DM9000的SRAM的发送和接收指针自动返回到开始地址,并且开启接收中断
dm9000cfg.imr_all = IMR_PAR|IMR_PRI;
2、如下函数红 {MOD}标注部分,我疑问是DM9000_ReadReg(DM9000_MRCMDX);//假读 假读后按照代码逻辑存储器地址为自动+1个字节,
所以再次调用rxbyte=(u8)DM9000->DATA;语句时应该读取值为dm9000 rsr寄存器值,可是实际情况不是这样的,为什么?
后面的语句 DM9000->REG=DM9000_MRCMD;
rx_status=DM9000->DATA;
rx_length=DM9000->DATA; 按代码逻辑就是这个意思,为什么在这里不是这样的,很困惑?
struct pbuf *DM9000_Receive_Packet(void)
{
struct pbuf* p;
struct pbuf* q;
u32 rxbyte;
vu16 rx_status, rx_length;
u16* data;
u16 dummy;
int len;
p=NULL;
__error_retry:
DM9000_ReadReg(DM9000_MRCMDX); //假读
rxbyte=(u8)DM9000->DATA; //进行第二次读取
if(rxbyte) //接收到数据
{
if(rxbyte>1) //rxbyte大于1,接收到的数据错误,挂了
{
printf("dm9000 rx: rx error, stop device
");
DM9000_WriteReg(DM9000_RCR,0x00);
DM9000_WriteReg(DM9000_ISR,0x80);
return (struct pbuf*)p;
}
DM9000->REG=DM9000_MRCMD;
rx_status=DM9000->DATA;
rx_length=DM9000->DATA;
//if(rx_length>512)printf("rxlen:%d
",rx_length);
p=pbuf_alloc(PBUF_RAW,rx_length,PBUF_POOL); //pbufs内存池分配pbuf
if(p!=NULL) //内存申请成功
{
for(q=p;q!=NULL;q=q->next)
{
data=(u16*)q->payload;
len=q->len;
while(len>0)
{
*data=DM9000->DATA;
data++;
len-= 2;
}
}
}else //内存申请失败
{
printf("pbuf内存申请失败:%d
",rx_length);
data=&dummy;
len=rx_length;
while(len)
{
*data=DM9000->DATA;
len-=2;
}
}
//根据rx_status判断接收数据是否出现如下错误:FIFO溢出、CRC错误
//对齐错误、物理层错误,如果有任何一个出现的话丢弃该数据帧,
//当rx_length小于64或者大于最大数据长度的时候也丢弃该数据帧
if((rx_status&0XBF00) || (rx_length < 0X40) || (rx_length > DM9000_PKT_MAX))
{
printf("rx_status:%#x
",rx_status);
if (rx_status & 0x100)printf("rx fifo error
");
if (rx_status & 0x200)printf("rx crc error
");
if (rx_status & 0x8000)printf("rx length error
");
if (rx_length>DM9000_PKT_MAX)
{
printf("rx length too big
");
DM9000_WriteReg(DM9000_NCR, NCR_RST); //复位DM9000
delay_ms(5);
}
if(p!=NULL)pbuf_free((struct pbuf*)p); //释放内存
p=NULL;
goto __error_retry;
}
}else
{
DM9000_WriteReg(DM9000_ISR,ISR_PTS); //清除所有中断标志位
dm9000cfg.imr_all=IMR_PAR|IMR_PRI; //重新接收中断
DM9000_WriteReg(DM9000_IMR, dm9000cfg.imr_all);
}
return (struct pbuf*)p;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
//当rx_length小于64或者大于最大数据长度的时候也丢弃该数据帧
if((rx_status&0XBF00) || (rx_length < 0X40) || (rx_length > DM9000_PKT_MAX))
一周热门 更多>