本帖最后由 aizhixi106 于 2013-6-2 21:48 编辑
背景:我有一个STM32F107的板子, 调以太网没有问题, 能Ping通,可以Telnet ,可以打开板子上面的网页。
目前在做STM32F439的一个项目:
所以把STM32F107的以太网程序移植到STM32F439上,目前出现无法进入中断。(网口LED是亮的,发送数据LED也是亮的),证明硬件没有问题,
时钟使用外接晶振,25MHZ,我测过RXCLK TXCLK 也都是25MHZ,所以时钟没有问题。
一般情况下出现进入不了中断有两种情况:
第一种:PHY 配置不正确,导致无法接收到数据,无法进入中断。
所以第一件事件,我去查了PHY的连接,这个端口是没有问题的,(按照官方的给的接口来配置)。
然后我觉得可能我GPIO配置有问题,我是这样配置的,
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
使用MII模式, 总共用到PA0,1,2,7 PB8, PC1,2,3,4,5, PG11,13,14 PH6,7 PI10;
我打开了所有引脚的第二功能,使能相应的时钟,我觉得配置没有问题,
然后我去配置MAC 和DMA 使用static void ETH_MACDMA_Config(void)
这个里面初始化MAC 和DMA的配置,
最后读
EthInitStatus = ETH_Init(Ð_InitStructure, DP83848_PHY_ADDRESS);
关于DP83848_PHY_ADDRESS 我设置的是0x01 ,(我查过DP84848的数据手册 没有问题)
最后使能
ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R |ETH_DMA_IT_T,ENABLE);
ETH_Start();
这个之后我读取过PHY SR的状态寄存器值是0x4115,这个值是对的,我对过寄存器,100M 全双工模式。也是没有问题,
第二:没有进入中断,可能的情况是中断使能位没有打开,中断向量表配置不对,但是我确实是打开。
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the Ethernet global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
这个是中断的配置,也没有问题,
ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R |ETH_DMA_IT_T,ENABLE);
ETH_Start();
使能我已经打开,我断点调试,看过DMAIER的寄存器的值,对应到相应的位,已经开了接收中断和发送中断。
LWIP使用的是1.3.1的,IP地址设置在同一个网关里面。
定时器使用系统时钟定时10MS。处理周期响应。
程序框架
void main
{
eth_config(); LwIP_Init();
HelloWorld_init();
// tcp_echoserver_init();
while(1)
{
//LwIP_Periodic_Handle(LocalTime);
System_Periodic_Handle();
}
}
void eth_config()
{
RCC_ClocksTypeDef RCC_Clocks;
//enable clock
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOD|
RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG|RCC_AHB1Periph_GPIOH
| RCC_AHB1Periph_GPIOI, ENABLE);
NVIC_Configuration();
GPIO_config();
Ethernet_Security();
ETH_MACDMA_Config();
if (EthInitStatus == 0)
{
LCD_DisplayStringLine(LCD_LINE_8, (uint8_t*)" Ethernet Init failed ");
while(1);
}
Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); //150M 主频如果使用RMII 模式 DIV 3 =50MHZ 为PHY 提供时钟
NVIC_SetPriority (SysTick_IRQn, 1);
}
分析来分析去,觉得不应该不进入中断,但实际情况是不进入中断,但是奇怪的是有些时候又能进入中断,(只有很少情况下进入一两次)。
我Ping ip 无响应。电脑提示网络连接有问题。
使用ARP -A 无法解析IP地址和MAC地址。
网线选的crossover table。MCU STM32F439. IAR 版本6.4
感觉可能还是哪个地方配置不对,但是现在无法想明白,哪里不对,求指点。(LWIP协议栈 目前没有动)
连接后时候这个情况,
ping不通是正常的,但是不知道为什么会出现感叹号,我用STM32F107没有任何问题,ping ip时关闭无线网络,设置固定IP。
在ST的E2E论坛发了帖子,还没有人回答。
求点拨,哪里配置不对~~~
|