汇集网友智慧,解决技术难题
国产芯片 网络 AT32F407 产品 环境 pi
赞0
评论
2022-06-27
2022-06-26
点击图片添加到编辑器内容中
点击文件名将附件添加到文章中
提交
tyw
317个答案
天意无罪
287个答案
xch
220个答案
jjjyufan
202个答案
coody
197个答案
LcwSwust
161个答案
chunyang
135个答案
xionghaoyun
115个答案
赞0
评论
2022-06-27
赞0
以太网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);
}
}
评论
2022-06-26
您需要登录后才可以回复 登录 | 注册