DM9000代码 几处疑惑,想询问下

2019-07-21 06:04发布

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;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
帅的没女朋友
1楼-- · 2019-07-21 11:15
另外还想问下,这个当rx_length小于64或者大于最大数据长度的时候也丢弃该数据帧,64字节是怎么来的

//当rx_length小于64或者大于最大数据长度的时候也丢弃该数据帧
                if((rx_status&0XBF00) || (rx_length < 0X40) || (rx_length > DM9000_PKT_MAX))
正点原子
2楼-- · 2019-07-21 14:48
 精彩回答 2  元偷偷看……
二九结狐六体
3楼-- · 2019-07-21 20:10
楼主可以的!!!

一周热门 更多>