论坛元老 
   
	- 积分
 - 4493
 
        - 金钱
 - 4493 
 
       - 注册时间
 - 2016-8-2
 
      - 在线时间
 - 51 小时
 
 
 
 | 
 
 
 楼主 |
发表于 2016-9-7 17:25:40
|
显示全部楼层
 
 
 
DP83848.c的代码 
[mw_shl_code=c,true]#include "DP83848IVV.h" 
#include "lwip_comm.h" 
#include "delay.h" 
#include "malloc.h" 
#include "includes.h" 
 
 
ETH_HandleTypeDef ETH_Handler;      //以太网句柄 
 
ETH_DMADescTypeDef *DMARxDscrTab;        //以太网DMA接收描述符数据结构体指针 
ETH_DMADescTypeDef *DMATxDscrTab;        //以太网DMA发送描述符数据结构体指针  
uint8_t *Rx_Buff;                                         //以太网底层驱动接收buffers指针  
uint8_t *Tx_Buff;                                         //以太网底层驱动发送buffers指针 
   
//DP83848初始化 
//返回值:0,成功; 
//    其他,失败 
u8 DP83848_Init(void) 
{       
    u8 macaddress[6]; 
 
    macaddress[0]        =        lwipdev.mac[0];  
        macaddress[1]        =        lwipdev.mac[1];  
        macaddress[2]        =        lwipdev.mac[2]; 
        macaddress[3]        =        lwipdev.mac[3];    
        macaddress[4]        =        lwipdev.mac[4]; 
        macaddress[5]        =        lwipdev.mac[5]; 
         
        ETH_Handler.Instance                                =        ETH; 
    ETH_Handler.Init.AutoNegotiation        =        ETH_AUTONEGOTIATION_ENABLE;        //使能自协商模式  
    ETH_Handler.Init.Speed                                =        ETH_SPEED_100M;                                //速度100M,如果开启了自协商模式,此配置就无效 
    ETH_Handler.Init.DuplexMode                        =        ETH_MODE_FULLDUPLEX;                //全双工模式,如果开启了自协商模式,此配置就无效 
    ETH_Handler.Init.PhyAddress                        =        DP83848_PHY_ADDRESS;                //DP83848地址   
    ETH_Handler.Init.MACAddr                        =        macaddress;                            //MAC地址   
    ETH_Handler.Init.RxMode                                =        ETH_RXINTERRUPT_MODE;           //轮训接收模式  
    ETH_Handler.Init.ChecksumMode                =        ETH_CHECKSUM_BY_HARDWARE;        //硬件帧校验   
    ETH_Handler.Init.MediaInterface                =        ETH_MEDIA_INTERFACE_RMII;        //RMII接口   
    if(HAL_ETH_Init(Ð_Handler)==HAL_OK) 
    { 
        return 0;   //成功 
    } 
    else return 1;  //失败 
} 
 
//ETH底层驱动,时钟使能,引脚配置 
//此函数会被HAL_ETH_Init()调用 
//heth:以太网句柄 
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth) 
{ 
    GPIO_InitTypeDef GPIO_Initure; 
     
    __HAL_RCC_ETH_CLK_ENABLE();             //开启ETH时钟 
    __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟 
        __HAL_RCC_GPIOB_CLK_ENABLE();                        //开启GPIOB时钟 
    __HAL_RCC_GPIOC_CLK_ENABLE();                        //开启GPIOC时钟 
    __HAL_RCC_GPIOG_CLK_ENABLE();                        //开启GPIOG时钟 
     
    /*网络引脚设置 RMII接口  
    ETH_MDIO -------------------------> PA2 
    ETH_MDC --------------------------> PC1 
    ETH_RMII_REF_CLK------------------> PA1 
    ETH_RMII_CRS_DV ------------------> PA7 
    ETH_RMII_RXD0 --------------------> PC4 
    ETH_RMII_RXD1 --------------------> PC5 
    ETH_RMII_TX_EN -------------------> PG11 //DP83848 此引脚使用的PG11 
    ETH_RMII_TXD0 --------------------> PG13 
    ETH_RMII_TXD1 --------------------> PG14*/ 
     
    //PA1,2,7 
    GPIO_Initure.Pin                =        GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;  
    GPIO_Initure.Mode                =        GPIO_MODE_AF_PP;          //推挽复用 
    GPIO_Initure.Pull                =        GPIO_NOPULL;              //不带上下拉 
    GPIO_Initure.Speed                =        GPIO_SPEED_HIGH;         //高速 
    GPIO_Initure.Alternate        =        GPIO_AF11_ETH;                //复用为ETH功能 
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);                          //初始化 
     
    //修改为PG11 
    GPIO_Initure.Pin        =        GPIO_PIN_11;                       //PG11 
    HAL_GPIO_Init(GPIOG,&GPIO_Initure);                         //始化 
     
    //PC1,4,5 
    GPIO_Initure.Pin        =        GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; //PC1,4,5 
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);                                         //初始化 
         
    //PG13,14 
    GPIO_Initure.Pin        =        GPIO_PIN_13|GPIO_PIN_14;   //PG13,14 
    HAL_GPIO_Init(GPIOG,&GPIO_Initure);                         //初始化 
     
    HAL_NVIC_SetPriority(ETH_IRQn,0,0);                                 //网络中断优先级应该高一点 
    HAL_NVIC_EnableIRQ(ETH_IRQn); 
} 
//读取PHY寄存器值 
u32 DP83848_ReadPHY(u16 reg) 
{ 
    u32 regval; 
    HAL_ETH_ReadPHYRegister(Ð_Handler,reg,®val); 
    return regval; 
} 
//向DP83848指定寄存器写入值 
//reg:要写入的寄存器 
//value:要写入的值 
void DP83848_WritePHY(u16 reg,u16 value) 
{ 
    u32 temp=value; 
    HAL_ETH_ReadPHYRegister(Ð_Handler,reg,&temp); 
} 
//得到DP83848的速度模式 
//返回值: 
//001:10M半双工 
//101:10M全双工 
//010:100M半双工 
//110:100M全双工 
//其他:错误. 
u8 DP83848_Get_Speed(void) 
{ 
        u8 speed; 
        speed=((DP83848_ReadPHY(16)&0x06)>>1); //从DP83848的16号寄存器中读取网络速度和双工模式 
        return speed; 
} 
 
extern void lwip_pkt_handle(void);                //在lwip_comm.c里面定义 
//中断服务函数 
void ETH_IRQHandler(void) 
{ 
    OSIntEnter();  
    while(ETH_GetRxPktSize(ETH_Handler.RxDesc))    
    { 
        lwip_pkt_handle();//处理以太网数据,即将数据提交给LWIP 
    } 
    //清除中断标志位 
    __HAL_ETH_DMA_CLEAR_IT(Ð_Handler,ETH_DMA_IT_R);  
    __HAL_ETH_DMA_CLEAR_IT(Ð_Handler,ETH_DMA_IT_NIS);  
    OSIntExit();   
} 
 
//获取接收到的帧长度 
//DMARxDesc:接收DMA描述符 
//返回值:接收到的帧长度 
u32  ETH_GetRxPktSize(ETH_DMADescTypeDef *DMARxDesc) 
{ 
    u32 frameLength = 0; 
    if(((DMARxDesc->StatusÐ_DMARXDESC_OWN)==(uint32_t)RESET) && 
     ((DMARxDesc->StatusÐ_DMARXDESC_ES)==(uint32_t)RESET) && 
     ((DMARxDesc->StatusÐ_DMARXDESC_LS)!=(uint32_t)RESET))  
    { 
        frameLength=((DMARxDesc->StatusÐ_DMARXDESC_FL)>>ETH_DMARXDESC_FRAME_LENGTHSHIFT); 
    } 
    return frameLength; 
} 
 
//为ETH底层驱动申请内存 
//返回值:0,正常 
//    其他,失败 
u8 ETH_Mem_Malloc(void) 
{  
        DMARxDscrTab=mymalloc(SRAMIN,ETH_RXBUFNB*sizeof(ETH_DMADescTypeDef));//申请内存 
        DMATxDscrTab=mymalloc(SRAMIN,ETH_TXBUFNB*sizeof(ETH_DMADescTypeDef));//申请内存   
        Rx_Buff=mymalloc(SRAMIN,ETH_RX_BUF_SIZE*ETH_RXBUFNB);        //申请内存 
        Tx_Buff=mymalloc(SRAMIN,ETH_TX_BUF_SIZE*ETH_TXBUFNB);        //申请内存 
        if(!(u32)&DMARxDscrTab||!(u32)&DMATxDscrTab||!(u32)&Rx_Buff||!(u32)&Tx_Buff) 
        { 
                ETH_Mem_Free(); 
                return 1;        //申请失败 
        }         
        return 0;                //申请成功 
} 
 
//释放ETH 底层驱动申请的内存 
void ETH_Mem_Free(void) 
{  
        myfree(SRAMIN,DMARxDscrTab);//释放内存 
        myfree(SRAMIN,DMATxDscrTab);//释放内存 
        myfree(SRAMIN,Rx_Buff);                //释放内存 
        myfree(SRAMIN,Tx_Buff);                //释放内存   
} 
 
 
[/mw_shl_code] |   
 
 
 
 |