RT1052 ENET ENET_GetRxFrameSize kStatus_ENET_RxFrameEmpty问题

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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值