RT1052 ENET ENET_GetRxFrameSize kStatus_ENET_RxFrameEmpty问题
问题
编写RT1050的ENET的BSP时, 当接收中断响应时,去读取数据,使用 ENET_GetRxFrameSize 获取接收帧大小,但返回 kStatus_ENET_RxFrameEmpty
具体解决问题的步骤我就不描述,直接给出问题的原因,以及相关疑问
解决
问题原因就在 AT_NONCACHEABLE_SECTION_ALIGN 这个宏中使用了 NonCacheable
NonCacheable.init
两个段,但我的链接文件中并没有配置这两个段,从而导致运行出现以上问题。但这个问题与症结点也让我产生了疑惑,这两者之间最深层次原因是什么呢?如果有哪位前辈知道,还请留言告知,非常感谢。也欢迎各位朋友留言讨论。谢谢。
在解决过程中产生了新的理解
- BSP开发中最重要的一点就是
硬件初始化
,其中大部分遇到的问题都是硬件初始化
不对导致的。 - 关于
硬件初始化
,你在参考官方示例中,要严格参照其硬件初始化
,在其上删除与修改时要慎重,要明白其中含义才可做删除修改。 - 如果官方示例中,没有你需求的外设,那这个时候你也要注意,如果你有足够实力可以基于芯片参考手册可以驱动外设,那就不用过多担心。但对于我这种只能基于库开发,勉强看得懂部分寄存器操作的朋友,就得另找SOC,或者看看方案公司是否有相关示例。
如果你编写的BSP出现了问题,那么你只需要那你的BSP与官方示例进行对比,要一行行代码去进行对比,一行行排除,最终你就会找到你的问题,并解决。
代码如下
ENET要用到全局变量与宏
#define ENET_RXBD_NUM (4)
#define ENET_TXBD_NUM (4)
#define ENET_RXBUFF_SIZE (ENET_FRAME_MAX_FRAMELEN)
#define ENET_TXBUFF_SIZE (ENET_FRAME_MAX_FRAMELEN)
#define APP_ENET_BUFF_ALIGNMENT ENET_BUFF_ALIGNMENT
AT_NONCACHEABLE_SECTION_ALIGN(enet_rx_bd_struct_t g_rxBuffDescrip[ENET_RXBD_NUM], ENET_BUFF_ALIGNMENT);
AT_NONCACHEABLE_SECTION_ALIGN(enet_tx_bd_struct_t g_txBuffDescrip[ENET_TXBD_NUM], ENET_BUFF_ALIGNMENT);
SDK_ALIGN(uint8_t g_rxDataBuff[ENET_RXBD_NUM][SDK_SIZEALIGN(ENET_RXBUFF_SIZE, APP_ENET_BUFF_ALIGNMENT)],
APP_ENET_BUFF_ALIGNMENT);
SDK_ALIGN(uint8_t g_txDataBuff[ENET_TXBD_NUM][SDK_SIZEALIGN(ENET_TXBUFF_SIZE, APP_ENET_BUFF_ALIGNMENT)],
APP_ENET_BUFF_ALIGNMENT);
ENET的初始化函数
rt_err_t bsp_enet_init(EthDevice* dev){
printf("bsp_enet_init\r\n");
enet_config_t config;
/* prepare the buffer configuration. */
enet_buffer_config_t buffConfig[] = {
{
ENET_RXBD_NUM,
ENET_TXBD_NUM,
SDK_SIZEALIGN(ENET_RXBUFF_SIZE, APP_ENET_BUFF_ALIGNMENT),
SDK_SIZEALIGN(ENET_TXBUFF_SIZE, APP_ENET_BUFF_ALIGNMENT),
&g_rxBuffDescrip[0],
&g_txBuffDescrip[0],
&g_rxDataBuff[0][0],
&g_txDataBuff[0][0],
}
};
/* Get default configuration. */
ENET_GetDefaultConfig(&config);
printf("bsp_enet_init ENET_GetDefaultConfig ok\r\n");
/*
* config.miiMode = kENET_RmiiMode;
* config.miiSpeed = kENET_MiiSpeed100M;
* config.miiDuplex = kENET_MiiFullDuplex;
* config.rxMaxFrameLen = ENET_FRAME_MAX_FRAMELEN;
*/
config.interrupt = kENET_TxFrameInterrupt | kENET_RxFrameInterrupt;
config.miiSpeed = dev->speed;
config.miiDuplex = dev->duplex;
printf("clk: %d\r\n", CLOCK_GetFreq(kCLOCK_AhbClk));
ENET_Init(dev->enet_base, &dev->enet_handle, &config, &buffConfig[0], &dev->dev_addr[0], CLOCK_GetFreq(kCLOCK_AhbClk));
printf("bsp_enet_init ENET_Init ok\r\n");
ENET_SetCallback(&dev->enet_handle, bsp_enet_callback, dev);
printf("bsp_enet_init ENET_SetCallback ok\r\n");
ENET_ActiveRead(dev->enet_base);
printf("bsp_enet_init ENET_ActiveRead ok\r\n");
ENET_EnableInterrupts(dev->enet_base, kENET_RxFrameInterrupt);
bsp_nvic_set_irqn_priority(dev->irqn, Group4_PreemptPriority_0, Group4_SubPriority_0);
EnableIRQ(dev->irqn);
bsp_eth_device.flags = ETH_DEVICE_FLAGS_INIT;
return RT_EOK;
}