This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:在使用 lwIP 协议&quot 的数据接收周期之后、EMAC 模块无法进入接收中断

Guru**** 2124380 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1253590/tms570lc4357-emac-module-fails-to-enter-receive-interrupt-after-period-of-data-reception-with-lwip-protocol

器件型号:TMS570LC4357

 你好  

  我将 lwIP 协议与 EMAC 模块结合使用以进行数据传输和接收。 发送数据的过程非常顺利、但是 EMAC 模块在接收数据时遇到了问题。 在特定时间段内接收数据后、EMAC 模块无法进入接收中断。 我正在寻求有关如何解决此问题并确保 EMAC 模块能够连续不间断地接收数据的帮助。 谢谢!  

 我的 lwIP 初始化如下:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void EMAC_LwIP_init (uint8_t * macAddress)
{
unsigned int ipAddr;
uint32 emacCtrlBase = 0xFCF78800U;
uint32 emacBase = 0xFCF78000U;
EMACInit(emacCtrlBase,emacBase);
IntMasterIRQEnable();//
/* for static IP address. Change address as required, and uncomment the previous statement. */
uint8 ip_addr[4] = { 172, 22, 1, 1 };
uint8 netmask[4] = { 255, 255, 255, 0 };
uint8 gateway[4] = { 172, 22, 1, 1 };
ipAddr = lwIPInit(0, macAddress,
*((uint32_t *)ip_addr),
*((uint32_t *)netmask),
*((uint32_t *)gateway),
IPADDR_USE_STATIC );
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   我的 EMAC 模块的接收中断如下所示。 测试过程中、我注意到接收中断在 R0 (接收空闲缓冲区计数寄存器)接收到值0xCD 后停止(此时、寄存器不会改变、除非我重新初始化)。 我怀疑我的中断函数中的尾部处理可能存在问题。 下面是我的中断函数:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma INTERRUPT(EMACCore0RxIsr, IRQ)
uint32 countrxisr = 0;
void EMACCore0RxIsr(void)
{
char* tmpptr;
uint32_t tmp = 0;
uint32_t CurFinishCP = HWREG(EMAC_BASE + EMAC_RXCP(0)); /* Pointer to the buffer that has completed data reception */
EMACDesc_t* RXCP = EMAC_SL_CurRXCP; /* Pointer to the current processing receive buffer */
MACFrame_t* MacFramePtr = NULL;
ECTRL_C0RXEN = 0U; /* Disable interrupts before processing data */
HWREG(EMAC_BASE + EMAC_RXCP(0)) = CurFinishCP; /* Confirm the current processed CP (Complete Pointer) */
HWREG(EMAC_BASE + EMAC_MACEOIVECTOR) = 1U; /* Acknowledge the completion of receive interrupt */
if (countrxisr == 0U) // First frame
{
HWREG(EMAC_BASE + EMAC_RXHDP(0)) = CurFinishCP;
EMAC_SL_CurRXCP = (EMACDesc_t*)CurFinishCP;
RXCP = (EMACDesc_t*)CurFinishCP;
countrxisr = 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

您能帮助我分析问题可能发生的位置吗? 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您必须在每次处理数据包后通过调用函数"pbuf_free ()"释放 Pbuf。

    有关更多详细信息、请查看以下主题:

    (+) TMS570LS3137:lwIP 演示在大约60个 UDP 数据包后暂停-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好

     我已经阅读了您提供的帖子,并尝试了您提到的方法,使用 pbuf_free()。 我可以接收到比以往更多的数据包、但之前的问题仍然存在–中断停止为数据接收而触发。

     此外、我注意到、当我修改该函数中的 MAX_RX_PBUF_ALLOC 时、我能接收到更多的数据包。 但是、我可以将其设置为最大值60U。 我还没有找到恢复接收缓冲区的方法、仍然存在因数据接收而不触发中断的问题。 您能否查看此代码并帮助我分析问题?

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /* Initialize the descriptors for the RX channel */
    rxch = &(hdkif->rxch);
    rxch->active_head = (volatile struct emac_rx_bdp*)(curr_txbd + 1);
    rxch->free_head = NULL;
    rxch->freed_pbuf_len = 0;
    num_bd = ((SIZE_EMAC_CTRL_RAM >> 1) / sizeof(emac_rx_bdp) - 1);
    curr_bd = rxch->active_head;
    last_bd = curr_bd;
    /*
    ** Allocate the pbufs for the maximum count permitted or till the
    ** number of buffer desceriptors expire, which ever is earlier.
    */
    while(pbuf_cnt < MAX_RX_PBUF_ALLOC) {
    p = pbuf_alloc(PBUF_RAW, PBUF_LEN_MAX, PBUF_POOL);
    pbuf_cnt++;
    if(p != NULL) {
    /* write the descriptors if there are enough numbers to hold the pbuf*/
    if(((uint32)pbuf_clen(p)) <= num_bd) {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     

     谢谢。此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不在初始化例程中讨论。

    但在处理完包之后、您应该释放 pbuf。

    请验证此示例 Lwip 代码以了解:

    e2e.ti.com/.../0677.Hercules_5F00_Ethernet_5F00_Bootloader.zip

    --

    谢谢。此致、
    Jagadish。