系统采用FREERTOS8.2.3+LWIP2.0.2
以太网PHY用RTL8201F
初始化:
#ifdef RTL8201F
RegValue = ETH_ReadPHYRegister(PHYAddress, 2); //read ID 0x001C
ETH_WritePHYRegister(PHYAddress,31, 7); //���page7
ETH_WritePHYRegister(PHYAddress,16, 0x0ffB); //RMII 50M���ģʽ��CRS_DV
ETH_WritePHYRegister(PHYAddress,19, 0xf014); //enable linkstatus intterupt
#endif
速度设置:
#ifdef RTL8201F
if ((RegValue & PHY_ANLPAR_100TXFD) || (RegValue & PHY_ANLPAR_10TXFD)){
ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
}else{
ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
}
if (!((RegValue & PHY_ANLPAR_100TX) || (RegValue & PHY_ANLPAR_100TXFD))) {
ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
}else{
ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
}
#endif
收数据信号量初始化:
if (g_rx_semaphore == NULL){
g_rx_semaphore = xSemaphoreCreateCounting(200,0);
}
以太网收数据:
void ethernetif_input( void * pvParameters )
{
struct pbuf *p;
for( ;; ){
if (xSemaphoreTake( g_rx_semaphore, LOWLEVEL_INPUT_WAITING_TIME)==pdTRUE)
{
p = low_level_input( low_netif );
if (ERR_OK != low_netif->input( p, low_netif))
{
pbuf_free(p);
p=NULL;
}
}
}
}
EMAC中断:
void ETH_IRQHandler(void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
/* frame received */
if(SET == ETH_GetDMAITStatus(ETH_DMA_INT_R)){
/* give the semaphore to wakeup LwIP task */
xSemaphoreGiveFromISR(g_rx_semaphore, &xHigherPriorityTaskWoken);
}
/* clear the enet DMA Rx interrupt pending bits */
ETH_DMAClearITPendingBit(ETH_DMA_INT_R);
ETH_DMAClearITPendingBit(ETH_DMA_INT_NIS);
/* switch tasks if necessary */
if(pdFALSE != xHigherPriorityTaskWoken){
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
}
|