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.

[参考译文] TMS320F28388D:关于 Lwip 中 UDP 协议的问题

Guru**** 2611705 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1010186/tms320f28388d-questions-about-udp-protocol-in-lwip

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARE

大家好、正如您在上一篇文章中所说、我将以下路径导入到例程 C:\ti\c2000Ware_3_04_00_00\libraries\communications\ethernet/third_party/lwip\examples\enet_lwip\ccs
之后、我在 PC、开关和评估板之间实现了 ping 功能
我需要在何处进一步设置应用层协议 UDP、是否需要导入其他例程?
期待收到您的回复!

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

    您好!

    首先、您必须在 lwipopts.h 中启用 UDP

    #define LWIP_UDP             1

    然后、您必须在 lwip_init 之后初始化 UDP、lwip_init 具有回调函数参数(UDP_Rx)、该参数在堆栈接收到 UDP 数据包时调用。

    struct udp_PCB *g_upcb;

    void udp_init (void)

    g_upcb = udp_new();
    udp_bind (g_upcb、ip_ADDR_any、28000);
    udp_recv (g_upcb、&udp_Rx、(void*) 0);


    回调函数传递 pbuf 参数、该参数具有要处理的数据负载。

    void udp_rx (void *arg、struct udp_pcb * upcb、struct pbuf * p、
    struct ip_addr *地址、u16_t 端口)

    然后,可以使用 udp_connect()、udp_disconnect()与远程主机交互以获取特定端口号。

    要发送 UDP 封包、您可以使用以下函数以及正确初始化的 pbuf

    udp_send (g_upcb、pbuf1_tx);

    此致、

    Yashwant

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

    非常感谢您的回复
    我还有一个问题要问你
    是否可以在下面的红色框中添加这些 UDP 调用函数?
    期待收到您的回复!

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

    是的、您可以在此处添加它们。

    -yashwant

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

    非常感谢您的回复

    我将尝试您所说的内容

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

    大家好、Yashwant!
    我尝试将以下代码添加到此位置。
    udp_init();
    struct udp_pcb * udpPcb;
    struct ip_addr *ipaddr;
    struct pbuf *p;
    p = pbuf_alloc (PBUF_RAW、sizeof (UDPData)、PBUF_RAM);
    p->PAY=(void*) UDPData;
    IP4_ADDR (&ipaddr、192、168、1、16);
    UdpPcb = udp_new();
    UDP_BIND (UdpPcb、IP_ADDR_ANY、1025);
    udp_connect (UdpPcb、ipaddr、1025);
    while (1)

    udp_send (UdpPcb、p);
    延迟(1000000UL);
    延迟(1000000UL);
    延迟(1000000UL);

    编译期间会发生以下错误

    然后我意识到没有为 IP_addr 定义结构

    我需要自己定义吗? 如何定义它?
    期待您的回复
    谢谢你

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

    它应该已经在 ip4_addr 中定义。

    typedef 结构体 ip4_addr ip4_addr_t;

    typedef ip4_addr_t ip_addr_t;

    struct ip4_addr{
    u32_t addr;
    };

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

    您认为我的代码中缺少什么吗?
    正如您所说、我将 ip_addr 更改为 ip4_addr、它编译并通过了、我将尝试 PC、28388D 和交换机连接!
    期待收到您的回复!
    谢谢!

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

    我的计算机的 MAC 地址是。
    8C-EC-4b-91-F9-C3
    但在例程中、MAC 仅提供三个阵列单元
    我需要如何更改图中此处的 MAC 地址?
    此外、我的卡的 MAC 地址是否是我用红色框圈出的地址?
    期待您的回复!
    谢谢你。

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

    ulUser0、ulUser1是 F28388D 器件 MAC 地址的6个字节、而不是主机计算机 Mac ID。 您不必输入主机 PC 的 Mac ID。

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

    大家好、Yashwant!
    如上所示、在 UDP_BIND 函数中、我使用了变量 IP_ADDR_ANY、这意味着它是一个任意的 IP 地址、它在分配时是否会分配我之前设置的 ipaddr?
    如下图所示
    期待收到您的回复!
    谢谢!

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

    你好
    我想问一下、pbuf_alloc 函数可以为我的 udpdata 分配多少个字节
    我可以通过什么方式扩展它?
    谢谢
    期待收到您的回复!

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

    以太网外设所有者是 OOO。 预计星期四回复。

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

    谢谢!

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

    是的,它将使用您在 udp_new()之前分配的 IP 地址在设备和主机之间创建连接。

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

    您可以更改 UDPData 数组大小以更改分配给缓冲区的字节。

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

    你好
    我已经调整了 UDP 协议、现在可以正常运行代码
    但我还有另一个问题
    我的数据是从 CPUI 内核生成的、并通过 IPC 发送到 CM 内核、 但是、由于 CPUI 内核支持的最小字节为2个字节、CM 中支持单个字节、即 CPUI 中的字符类型仍占用两个字节、这会导致我发送数据时两个内核中的数据类型不一致。
    我的 CPUI 中的代码如下所示。

    //
    //包含的文件
    //
    #include "driverlib.h"
    #include "device.h"

    //
    //定义
    //
    //UDP
    #define 以太网
    #define len 120
    //UDP

    #define IPC_CMD_READ_MEM 0x1001
    #define IPC_CMD_RESP 0x2001
    #define TEST_PASS 0x5555
    #define TEST_FAIL 0xAAAA
    #pragma DATA_SECTION (ReadData、"MSGRAM_CPU_TO_CM")
    //UDP
    uint16_t readData1[len]={0xAA、0x55、0x00、0x01、0x34、0x00、0x00、0x1D、0x00、0x00、0x64、0x00、0x00、0x00、0x00、0x14、0x14、0x15、0x6、0x17、0x0F、0x3、0x00、0x00、0x20、0x00、0x20、0x20、0x00、0x20、0x20、0x20、0x30、0x31、0x00、0x20、0x00、0x20、0x20、0x31、0x20、0x20、0x20、0x00、0x31、0x20、0x31、0x00、0x20、0x31、0x20、0x20、0x20、0x20、0x30、0x31、0x31、0x00、0x31、0x20、0x00、0x20、0x31、0x31、0x31、0x20、0x20、0x00、0x20、0x20、0x20、0x00、0x20、0x31、0x31、0x31、0x00、0x31、0x31、0x40、0x31

    //UDP
    uint16_t ReadData[len];
    uint32_t pass;

    //
    //主函
    //
    void main (void)

    int i;
    //
    //初始化设备时钟和外设
    //
    device_init();
    DEVICE_initGPIO();//udp
    //
    //启动 CM 内核
    //
    #ifdef _flash
    DEVICE_BOOTCM (BOOTMODE_BOOT_TO_FLASH_SECTOR0);
    其他
    DEVICE_BOOTCM (BOOTMODE_BOOT_TO_S0RAM);
    #endif

    //UDP
    ifdef 以太网
    //
    //设置 EnetCLK 以使用 SYSPLL 作为时钟源并设置
    //时钟分频器更改为2.
    //
    //这样,我们可以确保 PTP 时钟为100 MHz。 请注意、该值
    //对于 CM 内核不是自动/动态已知的,因此需要它
    //预先提供给 CM 侧代码。
    SYSCTL_setEnetClk (SYSCTL_ENETCLKOUT_DIV_2、SYSCTL_Source_SYSPLL);
    //
    //为以太网配置 GPIO。
    //
    // MDIO 信号
    //
    GPIO_setPinConfig (GPIO_105_ENET_MDIO_CLK);
    GPIO_setPinConfig (GPIO_106_ENET_MDIO_DATA);
    //
    //这只用于 RMII 模式
    //GPIO_setPinConfig (GPIO_73_ENET_RMII_CLK);
    //
    //
    //MII 信号
    //
    GPIO_setPinConfig (GPIO_109_ENET_MII_CRS);
    GPIO_setPinConfig (GPIO_110_ENET_MII_COL);
    GPIO_setPinConfig (GPIO_75_ENET_MII_TX_DATA0);// ںϰ121 μ A
    GPIO_setPinConfig (GPIO_122_ENET_MII_TX_Data1);
    GPIO_setPinConfig (GPIO_123_ENET_MII_TX_DATA2);
    GPIO_setPinConfig (GPIO_124_ENET_MII_TX_DATA3);
    //
    //仅在必须连接 TX 错误引脚时使用此选项
    //GPIO_setPinConfig (GPIO_46_ENET_MII_TX_ERR);
    //
    GPIO_setPinConfig (GPIO_118_ENET_MII_TX_EN);
    GPIO_setPinConfig (GPIO_114_ENET_MII_RX_DATA0);
    GPIO_setPinConfig (GPIO_115_ENET_MII_RX_Data1);
    GPIO_setPinConfig (GPIO_116_ENET_MII_RX_DATA2);
    GPIO_setPinConfig (GPIO_117_ENET_MII_RX_DATA3);
    GPIO_setPinConfig (GPIO_113_ENET_MII_RX_ERR);
    GPIO_setPinConfig (GPIO_112_ENET_MII_RX_DV);
    GPIO_setPinConfig (GPIO_44_ENET_MII_TX_CLK);// ںϰ120 μ A
    GPIO_setPinConfig (GPIO_111_ENET_MII_RX_CLK);
    //
    //断电引脚可使外部 PHY 从断电状态中退出
    //
    GPIO_setDirectionMode (108、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (108、GPIO_PIN_TYPE_PULLUP);
    GPIO_writePin (108、1);
    //
    //PHY 复位引脚被驱动为高电平以使外部 PHY 退出复位
    //
    GPIO_setDirectionMode (119、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (119、GPIO_PIN_TYPE_PULLUP);
    GPIO_writePin (119.1);
    #endif

    //UDP

    //
    //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
    //
    interrupt_initModule();

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrupt_initVectorTable();

    //
    //清除任何 IPC 标志(如果已设置)
    //
    IPC_clearFlagLtoR (IPC_CPU1_L_CM_R、IPC_FLAG_ALL);
    //
    //同步两个内核。
    //
    IPC_SYNC (IPC_CPU1_L_CM_R、IPC_FLAG31);

    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

    //
    //填写要发送的数据
    //
    for (i=0;<len; i++)

    ReadData[i]= readData1[i];

    //
    //发送不带消息队列的消息
    //由于 C28x 和 CM 不共享共享共享 RAM 的同一地址空间,
    //启用 address_correction
    //要读取的数据的长度作为数据传递。
    //
    IPC_sendCommand (IPC_CPU1_L_CM_R、IPC_FLAG0、IPC_ADDR_CORRECT_ENABLE、
    IPC_CMD_READ_MEM (uint32_t) ReadData、len);

    //
    //等待确认
    //
    IPC_waitForAck (IPC_CPU1_L_CM_R、IPC_FLAG0);

    //
    //读取响应
    //
    if (IPC_getResponse (IPC_CPU1_L_CM_R)= TEST_PASS)

    PASS = 1;

    其他

    PASS = 0;

    //
    //示例末尾。 永远循环
    //
    while (1);


    //
    //文件结束
    //

    CM 内核中的代码如下所示。

    #include
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_NVIC.h"
    #include "inc/hw_types.h"
    #include "inc/hw_sysctl.h"
    #include "inc/hw_emac.h"

    #include "driverlib_cm/ethernet.h"
    #include "driverlib_cm/gpio.h"
    #include "driverlib_cm/interrupt.h"
    #include "driverlib_cm/flash.h"

    #include "driverlib_cm/sysctl.h"
    #include "driverlib_cm/SysTick .h"

    #include "utils/lwiplib.h"
    #include "board_drivers/pinout.h"

    #include "lwip/apps/httpd.h"
    #include "ethernet.h"
    #include "ip4_addr.h"

    //******* IPCv2.0 *********
    #include "cm.h"
    #include "ipc.h"

    //******* IPCv2.0 *********

    //#include "f2838x_examples.h"//ʱ
    //#include "driverlib_cm.h"// ipcͷļ
    //#include "src/core/udp.c"
    //#include "ipc_cm.h"
    //


    //这些由链接器定义(请参阅器件链接器命令文件)
    extern uint16_t RamfuncsLoadStart;
    extern uint16_t RamfuncsLoadSize;
    extern uint16_t RamfuncsRunStart;
    extern uint16_t RamfuncsLoadEnd;
    extern uint16_t RamfuncsRunEnd;
    extern uint16_t RamfuncsRunSize;

    extern uint16_t constLoadStart;
    extern uint16_t constLoadEnd;
    extern uint16_t constLoadSize;
    extern uint16_t constRunStart;
    extern uint16_t constRunEnd;
    extern uint16_t constRunSize;

    #define DEVICE_FLASH_WAITSTATES 2.

    //
    //
    //特定于驱动程序的初始化代码和宏。
    //
    //

    #define ETHERNET_NO_NO_NO_TO_RX_packets 2U
    #define ETHERNET_MAX_PACKET_LENGTH 1538U
    #define NUM_PACKE_DESC_RX_application 16.
    #define shuzulen 240
    #define PAYLOAD 240
    //#define Tshuzulen 120
    struct pbuf *p;
    struct udp_pcb * udpPcb;
    struct ip4_addr ipaddr;
    //字符 UDPData[shuzulen]={3,1,2,3,2,3,2,3,4,5,6,7,8,9,1,2,1,2,3,4,6,7,8,9,1,3,6,2,3,7,8,9,5,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,4,6,4,6,4,6,7,6,7,4,6,7,4,6,7,4,6,7,4,6,7,4,6,7,4,6,

    //******** ̫UDP 图标

    //********* IPCv2.0 *********
    #define IPC_CMD_READ_MEM 0x1001
    #define IPC_CMD_RESP 0x2001
    #define TEST_PASS 0x5555
    #define TEST_FAIL 0xAAAA

    //uint32_t 命令、数据、addr;
    //int16_t addr;
    uint16_t UDPData[shuzulen];
    uint16_t buf_TX[shuzulen];
    //********* IPCv2.0 *********

    EtherNet_Handle EMAC_Handle;
    Ethernet_initconfig *pInitCfg;
    uint32_t Ethernet_numRxCallbackCustom = 0;
    uint32_t releaseTxCount = 0;
    uint32_t genericISRCustomcount = 0;
    uint32_t genericisrCustomRBUcount = 0;
    uint32_t genericisrCustomROVcount = 0;
    uint32_t genericisrCustomRIcount = 0;

    uint32_t systickPeriodValue = 15000000;
    Ethernet_Pkt_Desc pktDescriptionorRXCustom[NUM_PACKAGE_DESC_RX_application];
    extern uint32_t Ethernet_numGetPacketBufferCallback;
    extern Ethernet_Device Ethernet_DEVICE_STRUCT;
    uint8_t ethernet_rxBuffer[ethernet_no_of _RX_packets * ethernet_MAX_packet_length];
    uint32_t sendPacketFailedCount = 0;

    //uint32_t 命令、addr、data;
    //
    //const static char UDPData[]="#TB1234567891234567*";
    // const 静态 char UDPData]]={0xAA、0x55、0x00、0x01、0x34、0x00、0x00、0x1D、0x00、0x00、0x64、0x00、0x00、0x00、0x14、0x14、0x15、0x06、0x00、0x00、0x31、0x00、0x00、0x00、0x40、0x00、0x31、0x00、0x00、0x31、0x00、0x31、0x00、0x31、0x00、0x31、0x00、0x40、0x00、0x31、0x31、0x31、0x00、0x31、0x31、0x00、0x31、0x31、0x00、0x31、0x31、0x00、0x31、0x31、0x40、0x00、0x31、0x31、0x31、0x00、0x31、0x31、0x31、0x31、0x00、0x31、0x31、0x40、0x00、0x00、0x31、0x31、0x00、0x31、0x31、0x31、0x31、0x31、0x31、0x31、0x31、
    //********* UDP *******
    //uint8_t mac_custom[6]={0xA8、0x63、0xF2、0x00、0x1D、 0x98};
    //const static char UDPData[]="#1234*";
    //const static char UDPData[]="#TB、*";

    extern Ethernet_Pkt_Desc*lwIPEthernetIntHandler (Ethernet_Pkt_DESC *pPacket);
    void Ethernet_disableRxDMAReceive(UINT32_t base、uint8_t channelNum);
    void Ethernet_enableRxDMAReception (uint32_t base、uint8_t channelNum);
    uint32_t Ethernet_initRxChannel (Ethernet_ChInfo * chInfo);

    //********* UDP *******

    void CM_init (void)

    //
    //禁用看门狗
    //
    sysctl_disableWatchdog();

    #ifdef _flash

    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
    memcpy (&constRunStart、&constLoadStart、(size_t)&constLoadSize);

    Flash_initModule (FLASH0CTRL_base、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTATES);
    #endif


    #ifdef _flash
    interrupt_setVectorTableOffset (((uint32_t) vectorTableFlash);
    其他
    interrupt_setVectorTableOffset (((uint32_t) vectorTableRAM);
    #endif

    //
    void httpLEDToggle (void);
    void (*ledtoggleFuncPtr)(void)=&httpLEDToggle;

    //
    //
    // SysTick 中断的中断处理程序。
    //
    //
    void SysTickIntHandler (空)

    //
    //调用 lwIP 计时器处理程序。
    //
    lwIPTimer (sysstickPeriodValue);

    //
    //
    //此函数是示例调用的回调函数
    //获取数据包缓冲区。 必须返回 EtherNet_Pkt_Desc 结构。
    //将此 API 重写为自定义用例。
    //
    //
    Ethernet_Pkt_Desc* Ethernet_getPacketBufferCustom (空)

    //
    //从描述符池获取下一个数据包描述符
    //
    uint32_t shortIndex =(Ethernet_numGetPacketBufferCallback + 3)
    % NUM_PACKE_DESC_RX_application;

    //
    //增加充当头指针的簿记指针
    //到数据包描述符池的循环数组。
    //
    Ethernet_numGetPacketBufferCallback++;

    //
    //将缓冲区长度信息更新到新采购的数据包
    //描述符。
    //
    pktDescriptionorRXCustom[shortIndex].bufferLength =Ethernet_MAX_packet_length;

    //
    //更新包装器描述符中的接收缓冲区地址。
    //
    pktDescriptionorRXCustom[shortIndex].dataBuffer =
    EtherNet_device_struct.rxBuffer [\
    (Ethernet_MAX_packet_length* ethernet_device_struct.rxBuffIndex)];

    //
    //更新接收缓冲区池索引。
    //
    Ethernet_device_struct.rxBuffIndex += 1U;
    Ethernet_device_struct.rxBuffIndex =\
    (ethernet_device_struct.rxBuffIndex%ethernet_no_of _RX_packets);

    //
    //接收缓冲区可从地址0开始使用
    //
    pktDescriptionorRXCustom[shortIndex].dataOffset = 0U;

    //
    //将此新描述符返回到驱动程序。
    //
    返回(&(pktDescriptionorRXCustom[shortIndex]);

    //
    //
    //这是一个挂钩函数,在收到时由驱动程序调用
    //数据包。 应用程序预计在使用缓冲器后将对其进行补充。
    //必须返回 Ethernet_Pkt_Desc 结构。
    //将此 API 重写为自定义用例。
    //
    //
    Ethernet_Pkt_Desc* Ethernet_receivePacketCallbackCustom (
    EtherNet_Handle handleApplication、
    Ethernet_Pkt_Desc *pPacket)

    //
    //保留记录以保持收到的回调数。
    //
    #ifdef Ethernet_debug
    Ethernet_numRxCallbackCustom++;
    #endif

    //
    //这是应用程序特定处理的占位符
    //我们将用另一个缓冲区补充接收到的缓冲区
    //
    返回 lwIPEthernetIntHandler (pPacket);

    void Ethernet_releaseTxPacketBufferCustom (
    EtherNet_Handle handleApplication、
    Ethernet_Pkt_Desc *pPacket)

    //
    //发送数据包后,重复使用数据包内存以避免
    //内存泄漏。 调用将会处理的中断处理程序函数
    //释放数据包描述符使用的内存。
    //
    lwIPEthernetIntHandler (pPacket);

    //
    //增加簿记计数器。
    //
    #ifdef Ethernet_debug
    releaseTxCount++;
    #endif

    Ethernet_Pkt_Desc * Ethernet_performPopOnPacketQueueCustom (
    EtherNet_PKT_Queue_T *端口队列 Ptr)

    Ethernet_Pkt_Desc * pktDescHdrPtr;

    pktDescHdrPtr = pktQueuePtr ->头;

    if (0U!= pktDescHdrPtr)

    pktQueuePtr->head = pktDescHdrPtr->nextPacketDesc;
    pktQueuePtr->count--;

    return (pktDescHdrPtr);

    void Ethernet_performPushOnPacketQueueCustom (
    ETHERNET_PKT_Queue_T *点队列 Ptr、
    Ethernet_Pkt_Desc * pktDescHdrPtr)

    pktDescHdrPtr->nextPacketDesc = 0U;

    if (0U =pktQueuePtr->head)

    //
    //队列为空-用这一个数据包初始化它
    //
    pktQueuePtr->head = pktDescHdrPtr;
    pktQueuePtr->tail = pktDescHdrPtr;

    其他

    //
    //队列不为空-推至结束
    //
    pktQueuePtr->tail->nextPacketDesc = pktDescHdrPtr;
    pktQueuePtr->tail = pktDescHdrPtr;

    pktQueuePtr->count++;

    void Ethernet_setMACConfigurationCustom (uint32_t base、uint32_t 标志)

    HWREG (BASE + ETHERNET_O_MAC_CONFIGURATION)|=标志;

    空 Ethernet_clearMACConfigurationCustom (uint32_t base、uint32_t 标志)

    HWREG (BASE + ETHERNET_O_MAC_CONFIGURATION)&=~标志;

    中断空 Ethernet_genericISRCustom (空)

    genericISRCustomcount++;
    Ethernet_RxChDesc * rxChan;
    Ethernet_TxChDesc *txChan;
    ethernet_hw_descriptor * desptr;
    ethernet_hw_descriptor * tailPtr;
    uint16_t i=0;
    Ethernet_clearMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);
    Ethernet_clearMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_BASE、ethernet_mac_configuration_TE);
    for (i = 0U;i < Ethernet_device_struct.initConfig.numChannels;i++)

    ethernet_disableRxDMAReceive(ethernet_device_struct.baseAddresses.enet_BASE,I);

    if (((ethernet_dma_ch0_status_AIS |
    EtherNet_DMA_CH0_STATUS_RBU)=
    (HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
    EtherNet_O_DMA_CH0_STATUS)和
    (uint32_t)(以太网_DMA_CH0_STATUS_AIS |
    EtherNet_DMA_CH0_STATUS_RBU)))||
    (ETHERNET_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS)==
    (HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
    EtherNet_O_MTL_Q0_INTERRUPT_CONTROL_STATUS)和
    (uint32_t)(以太网_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS
    ))

    if ((Ethernet_DMA_CH0_STATUS_AIS |
    EtherNet_DMA_CH0_STATUS_RBU)=
    (HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
    EtherNet_O_DMA_CH0_STATUS)和
    (uint32_t)(以太网_DMA_CH0_STATUS_AIS |
    以太网_DMA_CH0_STATUS_RBU)))

    genericISRCustomRBUcount++;

    if ((Ethernet_MTL_Q0_interrupt_control_STATUS_RXOVFIS)==
    (HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +
    EtherNet_O_MTL_Q0_INTERRUPT_CONTROL_STATUS)和
    (uint32_t)(以太网_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS
    ))

    genericISRCustomROVcount++;
    Ethernet_enableMTLInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE、0、
    EtherNet_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOVFIS);

    /*
    *清除 AIS 和 RBU 状态位。 这些必须是
    *一起清除!
    *
    EtherNet_clearDMAChannelInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_base、Ethernet_DMA_CHANNEL NUM_0、
    EtherNet_DMA_CH0_STATUS_AIS |
    EtherNet_DMA_CH0_STATUS_RBU);

    /*
    *从接收缓冲器恢复不可用(和挂起的 DMA)
    *
    *所有描述符缓冲区都归应用程序、和所有
    *结果 DMA 无法将传入帧传输到
    *缓冲器(RBU 条件)。 DMA 也已进入挂起状态
    *模式。
    *
    *排空 RX 队列
    *

    /*出现 RBU 错误时,丢弃以前接收的所有数据包*/
    if (Ethernet_device_struct.initConfig.pfcbDeletePackets!= NULL)
    (* Ethernet_device_struct.initConfig.pfcbDeletePackets)();

    rxChan =
    Ethernet_device_struct.dmaObj.rxDMA[ethernet_dma_channel_NUM_0];
    txChan =
    EtherNet_device_struct.dmaObj.txDMA[Ethernet_DMA_CHANGE_NUM_0];

    /*
    *需要禁用多个中断、因此请保护代码以在其中执行此操作
    *全局禁用块(防止在之间中断)
    *

    if (NULL!= Ethernet_device_struct.ptrPlatformInterruptDisable)

    (* Ethernet_device_struct.ptrPlatformInterruptDisable)(
    Ethernet_device_struct.interruptNum[
    Ethernet_RX_INTR_CH0 + rxChan -> chInfo->chNum]);

    (* Ethernet_device_struct.ptrPlatformInterruptDisable)(
    Ethernet_device_struct.interruptNum[
    Ethernet_general_interrupt]);

    /*验证描述符队列中是否有完整容量*/
    if (rxChan -> desrQueue.count < rxChan -> desMax){
    /*由于房间错误,队列不是满容量的。
    尝试再次填充*/
    Ethernet_addPacketsIntoRxQueue (rxChan);

    Ethernet_initRxChannel()
    Ethernet_device_struct.initConfig.chInfo[ETHERNET_CH_DIR_RX][0]);

    EtherNet_writeRxDescTailPointer (
    Ethernet_device_struct.baseAddresses.enet_BASE、
    0、
    (&E) Ethernet_device_struct.rxDesc[
    (((uint32_t) ethernet_descriptor_NUM_RX_PER_channel)*
    (0 +(uint32_t) 1U));

    if (NULL!= Ethernet_device_struct.ptrPlatformInterruptEnable)

    (* Ethernet_device_struct.ptrPlatformInterruptEnable)(
    Ethernet_device_struct.interruptNum[
    Ethernet_RX_INTR_CH0 + rxChan -> chInfo->chNum]);
    (* Ethernet_device_struct.ptrPlatformInterruptEnable)(
    Ethernet_device_struct.interruptNum[
    Ethernet_general_interrupt]);



    if (0U!=(HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE +)
    EtherNet_O_DMA_CH0_STATUS)和
    (uint32_t)以太网_DMA_CH0_STATUS_RI)

    genericISRCustomRIcount++;
    EtherNet_clearDMAChannelInterrupt (
    Ethernet_device_struct.baseAddresses.enet_BASE、
    EtherNet_DMA_CHANGE_NUM_0、
    Ethernet_DMA_CH0_STATUS_NIS | Ethernet_DMA_CH0_STATUS_RI);

    for (i = 0U;i < Ethernet_device_struct.initConfig.numChannels;i++)

    Ethernet_enableRxDMAReception
    Ethernet_device_struct.baseAddresses.enet_BASE、
    i);

    Ethernet_setMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);
    Ethernet_setMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_BASE、ethernet_mac_configuration_TE);

    void Ethernet_init (const unsigned char * Mac)

    Ethernet_InitInterfaceConfig initInterfaceConfig;
    uint32_t macLower;
    uint32_t macHigher;
    uint8_t *温度;

    initInterfaceConfig.ssbase = EMAC_SS_BASE;
    initInterfaceConfig.enet_base = EMAC_BASE;
    initInterfaceConfig.phyMode = Ethernet_SS_PHY_INTF_SEL_MII;

    //
    //为启用、禁用中断分配特定于 SoC 的函数
    //和用于在系统级启用外设
    //
    initInterfaceConfig.ptrPlatformInterruptDisable =
    Platform_disableInterrupt (&P);
    initInterfaceConfig.ptrPlatformInterruptEnable =
    &Platform_enableInterrupt;
    initInterfaceConfig.ptrPlatformPeripheralEnable =
    Platform_enablePeripheral (&P);
    initInterfaceConfig.ptrPlatformPeripheralReset =
    Platform_resetPeripheral (&P);

    //
    //在 SoC 上分配外设编号
    //
    initInterfaceConfig.peripheralNum = SYSCTL_Periph_CLK_ENET;

    //
    //指定以太网中断的默认特定于 SoC 的中断号
    //
    initInterfaceConfig.interruptNum[0]= INT_EMAC;
    initInterfaceConfig.interruptNum[1]= INT_EMAC_TX0;
    initInterfaceConfig.interruptNum[2]= INT_EMAC_TX1;
    initInterfaceConfig.interruptNum[3]= INT_EMAC_RX0;
    initInterfaceConfig.interruptNum[4]= INT_EMAC_RX1;

    pInitCfg = Ethernet_initInterface (initInterfaceConfig);

    Ethernet_getInitConfig (pInitCfg);
    pInitCfg->dmaMode.InterruptMode = Ethernet_DMA_MODE_INTM_Mode2;

    //
    //分配回调以在需要时获取数据包缓冲区
    //在发送中断回调时释放 TxPacketBuffer
    //接收数据包完成中断时进行接收数据包回调
    //
    pInitCfg->pfcbRxPacket =以太网_receivePacketCallbackCustom;
    pInitCfg->pfcbGetPacket =以太网_getPacketBuffer;
    pInitCfg->pfcbFreePacket =以太网_releaseTxPacketBufferCustom;

    //
    //Assign the Buffer to be used by the Low Level driver for receiving (//分配缓冲区供低级驱动程序用于接收)
    //数据包。 以太网 DMA 应可访问此功能
    //
    pInitCfg->rxBuffer = Ethernet_rxBuffer;

    //
    //此应用程序不使用应用程序句柄
    //使用虚值1的 Hence
    //
    Ethernet_getHandle ((ethernet_handle) 1、pInitCfg、&EMAC_handle);

    //
    //禁用传输缓冲区不可用和正常中断
    默认情况下、EtherNet_getHandle 中启用//。
    //
    Ethernet_disableDmaInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE、
    0、(ETHERNET_DMA_CH0_INTERRUPT_ENABLE_TBUE |
    EtherNet_DMA_CH0_INTERRUPT_ENABLE_NIE);

    //
    //启用 MTL 中断以处理接收 FIFO 溢出
    //以太网模块中的条件。
    //
    Ethernet_enableMTLInterrupt (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE、0、
    EtherNet_MTL_Q0_INTERRUPT_CONTRAL_STATUS_RXOIE);

    //
    //禁用 MAC 管理计数器中断,因为它们未被使用
    //。
    //
    HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_BASE + Ethernet_O_MMC_RX_INTERRUPT_MASK)= 0xFFFFFFFF;
    HWREG (Ethernet_DEVICE_STRUCT.baseAddresses.enet_base + Ethernet_O_MMC_IPC_RX_INTERRUPT_MASK)= 0xFFFFFFFF;
    //
    //执行全局中断使能
    //
    (void) Interrupt_enableInProcessor();

    //
    //Assign default ISR
    //
    Interrupt_registerHandler (INT_EMAC_TX0、Ethernet_transmitISR);
    Interrupt_registerHandler (INT_EMAC_RX0、Ethernet_receiveISR);
    Interrupt_registerHandler (INT_EMAC、Ethernet_genericISRCustom);

    //
    //启用默认的中断处理程序
    //
    INTERRUPT_ENABLE (INT_EMAC_TX0);
    INTERRUPT_ENABLE (INT_EMAC_RX0);
    INTERRUPT_ENABLE (INT_EMAC);

    //
    //将 Mac 地址字符串转换为32/16拆分变量格式
    //驱动程序需要将其编程到硬件寄存器中。
    //注意:此步骤是在 EtherNet_getHandle 函数之后完成的,因为
    //在该函数中编程虚拟 MAC 地址。
    //
    temp =(uint8_t *) macLower;
    temp[0]= mac[0];
    temp[1]= mac[1];
    temp[2]= mac[2];
    temp[3]= mac[3];

    temp =(uint8_t *) macHigher;
    temp[0]= mac[4];
    temp[1]= mac[5];

    //
    //对单播 MAC 地址进行编程。
    //
    Ethernet_setMACAddr (EMAC_BASE、0、macHigher、macLower、ethernet_channel_0);
    Ethernet_clearMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);
    Ethernet_setMACConfigurationCustom (ethernet_device_struct.baseAddresses.enet_base、ethernet_mac_configuration_re);


    //********* IPCv2.0 *********
    _interrupt void IPC_ISR0 ()

    int i;
    uint32_t 命令、addr、data;
    bool status = false;
    //
    //读取命令
    //
    IPC_readCommand (IPC_CM_L_CPU1_R、IPC_FLAG0、IPC_ADDR_CORRECT_ENABLE、
    命令、addr、&data);

    if (command =IPC_CMD_READ_MEM)

    状态= true;

    for (i=0;<data; i++)

    UDPData[i]=*((uint16_t *) addr+i);
    // if (*(((uint32_t *) addr + i)!= i)
    // status = false;


    //
    //发送对 C28x 内核的响应
    //
    if (状态)

    IPC_sendResponse (IPC_CM_L_CPU1_R、TEST_PASS);

    其他

    IPC_sendResponse (IPC_CM_L_CPU1_R、TEST_FAIL);

    //
    //确认标志
    //
    IPC_ackFlagRtoL (IPC_CM_L_CPU1_R、IPC_FLAG0);

    //********* IPCv2.0 *********


    //
    //此示例演示了以太网控制器的使用。
    //
    //********* 主页代码
    int i=0;

    int main (空)

    unsigned long ulUser0、ulUser1;
    unsigned char pucMACArray[8];
    //
    //特定于用户的 IP 地址配置。
    //当前实施仅适用于静态 IP 地址。
    //
    无符号长整型 ipaddr = 0xC0A80216;//192.168.2.22 // 0xDBF60201;// 0xC0A80216;
    无符号长网络掩码= 0xFFFFFF00;
    无符号长整型 GWAddr = 0x00000000;
    //
    //初始化 CM。 将所需的函数加载到 SRAM。
    //
    cm_init();

    SysTK_setPeriod (SysTick PeriodValue);
    SysTK_enableCounter();
    SysTick 寄存器 InterruptHandler (SysTickIntHandler);
    SysTK_enableInterrupt ();

    //********* IPCv2.0 ********
    //
    IPC_clearFlagLtoR (IPC_CM_L_CPU1_R、IPC_FLAG_ALL);//清除任何 IPC 标志(如果已设置)
    IPC_registerInterrupt (IPC_CM_L_CPU1_R、IPC_INT0、IPC_ISR0);//启用 IPC 中断
    IPC_SYNC (IPC_CM_L_CPU1_R、IPC_FLAG31);//同步两个内核。
    //********* IPCv2.0 *********

    //
    //启用处理器中断。
    //
    interrupt_enableInProcessor();
    //设置特定于用户/公司的 MAC 八位位组
    //(对于此代码、我们使用 A8-63-F2-00-00-80)
    // 0x00 MACOCT3 MACOCT2 MACOCT1
    ulUser0 = 0x00F263A8;
    // 0x00 MACOCT6 MACOCT5 MACOCT4
    ulUser1 = 0x00800000;
    //
    //将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 MAC
    //对硬件寄存器进行编程所需的地址,然后对 MAC 进行编程
    //将地址输入以太网控制器寄存器。
    //
    puMACArray[0]=((ulUser0 >> 0)& 0xff);
    puMACArray[1]=((ulUser0 >> 8)& 0xff);
    puMACArray[2]=((ulUser0 >> 16)& 0xff);
    puMACArray[3]=((ulUser1 >> 0)& 0xff);
    puMACArray[4]=((ulUser1 >> 8)& 0xff);
    puMACArray[5]=((ulUser1 >> 16)& 0xff);
    //
    //初始化以太网模块。
    //
    Ethernet_init (pucMACArray);
    //
    //使用 DHCP 初始化 lwIP 库。
    //
    lwIPInit (0、pucMACArray、ipaddr、netmask、GWAddr、 ipaddr_use_static);

    //2021625
    udp_init();
    IP4_ADDR (&ipaddr、192、168、2、160);
    UdpPcb = udp_new();
    udp_bind (IPַ Pcb、IP_ADDR_ANY、6600);//μ s
    UDP_CONNECT (UdpPcb、ipaddr、5530);
    p = pbuf_alloc (PBUF_transport、PAYLOAD, PBUF_RAM);
    while (1)

    //p = pbuf_alloc (PBUF_transport、shuzulen、PBUF_RAM);
    memset (buf_TX、0x00、有效载荷);
    对于(I = 0;I <有效负载;I++)

    if (i < shuzulen)

    // buf_TX[i]=(uint8_t)(UDPData[i]& 0xff);
    buf_TX[i]= UDPData[i];

    其他

    buf_TX[i]=0x00;


    p->PAY=(void*) buf_tx;
    p->tot_len =有效载荷;
    p->len =有效载荷;
    udp_send (udpcb、p);
    DEVICE_DELAY_US (10000);

    // if (p!= NULL)
    // pbuf_free (p);

    //初始化 HTTP Web 服务器守护程序。
    //
    //httpd_init();
    //
    //永久循环。 所有工作都在中断处理程序中完成。
    //

    //
    //
    //由 lwIP 库调用。 当收到命令时切换 LED
    // HTTP Web 服务器。
    //
    //
    void httpLEDToggle (void)

    //
    //切换控制卡上的 LED D1。
    //
    GPIO_togglePin (DEVICE_GPIO_PIN_LED1);


    //
    //
    //由 lwIP 库调用。 可用于定期自定义任务。
    //
    //
    空 lwIPHostTimerHandler (空)

    现在、我可以实现 CPUI 以将 uint_16类型数据发送到 CM、并实现 CM 以通过 UDP_SEND 函数向外发送 uint_16类型数据。
    但我希望 CPUI 通过 UDP_SEND 函数将 uint_16类型数据发送到 CM 和 CM 以向外发送 uint_8类型数据、我需要如何修改代码!
    谢谢!
    期待收到您的回复!