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.

[参考译文] CCS:RM46L852 Launchpad 和 DP83640 PHY

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/785415/ccs-rm46l852-launchpad-and-dp83640-phy

器件型号:RM46L852
主题中讨论的其他器件:HALCOGENDP83640

工具/软件:Code Composer Studio

大家好、

我想通过 EMAC 与 PHY 通信。 我在 Halcogen 中使用了作为环回的可用代码、环回运行正常。 但是、每当我发送数据包时、TX_EN 都不会被调整。 TX_CLK 和 RX_CLK 正确进入。 我尚未连接任何 DHCP/UDP。 请给出答案。

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

    工具/软件:Code Composer Studio

    大家好、我没有收到任何答案。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请检查是否根据表32-4设置了 PINMUX 设置。 MII/RMII 多路复用控制。

    此致、
    米罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我已经在 PINMMR 中设置和检查了 MII 和 MDIO 信号。 我的要求是、我使用具有 Profinet 接口的 Siemens。 我希望 RM46L582 LaunchPad 和 DP83640一起发送数据包以进行设置或获取参数。 由于我不使用 HDK、根据 HDK 原理图、我们仅单独连接了 DP83640、并且能够通过 DP83640寄存器进行写入/读取。 我还添加了25MHz 晶体。 回送正常、但没有回送、根本无法正常工作。 TX_EN 和 TXD[3:0]本身保持低电平。 请建议、我不熟悉该以太网。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请检查 TXCLK 是否已进入 MCU。

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

    TXCLK 来自 DP83640、但频率不正确。 它是6.25MHz。 另请建议 DP83640的设置。 请发送任何伪代码。

    我想知道 EMAC 数据包和 Siemens 驱动器是否可以通过 Profinet 总线相互通信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    从这里: processors.wiki.ti.com/.../HALCoGen_Ethernet_Driver_and_lwIP_Integration_Demonstration 您可以下载用于配置 DP83640的 API。

    我将此主题移至接口论坛、以了解有关 DP83640配置的更多详细信息。

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

    请确保 DP83640处于 MII 模式。 您能否读出寄存器0x17?

    在 MII 模式下、RX_CLK 和 TX_CLK 都来自 PHY。 您在 RX_CLK 上看到了什么?

    此致、

    Hung Nguyen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DP83640的寄存器处于 MII 模式。 TX_CLK 和 RX_CLK 为2.5MHz。 但 TX_EN 完全不会出现。

    我不确定是否可以驱动具有 Profinet 接口的驱动器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Shruthi、

    TX_EN 不由 DP83640驱动。 它来自 EMAC。

    请确保正确配置 EMAC 或从处理器团队获得支持。

    此致、

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

    仍然有问题。 我无法通过示波器看到 TXEn 升高。 我能够在存储器位置看到它。 但在其范围内、欧姆值并不是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:RM46L852

    工具/软件:Code Composer Studio

    大家好、

    请告诉我们 EMAC 设置。 我使用的是 RM46L852 Launchpad 和 DP83640。 与 HDK 相似。 我能够在存储器位置看到传输的字节。 但实际上是通过示波器。不是。 既未检测到 TXEN、也未检测到其他 TXD。 请建议

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

    您说您的环回测试通过了。 是 EMAC 内部回送还是 PHY 内部回送、还是外部回送? 外部回送是 TXed 数据回送至 RJ45连接器处的 RX。

    要使用 MII、请下拉 RX_DV 引脚。 DP83640提供了五个 PHY 地址引脚。 地址引脚为 COL 和 RXD[3:0]。 COL 具有弱内部上拉电阻器、RXD[3:1]具有弱内部下拉电阻器。 由于 TMS570器件上的 RXD[3:2]具有与 DP83640内部上拉电阻器相冲突的内部上拉电阻器、因此请在 RXD[3:2]信号上添加一个强大的2.2k Ω 下拉电阻器。

    信号 CRS 也是如此、因此也请为 CRS 信号添加一个强上拉电阻器。

    以太网信号是高速信号、使用蓝色导线传输信号可能无法正常工作、因为信号完整性不良。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wang、

    它是 PHY 内部回路。 我已经设置了 DP83640中的位。其他下拉寄存器已按照您的建议连接。 我更改了通道1 TXD 正常工作、但 RXD 不会从 PHY 输出。 我可以通过0xFC521010看到 RX_CLK 和 RX1HDP、但缓冲器指针中没有数据。

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

    您可以尝试外部回送吗? 您需要一个以太网适配器来将 TX 路由回 RX。

    /*------------------------------------ *
    * Init PHY/MDIO *
    ********************************************************************************************** *
    MDIO_CONTROL = 0x41000020; //启用 MII 接口0x40000001
    MDIO_USERACCESS0 = 0 //读取 PHY ID 1
    |(1 <<31) //[31]开始
    |(0 << 30) //[30]读取
    |(0 << 29) //[29]采集
    |(2 <<21) //[25-21] PHY 寄存器地址
    |(1 <<16) //[20-16] PHY 地址
    |(0 << 0); //[15-0]数据

    while (MDIO_USERACCESS0 & 0x8000000);//等待结果
    PHY_CTRL_reg = 0
    |(0 <<15) //重置
    |(0 <<14) //环回
    |(1 <<13) //速度选择
    |(1 <<12) //自协商启用
    |(0 <<11) //断电
    |(0 <<10) //隔离
    |(0 <<9) //重新启动自动协商
    |(1 <<8) //双工模式
    |(0 <<7) //冲突测试
    |(0 <<6); //速度选择

    MDIO_USERACCESS0 = 0 //设置控制寄存器
    |(1 <<31) //[31]开始
    |(1 <<30) //[30]写入
    |(0 << 29) //[29]采集
    |(0 << 21) //[25-21] PHY 寄存器地址
    |(1 <<16) //[20-16] PHY 地址
    |(phy_ctrl_reg << 0); //[15-0]数据

    while (MDIO_USERACCESS0 & 0x8000000);//等待结果

    //正在等待链接...
    while ((phy_getReg (1、1)& 0x4)==0);


    /*---------------------------------------------- *
    * phy_getReg (phynum、Regnum) *
    ******************************************************************************************************* *
    uint16_t phy_getReg (uint16_t phynum、uint16_t RegNum)

    uint16_t 值;

    MDIO_USERACCESS0 = 0 //读取 PHY ID 1
    |(1 <<31) //[31]开始
    |(0 << 30) //[30]读取
    |(0 << 29) //[29]采集
    |((RegNum & 0x1F)<<21) //[25-21] PHY 寄存器地址
    |((phynum & 0x1F)<<16) //[20-16] PHY 地址
    |(0 << 0); //[15-0]数据

    while (MDIO_USERACCESS0 & 0x8000000);//等待结果

    值= MDIO_USERACCESS0;
    返回值;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我之前使用的测试代码。 希望这对您有所帮助。 此代码遵循 TRM 中列出的初始化步骤。

    /*
    * 0。 复位以太网
    *
    EMAC_SOFTRESET = 1;
    while (EMAC_SOFTRESET!= 0);

    /*
    * 1. 清除 EMAC 控制模块中断控制寄存器中的器件中断使能位
    *
    ECTRL_C0RXEN = 0x00000000;
    ECTRL_C0TXEN = 0x00000000;

    /*
    * 2. 清除 MAC 控制、接收控制和发送控制寄存器。
    *
    EMAC_MACCONTROL = 0;
    EMAC_RXCONTROL = 0;
    EMAC_TXCONTROL = 0;

    /*
    * 3. 将所有16个头描述符指针 RXnHDP 和 TXnHDP 初始化为零
    *
    PREG =&EMAC_RX0HDP;
    对于(i = 0;i < 8;i++)
    *PREG++= 0;

    PREG =&EMAC_TX0HDP;
    对于(i = 0;i < 8;i++)
    *PREG++= 0;

    /*
    * 4. 通过写入0清除所有36个统计信息寄存器
    *
    PREG =&EMAC_RXGOODFRAMES;
    对于(i = 0;i < 36;i++)
    *PREG++= 0;

    /*
    * 5. 通过编程 MAC 索引寄存器(MACINDEX)、MAC 来设置本地以太网 MAC 地址
    * 地址高字节寄存器(MACADDRHI)和 MAC 地址低字节寄存器(MACADDRLO)。
    * 确保对所有8个 MAC 地址进行编程-无论是否启用接收通道。
    *
    EMAC_MACINDEX = 0x00;
    EMAC_MACADDRHI = 0x03020100;//只需要第一次写入
    EMAC_MACADDRLO = 0x00180504;

    EMAC_MACINDEX = 0x01;
    EMAC_MACADDRLO = 0x1504;

    EMAC_MACINDEX = 0x02;
    EMAC_MACADDRLO = 0x2504;

    EMAC_MACINDEX = 0x03;
    EMAC_MACADDRLO = 0x3504;

    EMAC_MACINDEX = 0x04;
    EMAC_MACADDRLO = 0x4504;

    EMAC_MACINDEX = 0x05;
    EMAC_MACADDRLO = 0x5504;

    EMAC_MACINDEX = 0x06;
    EMAC_MACADDRLO = 0x6504;

    EMAC_MACINDEX = 0x07;
    EMAC_MACADDRLO = 0x7504;

    /*
    * 6. 初始化接收通道 N 自由缓冲区计数寄存器(RXnFREEBUFFER)、接收通道 n 流量控制阈值寄存器(RXnFLOWTHRESH)、
    * 和接收滤波器低优先级帧阈值寄存器(RXFILTERLOWTHRESH)。
    *我不使用它、因为我禁用了缓冲流控制
    *

    /*
    * 7. 无多播寻址、所以将 MAC 地址哈希寄存器(MACHASH1和 MACHASH2)清零。
    *
    EMAC_MACHASH1 = 0;
    EMAC_MACHASH2 = 0;

    /*
    * 8. 将 RX 缓冲器偏移设置为0
    * 有效数据始终从第一个字节开始
    *
    EMAC_RXBUFFEROFFSET = 0;

    /*
    * 9. 在通道0-7上启用单播 RX
    *
    EMAC_RXUNCTSTSET = 0xFF;


    /*
    * 10. 设置 RX( M) ulticast ( B) romiscuous 通道
    *
    EMAC_RXMBPENABLE = 0x01E02020;

    /*
    * 11. 在 MACCONTROL 中设置适当的配置位(暂时不要设置 GMIIEN 位)。
    *
    EMAC_MACCONTROL = 0
    |(1 <<15) // 100MHz RMII
    |(0 <<9) //轮循
    |(0 <<6) // TX 起搏被禁用
    |(0 <<5) // GMII RX 和 TX
    |(0 <<4) // TX 流被禁用
    |(0 <<3) // RX 流被禁用
    |(0 <<1) //回送被禁用
    |(1 <<0); //全双工

    /*
    * 12. 通过写接收中断屏蔽清除寄存器来清除所有未使用的通道中断位
    *
    EMAC_RXINTMASKCLEAR = 0xFF;
    EMAC_TXINTMASKCLEAR = 0xFF;

    /*
    * 13. 启用接收中断屏蔽置位寄存器(RXINTMASKSET)中的 RX 和 TX 通道中断位
    * 和要使用的通道的发送中断屏蔽置位寄存器(TXINTMASKSET)、并启用 HOSTMASK 和 STATMASK 位
    * 使用 MAC 中断屏蔽置位寄存器(MACINTMASKSET)。
    *
    EMAC_RXINTMASKSET = 0xFF;
    EMAC_TXINTMASKSET = 0xFF;

    /*启用主机错误和统计中断*/
    EMAC_MACINTMASKSET = 0
    |(1 <<1) //主机错误中断屏蔽
    |(1 <<0); //统计中断屏蔽

    /*
    * 14. 初始化接收和发送描述符列表队列。
    *

    /*
    * 15. 通过将一个指针写入到接收缓冲区描述符列表的标题 RXnHDP 来准备接收。
    *

    EMAC_MACSRCADDRLO = 0x00180504;/*字节0、1 *
    EMAC_MACSRCADDRHI = 0x03020100; /*字节2-5 -通道0 ??? *
    // EMAC_MACSRCADDRLO = 0x03020100;//字节0、1 *
    // EMAC_MACSRCADDRHI = 0x0405; /*字节2-5 -通道0 ??? *

    /*
    * 16. 启用 RX 和 TX DMA 控制器。
    * 然后设置 GMIIEN
    *
    EMAC_RXCONTROL = 1;
    EMAC_TXCONTROL = 1;
    EMAC_MACCONTROL |=(1 <<5);

    /* 17. 在 EWCTL 中启用器件中断。 *
    ECTRL_C0RXEN = 0x00000001;
    ECTRL_C0TXEN = 0x00000001;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SYS_MAIN.c

    /**@示例 Example_EMAC_Loopback _txRx.c
    * 这是一个示例,说明了创建示例应用程序的步骤
    * 使用 HALCoGen 驱动程序以环回模式发送和接收广播以太网数据包。
    * EMACTransmit API 用于传输单个数据包。 在这里、它被调用两次、从而传输两个数据包。
    * 要查看传输的信息、必须观察位于 EMAC RAM 中的传输和接收缓冲区描述符。
    * 在默认配置中、发送的描述符可以在0xFC520000 (EMAC RAM 的基址)上找到、而接收描述符从0xFC521010开始。
    * 您还可以在 EMAC 网络统计寄存器中观察传输的数据包数量和其他此类信息。
    *
    * @b Step @b 1:
    *
    * 创建新项目。
    *
    * 导航:->文件->新建->项目
    *
    * @image html example_createProject.jpg "图:创建新项目"
    *
    * @b Step @b 2:
    *
    * 配置驱动程序代码生成:
    * -启用 EMAC 驱动程序
    * -禁用其他
    *
    * 导航:-> TMS570LSxx /RM4 ->驱动程序启用
    *
    * @image html example_freeRTOSBlinky_enableDrivers_TMS570LS3x-RMx.jpg "图:驱动程序配置"
    *
    * @b Step @b 3:
    *
    * 配置中断处理:
     ‘-在 VIM CHANNELS 64-95’(VIM 通道64-95)下,启用 EMAC Tx 和 Rx 中断(分别为通道77和79)。
    *
    * 导航:-> TMS570LSxx /RM4 -> VIM 通道64-95
    *
    * @image html emac_interruptenable.jpg "图:中断配置"
    *
    * @b Step @b 4:
    *
    * 配置 PLL:
     ‘-在“PLL”选项卡下,将两个 PLL 的乘法器更改为120,这样两种情况下的输出频率都为160.00 MHz。
    *
    * 导航:-> TMS570LSxx /RM4 -> PLL
    *
    * @image html emac_PLL.jpg "图:PLL 配置"
    *
    * @b Step @b 5:
    *
    * 配置 GCM:
    * -在‘GCM’(GCM)选项卡下,将 VCLKA4分频器的值更改为2,
    *  这样 VCLKA4 (或者对于 RM46x/TMS570LS12x 器件为 VCLKA4_DIVR_EMAC)的输出为40.00 MHz。
    *
    * 导航:-> TMS570LSxx /RM4 -> GCM
    *
    * @image html emac_gcm.jpg "图:GCM 配置"
    *
    * @b Step @b 6:
    *
    * 配置 PINMUX
     ‘-在 PINMUX’选项卡下,启用 RMII/MII、MDIO (G3)和 MDCLK (V5)。
    *
    * 导航:-> OS -> PINMUX。
    *
    * @image html emac_pinmux.jpg "图:PINMUX 配置"
    *
    * @b Step @b 7:
    *
    * 配置 EMAC:
    * -将 EMAC 地址更改为您选择的任何 MAC 地址。 默认情况下、物理地址为1。
    * -启用环回。 保留其他选项的默认值。
    * 导航:->文件-> EMAC
    *
    * @image html emac_config.jpg "图:EMAC 配置"
    *
    * @b Step @b 8:
    *
    * 生成代码
    *
    * 导航:->文件->生成代码
    *
    * @image html example_freeRTOS_generateCode.jpg "图:生成代码"
    *
    * @b Step @b 9:
    *
    * 将以下源代码复制到您的应用程序中。
    *
    * 示例文件 example_emac_Loopback _txrx.c 也可以在示例文件夹:./HALCoGen/examples 中找到
    *
    * @注意 HALCoGen 在 sys_main.c 中生成一个空的主函数、
    *       请确保您在正确的主函数中链接、或将源代码复制到此文件的用户代码部分。
    *
    *

    #include "sys_common.h"
    #include "system.h"
    #include "sys_vim.h"

    /*用户代码开始(1)*/
    #include "emac.h"
    #include "hw_reg_access.h"
    #include "pinmux.h"
    /*用户代码结束*/

    /**@fn void main (void)
    *  @应用程序主函数简介
    *  @请注意、默认情况下、此函数为空。
    *
    *  此函数在启动后调用。
    *  用户可以使用此函数来实现应用程序。
    *

    uint8  emacAddress[6U]=  {0x00U、0x08U、0xEEU、0x03U、0xA6U、 0x6CU};
    uint32 emacPhyAddress =  1U;

    /*用户代码开始(2)*/
    extern hdkif_t hdkif_data[1];
    pbuf_t pack[5];
    静态 uint8数据[5][1024];

    uint32 Size1 = 212、size2 = 106;
    volatile uint16 DP83640_RMIIBYPASS、DP83640_BMCR;
    易失性 uint16测试;
    volatile uint16 TestTx、TestRx;
    int i、j;

    void create_packet()



       for (i=0;i<2;i++)
       {
       PACK[i].to_len = SIZE1;
       pack[i].len = size2;
       for (j=0;j<7;j++)
       {
           DATA[I][j]= 0x55u;

       }

       DATA[I][7]= 0x5D;

       for (j=0;j<6;j++)
       {
           data[i][j+8]= emacAddress[j];
       }

       for (j=0;j<6;j++)
       {
          data[i][j+14]= emacAddress[j];
       }

       DATA[I][20]= 0x00;
       DATA[I][21]= 0x50;

       for (j=0;j<80;j++)
       {
           Data[i][j+22]= i+5;
       }

       for (j=0;j<4;j++)
          {
              Data[i][j+103]= i+5;
          }
      // pack[i].next = NULL;
       PACK[I].PAYLOAD =&DATA[I][0];
       if (i=0)
       PACK[I].next =&PACK[I+1];

       其他
       PACK[1].NEXT =空;
       }

    /*用户代码结束*/

    void main (void)

    /*用户代码开始(3)*/
       TestTx=0;
       TestRx=0;
       _enable_IRQ ();
       EMACHWInit (emacAddress);
       HWREG (0xFCF78160)= 0x00000021;
       HWREG (0xFCF7816C)= 0x00020002;
       HWREG (0xFCF78500)= 0x00116CA6;
       HWREG (0xFCF78508)= 0x00000001;
       HWREG (0xFCF780B8)= 0x00000003;
       HWREG (0xFCF780B8)= 0x00000003;
       HWREG (0xFCF78100)= 0x01E12100;
       //HWREG (0xFCF78104)= 0x00000002;
       //HWREG (0xFCF78108)= 0x00000002;
       //HWREG (0xFCF7810C)= 0X000000BE;
       //HWREG (0xFCF78008)= 0x01;
       //HWREG (0xFCF7808C)= 0x00;
       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x00、0x4100);
       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x1B、0x0040);
       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x1C、0x0000);
       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x17、0x0001);

       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x00、0x4100);
       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x1B、0x0040);
       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x1C、0x0000);
       MDIOPhyRegWrite (0xFCF78900、0x00000001、0x17、0x0001);
       MDIOPhyRegRead (0xFCF78900、0x00000001、0x1C、0x00);


       create_packet();


    //Size1=600   ;
    //   size2=120;
    //   create_packet();
    //   EMACTransmit (&hdkif_data[0]、&pack[0]);

       while (1)
       {

           EMACTransmit (&hdkif_data[0]、&pack[0]);
           for (i=0;i<10000;i++);

           EMACReceive (&hdkif_data[0]);
       }
    /*用户代码结束*/





    EMAC.c.


    /**
     * \file  emac.c
     *
     * \brief EMAC API。
     *
     *  此文件包含 EMAC 的器件抽象层 API。
     *

    /*
    *版权所有(C) 2009-2016德州仪器(TI)公司- www.ti.com  
    *
    *
    * 以源代码和二进制形式重新分发和使用、有无
    * 如果满足以下条件、则允许进行修改
    符合*:  
    *
    *   源代码的重新分发必须保留上述版权
    *   注意、此条件列表和以下免责声明。
    *
    *   二进制形式的再发行必须复制上述版权
    *   请注意、中的此条件列表和以下免责声明
    *   随提供的文档和/或其他材料   
       *分发。
    *
    *   德州仪器公司的名称和名称均不相同
    *   其贡献者可用于认可或推广衍生产品
    *   未经特定的事先书面许可。
    *
    * 本软件由版权所有者和贡献者提供
    * "按原样"以及任何明示或暗示的保证、包括但不包括
    * 仅限于对适销性和适用性的暗示保证
    * 一项特定目的不予承认。 在任何情况下、版权均不得
    * 所有者或贡献者应对任何直接、间接、偶然或
    * 特殊、惩戒性或后果性损害(包括但不包括)
    * 仅限于采购替代货物或服务;丧失使用、
    * 数据或利润;或业务中断)
    * 责任理论、无论是合同责任、严格责任还是侵权行为
    * (包括疏忽或其他)因使用而以任何方式产生
    * 、即使被告知可能会发生此类损坏。
    *
    *



    /*用户代码开始(0)*/
    /*用户代码结束*/

    #include "emac.h"
    #include "sys_vim.h"

    /*用户代码开始(1)*/
    extern volatile uint16 TestTx、TestRx;
    /*用户代码结束*/

    /*为所有 EMAC 实例定义接口*/
    hdkif_t hdkif_data[MAX_EMAC_instance];
    /*SAFETYMCUSW 25 D MR :8.7 "静态分配的存储器需要可用于整个应用。" *
    静态 uint8_t pbuf_array[MAX_RX_PBUF_ALLOC][MAX_TRANSF_UNIT];
    /*********
    *                      内部宏定义
    秘书长的报告 /
    #define EMAC_CONTRAL_RESET            (0x01U)
    #define EMAC_SOFT_RESET               (0x01U)
    #define EMAC_MAX_HEADER_DESC          (8U)
    #define EMAC_unicast_disable          (0xFFU)

    /*********
    *                       API 函数定义
    秘书长的报告 /
    /**
     *\brief 启用  TXPULSE 中断生成。
     *
     *\param  emacBase     address of the EMAC Module registers。
     *\param  emacCtrlEMAC 控制模块寄存器的基地址
     *\param  ctrlCore     要在 EMAC 控制模块中启用中断的通道编号
     *\param  要      启用中断的通道编号
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_001 */
    /* DesignId:ETH_DesignId_001*/
    /*要求:HL_ETH_SR15 */
    void EMACTxIntPulseEnable (uint32 emacBase、uint32 emacCtrlBase、uint32 ctrlCore、uint32通道)

       HWREG (emacBase + EMAC_TXINTMASKSET)|=((uint32) 1U <<通道);

       HWREG (emacCtrlBase + EMAC_CTRL_CnTXEN (ctrlCore))|=(((uint32) 1U <<通道);


    /**
     *\brief  禁用 TXPULSE 中断生成。
     *
     *\param  emacBase     address of the EMAC Module registers。
     *\param  emacCtrlEMAC 控制模块寄存器的基地址
     *\param  ctrlCore     要在 EMAC 控制模块中启用中断的通道编号
     *\param  要      禁用中断的通道编号
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_002 */
    /* DesignId:ETH_DesignId_002*/
    /*要求:HL_ETH_SR15 */
    void EMACTxIntPulseDisable (uint32 emacBase、uint32 emacCtrlBase、uint32 ctrlCore、uint32通道)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       HWREG (emacBase + EMAC_TXINTMASKCLEAR)|=((uint32) 1U <<通道);

       HWREG (emacCtrlBase + EMAC_CTRL_CnTXEN (ctrlCore)))&=(~(((UINT32) 1U <<通道));


    /**
     *\brief 启用  RXPULSE 中断生成。
     *
     *\param  emacBase     address of the EMAC Module registers。
     *\param  emacCtrlEMAC 控制模块寄存器的基地址
     *\param  ctrlCore     控制内核、要为其启用中断。
     *\param  要      启用中断的通道编号
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_003 */
    /* DesignId:ETH_DesignId_003*/
    /*要求:HL_ETH_SR15 */
    void EMACRxIntPulseEnable (uint32 emacBase、uint32 emacCtrlBase、uint32 ctrlCore、uint32通道)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       HWREG (emacBase + EMAC_RXINTMASKSET)|=((uint32) 1U <<通道);

       HWREG (emacCtrlBase + EMAC_CTRL_CnRXEN (ctrlCore))|=(((uint32) 1U <<通道);


    /**
     *\brief  禁用 RXPULSE 中断生成。
     *
     *\param  emacBase     address of the EMAC Module registers。
     *\param  emacCtrlEMAC 控制模块寄存器的基地址
     *\param  ctrlCore     控制内核、该内核的中断将被禁用。
     *\param  要      禁用中断的通道编号
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_004 */
    /* DesignId:ETH_DesignId_004*/
    /*要求:HL_ETH_SR15 */
    void EMACRxIntPulseDisable (uint32 emacBase、uint32 emacCtrlBase、uint32 ctrlCore、uint32通道)

       HWREG (emacBase + EMAC_RXINTMASKCLEAR)|=((uint32) 1U <<通道);

       HWREG (emacCtrlBase + EMAC_CTRL_CnRXEN (ctrlCore))和=(~(((UINT32) 1U <<通道)));

    /**
     *\brief  此 API 设置 RMII 速度。 RMII 速度可以是10Mbps 或
     *         100Mbps
     *
     *\param  emacBase    address of the EMAC Module registers。
     *\param         设置速度。
     *         速度可以采用以下值。 \n
     *               EMAC_RMIISPEED_10Mbps - 10Mbps \n
     *               EMAC_RMIISPEED_100Mbps - 100Mbps。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_005 */
    /* DesignId:ETH_DesignId_005*/
    /*要求:HL_ETH_SR19 */
    空 EMACRMIISpeedSet (uint32 emacBase、uint32速度)

       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_RMIISPEED);
       
       HWREG (emacBase + EMAC_MACCONTROL)|=速度;

    /* sourceId:ETH_sourceId_006 */
    /* DesignId:ETH_DesignId_006*/
    /*要求:HL_ETH_SR18 */
    /**
     *\brief  此 API 设置 GMII 位、RX 和 TX 启用接收和发送。
     *         注意:这不是启用 MII 的 API。
     *\param  emacBase    address of the EMAC Module registers。
     *
     *\返回 无
     *
     **/
    空 EMACMIIEnable (uint32 emacBase)

       HWREG (emacBase + EMAC_MACCONTROL)|= EMAC_MACCONTROL_GMIIEN;


    /**
     *\brief  此 API 清除 GMII 位、Rx 和 Tx 保持在复位状态。
     *         注意:这不是禁用 MII 的 API。
     *\param  emacBase    address of the EMAC Module registers。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_007 */
    /* DesignId:ETH_DesignId_007*/
    /*要求:HL_ETH_SR18 */
    空 EMACMIIDisable (uint32 emacBase)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_GMIIEN);


    /**
     *\brief  此 API 设置 MAC 的双工操作模式(全双工/半双工)。
     *
     *\param  emacBase    address of the EMAC Module registers。
     *\param  duplexMode  双工操作模式。
     *         DuplexMode 可以采用以下值。 \n
     *               emac_duplex_full -全双工 \n
     *               emac_duplex_half -半双工。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_008 */
    /* DesignId:ETH_DesignId_008*/
    /*要求:HL_ETH_SR21 */
    空 EMACDuplexSet (uint32 emacBase、uint32双工模式)

       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_FULLDUPLEX);
       
       HWREG (emacBase + EMAC_MACCONTROL)|=双工模式;


    /**
     *\brief  API、用于在 TX 控制寄存器中启用发送
     *         在发送被启用后、对 TXHDP 的任何写入操作
     *         一个通道将开始传输
     *
     *\param  emacBase     Address of the EMAC Module Registers。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_009 */
    /* DesignId:ETH_DesignId_009*/
    /*要求:HL_ETH_SR21 */
    空 EMACTxEnable (uint32 emacBase)

       HWREG (emacBase + EMAC_TXCONTROL)= EMAC_TXCONTROL_TXEN;


    /**
     *\brief  API、用于在 TX 控制寄存器中禁用发送
     *
     *\param  emacBase     Address of the EMAC Module Registers。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_010 */
    /* DesignId:ETH_DesignId_010*/
    /*要求:HL_ETH_SR21 */
    空 EMACTxDisable (uint32 emacBase)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       HWREG (emacBase + EMAC_TXCONTROL)= EMAC_TXCONTROL_TXDIS;


    /**
     *\brief  API、用于在 RX 控制寄存器中启用接收
     *         在接收被启用后、写入的 RXHDP
     *         一个通道、数据可以在目标中接收
     *         由相应的 RX 缓冲区描述符指定。
     *
     *\param  emacBase     Address of the EMAC Module Registers。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_011*/
    /* DesignId:ETH_DesignId_011*/
    /*要求:HL_ETH_SR21 */
    空 EMACRxEnable (uint32 emacBase)

       HWREG (emacBase + EMAC_RXCONTROL)= EMAC_RXCONTROL_RXEN;


    /**
     *\brief  API、用于在 RX 控制寄存器中禁用接收
     *
     *\param  emacBase     Address of the EMAC Module Registers。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_012*/
    /* DesignId:ETH_DesignId_012*/
    /*要求:HL_ETH_SR21 */
    空 EMACRxDisable (uint32 emacBase)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       HWREG (emacBase + EMAC_RXCONTROL)= EMAC_RXCONTROL_RXDIS;


    /**
     *\brief  API、用于写入 TX HDP 寄存器。 如果启用了发送、
     *         写入 TX HDP 将立即开始传输。
     *         数据将取自 TX 缓冲区的缓冲区指针
     *         描述符写入 TX HDP
     *
     *\param  emacBase     Address of the EMAC Module Registers。\n
             TX 缓冲区描述符的*\param deschr 地址
     *\param  通道      编号
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_013*/
    /* DesignId:ETH_DesignId_013*/
    /*要求:HL_ETH_SR16 */
    void EMACTxHdrDescPtrWrite (uint32 emacBase、uint32 desHdr、
                              uint32通道)

       HWREG (emacBase + EMAC_TXHDP (CHANNEL))= desHdr;


    /**
     *\brief  API、用于写入 RX HDP 寄存器。 如果启用了接收、
     *         写入 RX HDP 将启用指向的数据接收
     *         相应的 RX 缓冲区描述符的缓冲区指针。
     *
     *\param  emacBase     Address of the EMAC Module Registers。\n
             RX 缓冲区描述符的*\param deschr 地址
     *\param  通道      编号
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_014 */
    /* DesignId:ETH_DesignId_014*/
    /*要求:HL_ETH_SR16 */
    void EMACRxHdrDescPtrWrite (uint32 emacBase、uint32 desHdr、uint32通道)

       HWREG (emacBase + EMAC_RXHDP (CHANNEL))= desHdr;


    /**
     *\brief  此 API 会初始化 EMAC 和 EMAC 控制模块。 。
     *         EMAC 控制模块复位、CPPI RAM 被清除。 此外、
     *         禁用所有中断。 此 API 不启用任何
     *         EMAC 中断或操作。
     *
     *\param  emacCtrlEMAC     控制模块的基本地址
     *                           寄存器。\n
     *\param  emacBase         address of the EMAC module registers
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_015 */
    /* DesignId:ETH_DesignId_015*/
    /*要求:HL_ETH_SR6 */
    空 EMACInit (uint32 emacCtrlBase、uint32 emacBase)

       uint32 cnt;

       /*重置 EMAC 控制模块。 这也会清除 CPPI RAM *
       HWREG (emacCtrlBase + EMAC_CTRL_SOFTRESET)= EMAC_CONTROL_RESET;

       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       while ((HWREG (emacCtrlBase + EMAC_CTRL_SOFTRESET)& EMAC_CONTROL_RESET)== EMAC_CONTROL_RESET)
       {
       }/*等待*/

       /*重置 EMAC 模块。 这也会清除 CPPI RAM *
       HWREG (emacBase + EMAC_SOFTRESET)= EMAC_SOFT_RESET;

       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       while ((HWREG (emacBase + EMAC_SOFTRESET)& EMAC_SOFT_RESET)== EMAC_SOFT_RESET)
       {
       }/*等待*/

       HWREG (emacBase + EMAC_MACCONTROL)= 0U;
       HWREG (emacBase + EMAC_RXCONTROL)= 0U;
       HWREG (emacBase + EMAC_TXCONTROL)= 0U;

       /*初始化所有头描述符指针寄存器*/
       for (cnt = 0U;cnt < EMAC_MAX_HEADER_DESC;cnt++)
       {
           HWREG (emacBase + EMAC_RXHDP (cnt))= 0U;
           HWREG (emacBase + EMAC_TXHDP (cnt))= 0U;
           HWREG (emacBase + EMAC_RXCP (cnt))= 0U;
           HWREG (emacBase + EMAC_TXCP (cnt))= 0U;
           HWREG (emacBase + EMAC_RXFREEBUFFER (cnt))= 0xFFU;
       }
       /*清除所有通道的中断使能*/
       HWREG (emacBase + EMAC_TXINTMASKCLEAR)= 0xFFU;
       HWREG (emacBase + EMAC_RXINTMASKCLEAR)= 0xFFU;

       HWREG (emacBase + EMAC_MACHASH1)= 0U;
       HWREG (emacBase + EMAC_MACHASH2)= 0U;

       HWREG (emacBase + EMAC_RXBUFFEROFFSET)= 0U;


    /**
     *\brief  设置 MACSRCADDR 寄存器中的 MAC 地址。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  macaddr      MAC 地址数组的起始地址。
     *                       array[0]应为 MAC 地址的 LSB
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_016 */
    /* DesignId:ETH_DesignId_016*/
    /*要求:HL_ETH_SR7 */
    空 EMACMACSrcAddrSet (uint32 emacBase、uint8 macaddr[6])

       HWREG (emacBase + EMAC_MACSRCADDRHI)=((uint32) macaddr[5U]|((uint32) macaddr[4U]<< 8U)
                                        |(((uint32) macaddr[3U]<< 16U)|((uint32) macaddr[2U]<< 24U);
       HWREG (emacBase + EMAC_MACSRCADDRLO)=((uint32) macaddr[1U]|((uint32) macaddr[0U]<< 8U);


    /**
     *\brief  设置 MACADDR 寄存器中的 MAC 地址。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号
     *\param  matchFilt    匹配或筛选器
     *\param  macaddr      MAC 地址数组的起始地址。
     *                       array[0]应为 MAC 地址的 LSB
     *         matchFilt 可以获取以下值\n
     *         EMAC_MACADDR_NO_MATH_NO_FILTER -地址不用于匹配
     *                                            或过滤传入数据包。 \n
     *         EMAC_MACADDR_FILTER -地址用于过滤传入的数据包\n
     *         EMAC_MACADDR_MATCH -地址用于匹配传入的数据包\n
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_017 */
    /* DesignId:ETH_DesignId_017*/
    /*要求:HL_ETH_SR7 */
    void EMACMACAddrSet (uint32 emacBase、uint32通道、uint8 macaddr[6]、uint32 matchFilt)

       HWREG (emacBase + EMAC_MACINDEX)=通道;

       HWREG (emacBase + EMAC_MACADDRHI)=((uint32) macaddr[5U]|((uint32) macaddr[4U]<< 8U)
                                        |(((uint32) macaddr[3U]<< 16U)|((uint32) macaddr[2U]<< 24U);
       HWREG (emacBase + EMAC_MACADDRLO)=((uint32) macaddr[1U]|((uint32) macaddr[0U]<< 8U)
                                        | matchFilt |(通道<< 16U));


    /**
     *\brief  确认一个处理到 EMAC 控制内核的中断。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  eoiFlag      用于确认 EMAC 控制的中断类型
                             *模块。
     *         eoiFlag 可以获取以下值\n
     *            EMAC_INT_CORE0_TX -内核0 TX 中断
     *            EMAC_INT_Core1_TX -内核1 TX 中断
     *            EMAC_INT_Core2_TX -内核2 TX 中断
     *            EMAC_INT_CORE0_RX -内核0 RX 中断
     *            EMAC_INT_Core1_RX -内核1 RX 中断
     *            EMAC_INT_Core_RX -内核2 RX 中断
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_018 */
    /* DesignId:ETH_DesignId_018*/
    /*要求:HL_ETH_SR15 */
    void EMACCoreIntAck (uint32 emacBase、uint32 eoiFlag)

       /*确认 EMAC 控制内核*/
       HWREG (emacBase + EMAC_MACEIVECTOR)= eoiFlag;


    /**
     *\brief  会写入特定通道的 TX 完成指针
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *\param  comPtr       要写入的完成指针值
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_019 */
    /* DesignId:ETH_DesignId_019*/
    /*要求:HL_ETH_SR27 */
    void EMACTxCPWrite (uint32 emacBase、uint32通道、uint32 comPtr)

       HWREG (emacBase + EMAC_TXCP (channel))= comPtr;


    /**
     *\brief  写入特定通道的 RX 完成指针
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *\param  comPtr       要写入的完成指针值
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_020 */
    /* DesignId:ETH_DesignId_020*/
    /*要求:HL_ETH_SR27 */
    void EMACRxCPWrite (uint32 emacBase、uint32通道、uint32 comPtr)

       HWREG (emacBase + EMAC_RXCP (channel))= comPtr;


    /**
     *\brief  使特定信道能够接收广播帧
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_021 */
    /* DesignId:ETH_DesignId_022*
    /*要求:HL_ETH_SR28 */
    void EMACRxBroadCastEnable (uint32 emacBase、uint32通道)

       HWREG (emacBase + EMAC_RXMBPENABLE)&=(~(uint32) EMAC_RXMBPENABLE_RXBROADCH);

       HWREG (emacBase + EMAC_RXMBPENABLE)|=((uint32) EMAC_RXMBPENABLE_RXBROADEN |((uint32)通道<<(uint32) EMAC_RXMBPENABLE_RXBROADCH_SHIFT);


    /**
     *\brief  禁用特定的信道以接收广播帧
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_022 */
    /* DesignId:ETH_DesignId_022*
    /*要求:HL_ETH_SR28 */
    void EMACRxBroadCastDisable (uint32 emacBase、uint32通道)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       HWREG (emacBase + EMAC_RXMBPENABLE)&=(~(uint32) EMAC_RXMBPENABLE_RXBROADCH);
       /*广播帧被过滤。 *
       HWREG (emacBase + EMAC_RXMBPENABLE)&=(~(uint32) EMAC_RXMBPENABLE_RXBROADEN);


    /**
     *\brief  使特定通道能够接收多播帧
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_023 */
    /* DesignId:ETH_DesignId_0223*/
    /*要求:HL_ETH_SR28 */
    void EMACRxMultiCastEnable (uint32 emacBase、uint32通道)

       HWREG (emacBase + EMAC_RXMBPENABLE)&=(~(uint32) EMAC_RXMBPENABLE_RXMULTCH);

       HWREG (emacBase + EMAC_RXMBPENABLE)|=((uint32) EMAC_RXMBPENABLE_RXMULTEN |(channel));


    /**
     *\brief  会禁用特定的信道以接收多播帧
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_024 */
    /* DesignId:ETH_DesignId_024*/
    /*要求:HL_ETH_SR28 */
    void EMACRxMultiCastDisable (uint32 emacBase、uint32通道)

       HWREG (emacBase + EMAC_RXMBPENABLE)&=(~(uint32) EMAC_RXMBPENABLE_RXMULTCH);

       HWREG (emacBase + EMAC_RXMBPENABLE)&=(~(UINT32) EMAC_RXMBPENABLE_RXMULTEN);


    /**
     *\brief  启用特定信道的单播
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_025 */
    /* DesignId:ETH_DesignId_025*/
    /*要求:HL_ETH_SR14 */
    void EMACRxUnicastSet (uint32 emacBase、uint32通道)

       HWREG (emacBase + EMAC_RXUNCASTSET)|=((uint32) 1U <<通道);


    /**
     *\brief  禁用特定信道的单播
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_026 */
    /* DesignId:ETH_DesignId_0226*/
    /*要求:HL_ETH_SR14 */
    void EMACRxUnicastClear (uint32 emacBase、uint32通道)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       HWREG (emacBase + EMAC_RXUNCASTCLEAR)|=((uint32) 1U <<通道);



    /**
     *\brief  设置特定信道的可用缓冲区
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *\param  nBuf         可用缓冲区的数量
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_027 */
    /* DesignId:ETH_DesignId_0227*/
    /*要求:HL_ETH_SR20 */
    void EMACNumFreeBufSet (uint32 emacBase、uint32通道、
                          uint32 nBuf)

       HWREG (emacBase + EMAC_RXFREEBUFFER (CHANNEL))= nBuf;


    /**
     *\brief  获取挂起的 EMAC 中断向量
     *
     *\param  emacBase     Address of the EMAC module registers。
     *
     *\返回 向量
     *
     **/
    /* sourceId:ETH_sourceId_028 */
    /* DesignId:ETH_DesignId_0228*/
    /*要求:HL_ETH_SR15 */
    UINT32 EMACIntVectorGet (UINT32 emacBase)

       返回(HWREG (emacBase + EMAC_MACINVECTOR));




    /**
    *用于设置接口内的实例参数的函数
    *@param  hdkif 网络接口结构
    *@返回 无。
    *
    /* sourceId:ETH_sourceId_029 */
    /* DesignId:ETH_DesignId_029*/
    /*要求:HL_ETH_SR6 */
    void EMACInstConfig (hdkif_t * hdkif)

       hdkif->EMAC_BASE = EMAC_0_BASE;
       hdkif->EMAC_CTRL_base = EMAC_CTRL_0_BASE;
       hdkif->EMAC_CTRL_ram = EMAC_CTRL_RAM_0_BASE;
       hdkif->MDIO_base = MDIO_base;
       hdkif->phy_addr = 1U;
       /*(MISRA-C:2004 10.1/R) Code Composer Studio MISRA 校验器报告了 MISRA 错误。  *
       hdkif->phy_AutoNeg =&Dp83640自动协商;
       hdkif->phy_partnerability =&Dp83640 PartnerAbilityGet;


    /**
    用于设置链接的*函数。 与链路的物理层自动协商
    *使用自动协商的结果设置 EMAC。
    *@param hdkif 网络接口结构。
    *@如果所有内容都通过、则返回 ERR_OK
    *        如果未通过、则为其他
    *
    /* sourceId:ETH_sourceId_030 */
    /* DesignId:ETH_DesignId_030*/
    /*要求:HL_ETH_SR6 */
    uint32 EMACLinkSetup (hdkif_t * hdkif){
     uint32 linkstat = EMAC_ERR_CONNECT;
     uint16 partnr_ablty = 0U;
     uint32 phyduplex = emac_duplex_half;
     易失性 uint32延迟= 0xFFFFFFU;

       if (Dp83640自动协商(((uint32) hdkif->mdio_BASE、(uint32) hdkif->phy_addr、
                                (uint16)((uint16) DP83640_100BTX |(uint16) DP83640_100BTX_FD
                                 |(uint16) DP83640_10BT |(uint16) DP83640_10BT_FD)= true){
         linkstat = EMAC_ERR_OK;
         /*(MISRA-C:2004 10.1/R) Code Composer Studio MISRA 校验器报告了 MISRA 错误(由于使用&?)  *
         (空) Dp83640 PartnerAbilityGet (hdkif->MDIO_base、hdkif->phy_addr、
                                   partnr_ablty (&P);

         /*检查100Mbps 和双工功能*/
         if ((partnr_ablty 和 DP83640_100BTX_FD)!= 0U){
           phyduplex = EMAC_duplex_full;
         }
       }


     否则{
       linkstat = EMAC_ERR_CONNECT;
     }

     /*如果 EMAC 成功,则使用协商结果设置它*/
     if (linkstat =EMAC_ERR_OK){
       EMACDuplexSet (hdkif->EMAC_BASE、phyduplex);
     }

     /*等待 MII 稳定*/
     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
     while (延迟!= 0U)
     {
       延迟;
     }

     返回 linkstat;


    /**
     *\brief  执行发送队列拆卸,也就是说,传输被中止。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_031 */
    /* DesignId:ETH_DesignId_033*/
    /*要求:HL_ETH_SR22 */
    void EMACTxTeardown (uint32 emacBase、uint32通道)

       HWREG (emacBase + EMAC_TXTEARDOWN)&&(通道);


    /**
     *\brief  执行接收队列拆卸,也就是说,接收已中止。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_032 */
    /* DesignId:ETH_DesignId_032*
    /*要求:HL_ETH_SR22 */
    void EMACRxTeardown (uint32 emacBase、uint32通道)

       HWREG (emacBase + EMAC_RXTEARDOWN)&&(通道);



    /**
     *\brief  使用 MAC 哈希寄存器执行多播帧过滤。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  hashtable    指定要接受哪些位的 hash 表。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_033 */
    /* DesignId:ETH_DesignId_033*/
    /*要求:HL_ETH_SR24 */
    void EMACFrameSelect (uint32 emacBase、uint64主题表)

       HWREG (emacBase + EMAC_MACHASH1)=(uint32)(井号和0xFFFFFFU);
       HWREG (emacBase + EMAC_MACHASH2)=(uint32)(主题表>> 32U);



    /**
     *\brief  在 MACCONTROL 寄存器中设置发送队列优先级类型
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  txPType      传输队列优先级类型。
     *                       0导致使用循环方案选择下一个通道、而1结果
     *                       在固定优先级方案中(通道7的最高优先级)。
     *
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_034 */
    /* DesignId:ETH_DesignId_0334*/
    /*要求:HL_ETH_SR25 */
    void EMACTxPrioritySelect (uint32 emacBase、uint32 txPType)


       /* 1-队列使用固定优先级(通道7最高优先级)方案*/
       if (txPType == 1U)
       {
           HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32)(EMAC_MACCONTROL_TXPTYPE));
           HWREG (emacBase + EMAC_MACCONTROL)|= EMAC_MACCONTROL_TXPTYPE;
       }
       其他
       {
           HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32)(EMAC_MACCONTROL_TXPTYPE));
       }



    /**
     *\brief  执行 EMAC 和 EMAC 控制模块的软复位。
     *
     *\param  emacCtrlEMAC 控制模块寄存器的基地址
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_035 */
    /* DesignId:ETH_DesignId_035*/
    /*要求:HL_ETH_SR26 */
    空 EMACSoftReset (UINT32 emacCtrlBase、UINT32 emacBase)

       /*重置 EMAC 控制模块。 这也会清除 CPPI RAM *
       HWREG (emacCtrlBase + EMAC_CTRL_SOFTRESET)= EMAC_CONTROL_RESET;

       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       while ((HWREG (emacCtrlBase + EMAC_CTRL_SOFTRESET)& EMAC_CONTROL_RESET)== EMAC_CONTROL_RESET)
       {
           /*等待重置完成*/
       }

       /*重置 EMAC 模块。 *
       HWREG (emacBase + EMAC_SOFTRESET)= EMAC_SOFT_RESET;

       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       while ((HWREG (emacBase + EMAC_SOFTRESET)& EMAC_SOFT_RESET)== EMAC_SOFT_RESET)
       {
           /*等待重置完成*/
       }



    /**
     *\brief  启用 EMAC 模块的空闲状态。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_036 */
    /* DesignId:ETH_DesignId_0360*/
    /*要求:HL_ETH_SR32 */
    空 EMACEnableIdleState (uint32 emacBase)

           HWREG (emacBase + EMAC_MACCONTROL)|= EMAC_MACCONTROL_CMDIDLE;


    /**
     *\brief  禁用 EMAC 模块的空闲状态。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_037 */
    /* DesignId:ETH_DesignId_037 */
    /*要求:HL_ETH_SR32 */
    空 EMACDisableIdleState (uint32 emacBase)

           HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32)(EMAC_MACCONTROL_CMDIDLE));


    /**
     *\brief  启用环回模式。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_038 */
    /* DesignId:ETH_DesignId_038*/
    /*要求:HL_ETH_SR50 */
    void EMACEnableLoopback (uint32 emacBase)
    /*SAFETYMCUSW 1 J MR:14.1 "LDRA 工具问题。" *

       uint32 GMIIENval=0U;
       /*将 GMIIEN 位的值置为有效前*
       GMIIENval = HWREG (emacBase + EMAC_MACCONTROL)和 EMAC_MACCONTROL_GMIIEN;
       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_GMIIEN);

       /*启用环回*/
       HWREG (emacBase + EMAC_MACCONTROL)|= EMAC_MACCONTROL_LOOPACK;

       /*恢复 GMIIEN 位的值*/
       HWREG (emacBase + EMAC_MACCONTROL)|= GMIIENval;


    /**
     *\brief  禁用环回模式。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_039 */
    /* DesignId:ETH_DesignId_039*/
    /*要求:HL_ETH_SR50 */
    void EMACDisableLoopback (uint32 emacBase)

       uint32 GMIIENval=0U;

       /*将 GMIIEN 位的值置为有效前*
       GMIIENval = HWREG (emacBase + EMAC_MACCONTROL)和 EMAC_MACCONTROL_GMIIEN;
       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_GMIIEN);

       /*禁用环回*/
       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_LOOPACK);

       /*恢复 GMIIEN 位的值*/
       HWREG (emacBase + EMAC_MACCONTROL)|= GMIIENval;


    /**
     *\brief  启用传输流控制。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_040 */
    /* DesignId:ETH_DesignId_040*/
    /*要求:HL_ETH_SR20 */
    空 EMACTxFlowControlEnable (uint32 emacBase)

       HWREG (emacBase + EMAC_MACCONTROL)|= EMAC_MACCONTROL_TXFLOWEN;


    /**
     *\brief  禁用传输流控制。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_041 */
    /* DesignId:ETH_DesignId_041*/
    /*要求:HL_ETH_SR20 */
    空 EMACTxFlowControlDisable (uint32 emacBase)

       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_TXFLOWEN);


    /**
     *\brief  启用接收流控制。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_042 */
    /* DesignId:ETH_DesignId_042*/
    /*要求:HL_ETH_SR20 */
    空 EMACRxFlowControlEnable (uint32 emacBase)

       HWREG (emacBase + EMAC_MACCONTROL)|= EMAC_MACCONTROL_RXBUFFERFLOWEN;


    /**
     *\brief  禁用接收流控制。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_043 */
    /* DesignId:ETH_DesignId_043*/
    /*要求:HL_ETH_SR20 */
    空 EMACRxFlowControlDisable (uint32 emacBase)

       HWREG (emacBase + EMAC_MACCONTROL)&=(~(uint32) EMAC_MACCONTROL_RXBUFFERFLOWEN);


    /**
     *\brief  接收流量阈值。 这些位包含对通道 n 的传入帧(启用时)发出流控制的阈值。
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号
     针对      给定通道的传入帧发出流控制的*\param 阈值
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_044 */
    /* DesignId:ETH_DesignId_044*/
    /*要求:HL_ETH_SR20 */
    void EMACRxSetFlowThreshold (uint32 emacBase、uint32通道、uint32阈值)

       HWREG (emacBase + EMAC_RXFLOWTHRESH (通道))&=(0x0U);
       HWREG (emacBase + EMAC_RXFLOWTHRESH (CHANNEL))|=阈值;


    /**
     *\brief              此函数读取模块中存在的36个网络统计信息寄存器的内容。
     *\param  emacBase   Address of the EMAC module registers。
     *\param  statRegNo  RXGOODFRAMES (偏移= 0x200)为0时寄存器的编号。 有关寄存器列表及其内容、请参阅《技术参考手册》。
     *\return uint32
     **/
    /* sourceId:ETH_sourceId_045 */
    /* DesignId:ETH_DesignId_045*/
    /*要求:HL_ETH_SR29 */
    UINT32 EMACReadNetStatRegisters (UINT32 emacBase、UINT32 statRegNo)

       返回 HWREG (emacBase + EMAC_NETSTATREGS (statRegNo));



    /**
     *\brief  功能、用于读取发送中断状态寄存器(TXINTSTATMASKED 和 TXINTSTATRAW)的值
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号
     *\param  txintstat    指向将存储已读取寄存器值的 EMAC_TX_INT_STATUS 结构的指针
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_046 */
    /* DesignId:ETH_DesignId_046*/
    /*要求:HL_ETH_SR23 */
    void EMACTxIntStat (uint32 emacBase、uint32通道、emac_tx_int_status_t * txintstat)

       txintstat->intstatmasked=(HWREG (emacBase + EMAC_TXINTSTATMASKED)&((UINT32) 1U <<通道));
       txintstat->intstatraw =(HWREG (emacBase + EMAC_TXINTSTATRAW)&((uint32) 1U <<通道);



    /**
     *\brief  功能、用于读取接收中断状态寄存器(RXINTSTATMASKED、RXINTSTATRAW)的值
     *
     *\param  emacBase     Address of the EMAC module registers。
     *\param  通道      编号
     *\param rxintstat     指向将存储已读取寄存器值的 EMAC_Rx_int_status 结构的指针。
     *\返回 无
     **/
    /* sourceId:ETH_sourceId_047 */
    /* DesignId:ETH_DesignId_047*/
    /*要求:HL_ETH_SR23 */
    void EMACRxIntStat (uint32 emacBase、uint32通道、emac_rx_int_status_t * rxintstat)

       rxintstat->intstatmasked_pend =(HWREG (emacBase + EMAC_RXINTSTATMASKED)&((UINT32) 0x1U <<(uint32)(channel))));
       rxintstat->intstatmasked_therhpend =(HWREG (emacBase + EMAC_RXINTSTATMASKED)&((uint32) 0x1U <<((uint32) 0x8U +(uint32)(channel)))));

       rxintstat->intstatraW_PEND =(HWREG (emacBase + EMAC_RXINTSTATRAW)&((UINT32) 0x1U <<(UINT32)(CHANNEL)));
       rxintstat->intstatraW_therhpend =(HWREG (emacBase + EMAC_RXINTSTATW)&((UINT32) 0x1U <<((UINT32) 0x8U +(UINT32)(CHANNEL)))));



    /**
     *\brief  Tx 和 Rx 缓冲区描述符被初始化。 缓冲区指针被分配给 Rx 描述符。
     *
     *\param  hdkif  网络接口结构
     *\返回 无
     *
     **/
    /* sourceId:ETH_sourceId_048 */
    /* DesignId:ETH_DesignId_048 */
    /*要求:HL_ETH_SR17、HL_ETH_SR30 *
    void EMACDMAInit (hdkif_t * hdkif)


         uint32 num_BD、pbuf_cnt = 0U;
         volatile EMAC_TX_BD_t * CURR_Txbd、* LAST_Txbd;
         volatile EMAC_Rx_BD_t * CURR_BD、* LAST_BD;
         txch_t *txch_dma;
         rxch_t * rxch_dma;
         uint8_t *p;

         txch_dma =&(hdkif->txchptr);

         /**
         *初始化 TX 和 RX 的描述符内存
         * TX 和 RX 仅支持单通道
         *
         /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         txch_dma->free_head =(volatile EMAC_TX_BD_t*)(hdkif->EMAC_CTRL_ram);
         txch_dma->next _BD_TO_Process = txch_dma->free_head;
         txch_dma->active_tail =空;

         /*设置通道的描述符数量*/
         num_BD =(size_EMAC_CTRL_RAM >> 1U)/ sizeof (EMAC_TX_BD_t);

         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         CURR_Txbd = txch_dma->free_head;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
         LAST_Txbd = CURR_Txbd;

         /*初始化所有 TX 缓冲区描述符*/
         while (num_BD!= 0U){
           /*SAFETYMCUSW 567 S MR:17.1,17.4 "用于链接列表的结构指针递增。" *
           CURR_Txbd->NEXT = CURR_Txbd + 1U;
           /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
           CURR_Txbd->flags_pktlen = 0U;
           /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
           LAST_Txbd = CURR_Txbd;
           /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
           CURR_Txbd = CURR_Txbd-->下一步;
           num_BD--;
         }
         /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
         LAST_Txbd->NEXT = txch_dma->free_head;

         /*初始化 RX 通道的描述符*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         rxch_dma =&(hdkif->rxchptr);
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         /*SAFETYMCUSW 567 S MR:17.1,17.4 "用于链接列表的结构指针递增。" *
         CURR_Txbd++;
         /*SAFETYMCUSW 94 S MR:11.1、11.2、11.4 "需要分配链接列表指针。" *
         /*SAFETYMCUSW 95 S MR:11.1、11.4 "需要分配链接列表指针。" *
         /*SAFETYMCUSW 344 S MR:11.5 "链接列表指针需要分配给不同的结构。" *      
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         rxch_dma->active_head =(volatile EMAC_Rx_BD_t *) CURR_Txbd;

         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/         
         rxch_dma->free_head =空;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
         CURR_BD = rxch_dma->ACTIVE_HEAD;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
         LAST_BD = CURR_BD;


         /*
         ** 由 MAX_RX_PBUF_ALLOC 指定的特定数量的数据包缓冲区的静态分配,用户在 HALCoGen GUI 中输入其值。
         *

         /* pbufs 分配的注释部分需要检查其是否为 true*/

         for (pbuf_cnt = 0U;pbuf_cnt < MAX_RX_PBUF_ALLOC;pbuf_cnt++)
           {
            /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/  
            p = pbuf_array[pbuf_cnt];
            /*SAFETYMCUSW 439 S MR:11.3 " RHS 是需要存储的指针值。 -根据 MISRA"*进行咨询
            /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
            CURR_BD->bufptr =(uint32) p;
            /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/  
            CURR_BD->bufoff_len = MAX_TRANSF_UNIT;
            /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
            CURR_BD->FLAGS_pktlen = EMAC_BUF_DESC_ONER;
            IF (pbuf_cnt =(MAX_RX_PBUF_ALLOC - 1U))
            {
                /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/  
                CURR_BD->NEXT =空;
                /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/              
                LAST_BD = CURR_BD;

            }
            其他
            {
                /*SAFETYMCUSW 567 S MR:17.1,17.4 "用于链接列表的结构指针递增。" *
                CURR_BD->NEXT =(CURR_BD + 1U);
                /*SAFETYMCUSW 567 S MR:17.1,17.4 "用于链接列表的结构指针递增。" *
                CURR_BD++;
                /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/  
                LAST_BD = CURR_BD;
            }
          }
         
         /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/         
         LAST_BD->NEXT =空;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
         rxch_dma->active_tail = last_bd;



    /**
     *\brief  初始化 EMAC 模块以进行传输和接收。
     *
     *\param  macaddr   模块的 MAC 地址。
     *\param  通道      编号。
     *
     *\return EMAC_ERR_OK (如果一切都已初始化)
     *         在连接错误的情况下为 EMAC_ERR_CONN。
     *
     **/
    /* sourceId:ETH_sourceId_049 */
    /* DesignId:ETH_DesignId_049*/
    /*要求:HL_ETH_SR6 */
    uint32 emACHWInit (uint8_t macaddr[6U])

     uint32 temp、通道;
     volatile uint32 phyID=0U;
     易失性 UINT32延迟= 0xFFFU;
     uint32 phyIdReadCount = 0xFFFFFFU;
     易失性 UINT32 phyLinkRetries = 0xFFFFFFU;
     hdkif_t *hdkif;
     rxch_t * rxch;
     uint32 RetVal = EMAC_ERR_OK;
     uint32 emacBase = 0U;
    #if (EMAC_MII_ENABLE = 0U)
     uint16 partnr_spd;
    #endif

     hdkif =&hdkif_data[0U];
     EMACInstConfig (hdkif);
     /*设置 MAC 硬件地址*/
     对于(temp = 0U;temp < EMAC_HWADDR_LEN;temp++){
       hdkif->mac_addr[temp]= macaddr[(EMAC_HWADDR_LEN - 1U)- temp];
     }
     /*初始化 EMAC、EMAC 控制和 MDIO 模块。 *
     EMACInit (hdkif->EMAC_Ctrl_BASE、hdkif->EMAC_BASE);
     MDIOInit (hdkif->MDIO_base、MDIO_FREQ_INPUT、MDIO_FREQ_OUTPUT);
     
     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
     while (延迟!= 0U)
     {
     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       延迟;
     }

     /*在 EMAC 硬件中设置 MAC 地址*/
     emacBase = hdkif->EMAC_BASE;/* MISRA 代码修复(12.2)*/
     EMACMACSrcAddrSet (emacBase、hdkif->mac_addr);
     对于(通道= 0U;通道< 8U;通道++){
          emacBase = hdkif->EMAC_BASE;
          EMACMACAddrSet (emacBase、 (uint32) EMAC_CHANNELNUMBER、hdkif->mac_addr、EMAC_MACADDR_MATCH);
     }

     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
     while ((phyID = 0U)&&(phyIdReadCount > 0U)){
         phyID = Dp83640IDGet (hdkif->mdio_BASE、hdkif->phy_addr);
         phyIdReadCount--;
     }

     如果(0U = phyID){
         RetVal = EMAC_ERR_CONNECT;
     }否则{

     }

     if ((uint32) 0U =((MDIOPhyAliveStatusGet (hdkif->MDIO_base))
           >> hdkif->phy_addr)&(uint32) 0x01U){
       RetVal = EMAC_ERR_CONNECT;
     }否则{

     }

    #if (EMAC_MII_ENABLE = 0U)
        
       Dp83640PartnerSpdGet (hdkif->mdio_BASE、hdkif->phy_addr、&partnr_spd);
       if ((partnr_spd 和2U)=0U)
       {
          EMACRMIISpeedSet (hdkif->EMAC_BASE、EMAC_MACCONTROL_RMIISPEED);
       }
    #endif

     if (!Dp83640LinkStatusGet (hdkif->MDIO_base、(uint32) EMAC_PHYADDRESS、(uint32) phyLinkRetries)){
         RetVal = EMAC_ERR_CONNECT;
     }否则{

     }

     if (EMACLinkSetup (hdkif)!= EMAC_ERR_OK){
       RetVal = EMAC_ERR_CONNECT;
     }否则{

     }

     //此处初始化发送和接收缓冲区描述符。
      *此外、数据包缓冲区被分配给接收缓冲区描述符。
      *

     EMACDMAInit (hdkif);

     /*确认接收和发送中断以实现正确的中断脉冲*/
     EMACCoreIntAck (hdkif->EMAC_BASE、(uint32) EMAC_INT_CORE0_RX);
     EMACCoreIntAck (hdkif->EMAC_BASE、(uint32) EMAC_INT_CORE0_TX);

     /*启用 MACCONTROL Rgister 中的 GMII 位*/
     /*SAFETYMCUSW 139 S MR:13.7 "参数作为来自 GUI 的输入。" *
     EMACMIIEnable (hdkif->EMAC_BASE);

     /*如果在 GUI 中启用了广播,则启用广播。 *
     /*SAFETYMCUSW 139 S MR:13.7 "参数作为来自 GUI 的输入。" *
    #if (EMAC_broadcast_enable)
         EMACRxBroadCastEnable (hdkif->EMAC_BASE、(uint32) EMAC_CHANNELNUMBER);
    其他
      /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *
      /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *
         EMACRxBroadCastDisable (hdkif->EMAC_BASE、(uint32) EMAC_CHANNELNUMBER);
    #endif
     
     /*如果在 GUI 中启用了广播,则启用广播。 *
     /*SAFETYMCUSW 139 S MR:13.7 "参数作为来自 GUI 的输入。" *
    #if (EMAC_unicast_enable)
         EMACRxUnicastSet (hdkif->EMAC_BASE、(uint32) EMAC_CHANNELNUMBER);
    其他
         /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *
         EMACRxUnicastClear (hdkif->EMAC_BASE、(uint32) EMAC_CHANNELNUMBER);
    #endif

     /*根据 GUI 输入启用全双工或半双工模式。 *
     /*SAFETYMCUSW 139 S MR:13.7 "参数作为来自 GUI 的输入。" *
    #if (EMAC_FULL_DUPLEX)
           EMACDuplexSet (EMAC_0_BASE、(uint32) EMAC_DUPLEX 全双工);
    其他
           /*SAFETYMCUSW 1 J MR:14.1 '如果条件电表被用作 GUI 的输入。' *
           EMACDuplexSet (EMAC_0_BASE、(uint32) EMAC_DUPLEX 半双工);
    #endif

     /*启用基于 GUI 输入的环回*/
     /*SAFETYMCUSW 139 S MR:13.7 "参数作为来自 GUI 的输入。" *
    #if (EMAC_LOOP_ENABLE)
         EMACEnableLoopback (hdkif->EMAC_BASE);
    其他
         /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *  
         EMACDisableLoopback (hdkif->EMAC_BASE);
    #endif

     /*启用发送和发送中断*/
     /*SAFETYMCUSW 139 S MR:13.7 "参数作为来自 GUI 的输入。" *
    #if (EMAC_TX_ENABLE)
         EMACTxEnable (hdkif->EMAC_BASE);
         EMACTxIntPulseEnable (hdkif->EMAC_BASE、hdkif->EMAC_Ctrl_BASE、0x00、(uint32) EMAC_CHANNELNUMBER);
    其他
         /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *
         /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *
         EMACTxDisable (hdkif->EMAC_BASE);
         EMACTxIntPulseDisable (hdkif->EMAC_BASE、hdkif->EMAC_Ctrl_BASE、0x00、(uint32) EMAC_CHANNELNUMBER);
    #endif

     /*启用接收和接收中断。 然后通过写入 HDP 寄存器开始接收。 *
     /*SAFETYMCUSW 139 S MR:13.7 "参数作为来自 GUI 的输入。" *
    #if (EMAC_RX_ENABLE)
         EMACNumFreeBufSet (hdkif->EMAC_BASE、(uint32) EMAC_CHANNELNUMBER、(uint32) MAX_RX_PBUF_ALLOC);
         EMACRxEnable (hdkif->EMAC_BASE);
         EMACRxIntPulseEnable (hdkif->EMAC_BASE、hdkif->EMAC_Ctrl_BASE、0x00、(uint32) EMAC_CHANNELNUMBER);
         rxch =&(hdkif->rxchptr);
         /*针对通道0写入 RX HDP */
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         EMACRxHdrDescPtrWrite (hdkif->EMAC_BASE、(uint32) rxch->ACTIVE_HEAD、(uint32) EMAC_CHANNELNUMBER);
    其他
         /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *    
         /*SAFETYMCUSW 1 J MR:14.1 '如果条件参数被用作来自 GUI 的输入。' *  
         EMACRxDisable (hdkif->EMAC_BASE);
         EMACRxIntPulseDisable (hdkif->EMAC_BASE、hdkif->EMAC_Ctrl_BASE、0x00、(uint32) EMAC_CHANNELNUMBER);
    #endif

     返回 RetVal;



    /**
     *此函数应执行数据包的实际传输。 数据包是
     *包含在传递给函数的 pbuf 中。 这个 pbuf 可能是
     *已链接。 也就是说、一个 pbuf 可以跨越多个 TX 缓冲区描述符
     *
     *@param hdkif 网络接口结构
     *@param pbuf 包含使用 EMAC 发送的数据的 pbuf 结构
     *@返回布尔值。
     *       -如果传递 Null 指针进行传输则返回 false
     *       -如果发送和传输了有效数据、则返回 true。
     *
    /* sourceId:ETH_sourceId_050 */
    /* DesignId:ETH_DesignId_050*/
    /*要求:HL_ETH_SR31 */
    布尔 EMACTransmit (hdkif_t * hdkif、pbuf_t * pbuf)

       
     txch_t *txch;
     pbuf_t *q;
     uint16 totlen;
     uint16 qLen;
     volatile EMAC_TX_BD_t * CURR_BD、* ACTIVE_HEAD、* BD_END;
     布尔 retValue = false;
     if ((pbuf!= NULL)&&(hdkif!= NULL))
     {
     txch =&(hdkif->txchptr);

     /*获取可自由传输的缓冲区描述符*/
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     CURR_BD = txch->FREE_HEAD;
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     BD_END = CURR_BD;
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     ACTIVE_HEAD = CURR_BD;

     /*更新总数据包长度*/
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/       
     CURR_BD->FLAGS_pktlen &=(~((UINT32) 0xFFFFFFU));
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     totLen = pbuf->tut_len;
     CURR_BD->FLAGS_pktlen |=(uint32)(totLen);

     /*表示数据包的开始*/
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     CURR_BD->FLAGS_pktlen |=(EMAC_BUF_DESC_SOP | EMAC_BUF_DESC_ONER);


     /*将 pbuf 信息复制到 TX 缓冲区描述符中*/
       q = pbuf;
       while (q!= NULL)
       {
       /*初始化缓冲区指针和长度*/
       /*SAFETYMCUSW 439 S MR:11.3 " RHS 是需要存储的指针值。 -根据 MISRA"*进行咨询
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       CURR_BD->bufptr =(UINT32)(q->PAYLOAD);
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
       qlen = q->len;
       CURR_BD->bufoff_len =((uint32)(qLen)& 0xFFFFFFU);
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       BD_END = CURR_BD;
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       CURR_BD = CURR_BD->下一步;
       q = q->next;
       }


     /*表示数据包的开始和结束*/
     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/       
     bd_end->next = NULL;
     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
     bd_end->flags_pktlen |= EMAC_BUF_DESC_EOP;

     /*SAFETYMCUSW 71 S MR:17.6 "指定的指针值具有所需的范围。" *
     txch->free_head = CURR_BD;

     /*首次用填充的 BD 写入 HDP */
     if (txch->active_tail =NULL){
       /*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       EMACTxHdrDescPtrWrite (hdkif->EMAC_BASE、(uint32)(ACTIVE_HEAD)、(uint32) EMAC_CHANNELNUMBER);
     }

     /*
      *将 BD 连接起来。 如果 DMA 引擎已经到达链的末尾、
      *将设置 EOQ。 在这种情况下、应再次写入 HDP。
      *
     否则{
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       CURR_BD = txch->ACTIVE_TAIL;
       /*等待 EOQ 位被置位*/
       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       while (EMAC_BUF_DESC_EOQ!=(CURR_BD->FLAGS_pktlen & EMAC_BUF_DESC_EOQ))
       {
       }
       /*在 TXHDP0变为零之前不要写入它*/
       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       while ((((uint32) 0U!=*((uint32 *) 0xFCF78600U)))
       {
       }
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       CURR_BD->NEXT = ACTIVE_HEAD;
       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       if (EMAC_BUF_DESC_EOQ =>(CURR_BD->FLAGS_pktlen & EMAC_BUF_DESC_EOQ)){
         /*写入标头描述符指针并启动 DMA */
         /*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
         EMACTxHdrDescPtrWrite (hdkif->EMAC_BASE、(uint32)(ACTIVE_HEAD)、(uint32) EMAC_CHANNELNUMBER);
       }
     }
      
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     txch->active_tail = bd_end;
     retValue = true;
     }
     其他
     {
       retValue = false;
     }
     返回 retValue;



    /**
     用于处理 Tx 缓冲区描述符的*函数。
     *
     *@param hdkif 接口结构
     *@返回无
     *
    /* sourceId:ETH_sourceId_051 */
    /* DesignId:ETH_DesignId_051*/
    /*要求:HL_ETH_SR15 */
    void EMACTxIntHandler (hdkif_t * hdkif)

     txch_t * txch_int;
     volatile EMAC_TX_BD_t * CURR_BD、* NEW_BD_TO_PROCESS;

     txch_int =&(hdkif->txchptr);

     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/        
     next _BD_TO_Process = txch_int->next _BD_TO_Process;
     
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/        
     CURR_BD = NEW_BD_TO_PROCESS;

     /*检查数据包的正确起始位置*/
     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/        
     while ((((CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_SOP)== EMAC_BUF_DESC_SOP){

       /*确保传输已通过*/
       /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       while (((CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_ONER)== EMAC_BUF_DESC_ONER)
       {
       }

       /*到达数据包末尾之前的横移*/
       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       while (((CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_EOP)!= EMAC_BUF_DESC_EOP){
          CURR_BD = CURR_BD->下一步;
       }

       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       NEW_BD_TO_PROCESSORT->FLAGS_pktlen &=~(EMAC_BUF_DESC_SOP);
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       CURR_BD->FLAGS_pktlen &=~(EMAC_BUF_DESC_EOP);

       /**
        *如果没有更多数据被发送、则下一个中断
        *应与 FREE_HEAD 关联的 pbuf 发生
        *
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
       if (CURR_BD->NEXT == NULL){
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/        
         txch_int->next _BD_TO_Process = txch_int->free_head;
       }

       否则{
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/        
         txch_int->next _BD_TO_Process = CURR_BD->NEXT;
       }

       /*确认 EMAC 并释放相应的 pbuf */
       /*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       /*SAFETYMCUSW 344 S MR:11.5 "存储在指针中的地址作为 int 参数传递。" *
       EMACTxCPWrite (hdkif->EMAC_BASE、(uint32) EMAC_CHANNELNUMBER、(uint32) CURR_BD;
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       next _BD_TO_Process = txch_int->next _BD_TO_Process;
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       CURR_BD = NEW_BD_TO_PROCESS;

     }




    /**
     用于处理接收到的数据包的*函数。
     *
     *@param hdkif 接口结构
     *@返回无
     *
    /* sourceId:ETH_sourceId_052 */
    /* DesignId:ETH_DesignId_052*/
    /*要求:HL_ETH_SR31 */
    void EMACReceive(hdkif_t *hdkif)

     rxch_t * rxch_int;
     volatile EMAC_Rx_BD_t * CURR_BD、* CURR_TAIL、* LAST_BD;

     /*保存特定接收通道数据的接收结构*/
     rxch_int =&(hdkif->rxchptr);

     /*获取包含最早填充数据的缓冲区描述符*/
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     CURR_BD = rxch_int->ACTIVE_HEAD;
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     last_bd = rxch_int->active_tail;

     /**
      *只要数据可用、就处理描述符
      *当 DMA 接收数据时、将设置 SOP 标志
     *
     /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
     /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
     /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
     while (((CURR_BD->FLAGS_pktlen & EMAC_BUF_DESC_SOP)=EMAC_BUF_DESC_SOP){


       /*加载数据包后开始处理*/
       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       if ((CURR_BD->FLAGS_pktlen 和 EMAC_BUF_DESC_ONER)
          != EMAC_BUF_DESC_ONER){

         /*此 BD 链将在处理后释放*/
         /*SAFETYMCUSW 71 S MR:17.6 "指定的指针值具有所需的范围。" *
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
         rxch_int->free_head = CURR_BD;

         /*获取数据包的总长度。 CURR_BD 指向起点
          数据包的*。
          *

         /*
          *循环运行直至到达数据包末尾。
          *
         /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
         while (((CURR_BD->FLAGS_pktlen 和 EMAC_BUF_DESC_EOP)!= EMAC_BUF_DESC_EOP)
         {
           /*再次更新描述符的标志和缓冲区的长度*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           CURR_BD->FLAGS_pktlen =(uint32) EMAC_BUF_DESC_OWNER;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           CURR_BD->bufoff_len =(uint32) MAX_TRANSF_UNIT;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           LAST_BD = CURR_BD;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           CURR_BD = CURR_BD->下一步;
         }

         /*更新最后一个描述符(包含 EOP 标志)*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/          
           CURR_BD->FLAGS_pktlen =(uint32) EMAC_BUF_DESC_OWNER;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           CURR_BD->bufoff_len =(uint32) MAX_TRANSF_UNIT;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           LAST_BD = CURR_BD;
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           CURR_BD = CURR_BD->下一步;

         /*确认该数据包已被处理*/
         /*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         EMACRxCPWrite (hdkif->EMAC_BASE、(uint32) EMAC_CHANNELNUMBER、(uint32) LAST_BD);

         /*下一个缓冲区描述符是链接列表的新头。 *
         /*SAFETYMCUSW 71 S MR:17.6 "指定的指针值具有所需的范围。" *
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         rxch_int->active_head = CURR_BD;

         /*已处理的描述符现在是链接列表的尾部。 *
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         CURR_TAIL = rxch_int->ACTIVE_TAIL;
       /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         CURR_TAIL->NEXT = rxch_int->FREE_HEAD;

         /*已处理的 Rx 描述符链中的最后一个元素现在是列表的末尾。 *
         /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/     
         LAST_BD->NEXT =空;


           /**
            *检查接收是否已结束。 如果 EOQ 标志被置位、则为 NULL
            *指针由 DMA 引擎获取。 因此、我们需要写入 RX HDP
            *与下一个描述符。
            *
           /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
           /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
         /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/            
           if (((CURR_TAIL->FLAGS_pktlen & EMAC_BUF_DESC_EOQ)=EMAC_BUF_DESC_EOQ){
             /*SAFETYMCUSW 439 S MR:11.3 "存储在指针中的地址作为 int 参数传递。 -根据 MISRA"*进行咨询
             /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/             
             EMACRxHdrDescPtrWrite (hdkif->EMAC_BASE、(uint32)(rxch_int->free_head)、(uint32) EMAC_CHANNELNUMBER);
           }

           /*SAFETYMCUSW 71 S MR:17.6 "指定的指针值具有所需的范围。" *
           /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
           /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
           rxch_int->free_head = CURR_BD;
           rxch_int->active_tail = last_bd;
         }
       }



    /**@fn void EMACGetConfigValue (EMAC_CONFIG_REG_t * CONFIG_REG、CONFIG_value_type_t 类型)
    *  @brief 获取配置寄存器的初始值或当前值
    *
    *  @param[in]* CONFIG_reg:指向初始或当前的结构的指针
    *                          需要存储配置寄存器的值
    *  @param[in]类型:   需要存储配置寄存器的初始值还是当前值
    *                      - InitialValue:将存储配置寄存器的初始值
    *                                      位于 CONFIG_reg 指向的结构中
    *                      - CurrentValue:配置寄存器的初始值将被存储
    *                                      位于 CONFIG_reg 指向的结构中
    *
    *  此函数将复制初始值或当前值(取决于参数'type')
    配置  寄存器的*个位添加到 CONFIG_reg 指向的结构中
    *
    *
    /* sourceId:ETH_sourceId_053 */
    /* DesignId:ETH_DesignId_053*/
    /*要求:HL_ETH_SR52 */
    void EMACGetConfigValue (emac_config_reg_t * config_reg、CONFIG_value_type_t 类型)

       if (type == InitialValue)
       {
           CONFIG_REG->TXCONTROL = EMAC_TXCONTROL_CONFIGVALUE;
           CONFIG_REG->RXCONTROL = EMAC_RXCONTROL_CONFIGVALUE;
           CONFIG_REG->TXINTMASKSET = EMAC_TXINTMASKSET _CONFIGVALUE;
           CONFIG_REG->TXINTMASKCLEAR = EMAC_TXINTMASKCLEAR_CONFIGVALUE;
           CONFIG_REG->RXINTMASKSET = EMAC_RXINTMASKSET_CONFIGVALUE;
           CONFIG_REG->RXINTMASKCLEAR = EMAC_RXINTMASKCLEAR_CONFIGVALUE;
           CONFIG_REG->MACSRCADDRHI = EMAC_MACSRCADDRHI_CONFIGVALUE;
           CONFIG_REG->MACSRCADDRLO = EMAC_MACSRCADDRLO_CONFIGVALUE;   
           CONFIG_REG->MDIOCONTROL = EMAC_MDIOCONTROL_CONFIGVALUE;
           CONFIG_REG->C0RXEN = EMAC_C0RXEN_CONFIGVALUE;
           CONFIG_REG->C0TXEN = EMAC_C0TXEN_CONFIGVALUE;
       }
       其他
       {
           CONFIG_REG->TXCONTROL = HWREG (EMAC_0_BASE + EMAC_TXCONTROL);
           CONFIG_REG->RXCONTROL = HWREG (EMAC_0_BASE + EMAC_RXCONTROL);
           CONFIG_REG->TXINTMASKSET = HWREG (EMAC_0_BASE + EMAC_TXINTMASKSET);
           CONFIG_REG->TXINTMASKCLEAR = HWREG (EMAC_0_BASE + EMAC_TXINTMASKCLEAR);
           CONFIG_REG->RXINTMASKSET = HWREG (EMAC_0_BASE + EMAC_RXINTMASKSET);
           CONFIG_REG->RXINTMASKCLEAR = HWREG (EMAC_0_BASE + EMAC_RXINTMASKCLEAR);
           CONFIG_REG->MACSRCADDRHI = HWREG (EMAC_0_BASE + EMAC_MACSRCADDRHI);
           CONFIG_REG->MACSRCADDRLO = HWREG (EMAC_0_BASE + EMAC_MACSRCADDRLO);      
           CONFIG_REG->MDIOCONTROL = HWREG (MDIO_0_BASE + MDIO_CONTROL);
           CONFIG_REG->C0RXEN = HWREG (EMAC_CTRL_0_BASE + EMAC_CTRL_CnRXEN (0U));
           CONFIG_REG->C0TXEN = HWREG (EMAC_CTRL_0_BASE + EMAC_CTRL_CNTXEN (0U));
       }
       


    用于 EMAC 发送中断的/* ISR。 调用另一个处理程序函数来处理描述符。
     *
     *@返回无
     ***/
    /*SAFETYMCUSW 69S MR:3.4. "#pragma 要求用于中断处理程序。" *   
    #pragma CODE_STATE (EMACTxIntISR、32)
    /*SAFETYMCUSW 69S MR:3.4. "#pragma 要求用于中断处理程序。" *   
    #pragma INTERRUPT (EMACTxIntISR、IRQ)
    /* sourceId:ETH_sourceId_054 */
    /* DesignId:ETH_DesignId_054*/
    /*要求:HL_ETH_SR15、HL_ETH_SR33 *
    空 EMACTxIntISR (空)

       hdkif_t *hdkif;
       hdkif=&hdkif_data[0U];
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       emacTxNotification (hdkif);
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       EMACTxIntHandler (hdkif);
       EMACCoreIntAck (hdkif->EMAC_BASE、(uint32) EMAC_INT_CORE0_TX);
       TestTx++;
       


    /**
     用于接收中断的* ISR。  调用另一个函数来处理接收到的数据包。
     *
     *@返回无
     *
    /*SAFETYMCUSW 69S MR:3.4. "#pragma 要求用于中断处理程序。" *   
    #pragma CODE_STATE (EMACRxIntISR、32)
    /*SAFETYMCUSW 69S MR:3.4. "#pragma 要求用于中断处理程序。" *   
    #pragma INTERRUPT (EMACRxIntISR、IRQ)
    /* sourceId:ETH_sourceId_055 */
    /* DesignId:ETH_DesignId_055*/
    /*要求:HL_ETH_SR15、HL_ETH_SR33 *
    空 EMACRxIntISR (空)

       hdkif_t *hdkif;
       hdkif=&hdkif_data[0U];
       /*数据在分配的接收描述符中接收,从(&(hdkif->rxchptr )->active_head */开始
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       emacRxNotification (hdkif);
       /*在此函数中,填充的接收缓冲区描述符将被释放以供进一步使用,并且接收中断将被应答。 *
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/   
       /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/      
       EMACReceive(hdkif);


       /*确认 EMAC Core Rx 中断*/
       EMACCoreIntAck (hdkif->EMAC_BASE、(uint32) EMAC_INT_CORE0_RX);
       TestRX++;



    /*用户代码开始(2)*/
    /*用户代码结束*/

    /********* 文件结尾 /










  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    上述代码仅适用于 Tx ISR、但 Rx ISR 根本不适用。 小组提出的所有建议均已尝试。 请检查代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我使用 HALCOGen 生成的代码进行了测试、运行正常。

    在 HALCoGen 中、取消选中 EMAC 配置面板中的"Enable Loopback Communications"
    2.配置 Pinmux、时钟(VCLK4=40MHz)、VIM (77、79)
    3.生成代码,然后将以下代码添加到 main()

    int main (空)

    /*用户代码开始(3)*/
    _enable_IRQ ();
    EMACHWInit (emacAddress);
    create_packet();
    EMACTransmit (&hdkif_data[0]、&pack[0]);


    //检查0x08001500处的 pbuf_array 是否与0x08005024处的数据匹配
    //pbuf_array 是复用数据
    //数据是经过 txed 的有效载荷
    while (1);


    4.在 RJ-45上,将 TX 路由到 RX (最好使用适配器)
    5.运行代码,然后检查有效负载:已将数据作为 txed,已将 pay_array 复用

    因此、如果您在 Launchpad 和 PHY 以及 RJ-45连接器之间进行硬件连接、则应使用 HALCOGen 代码获取 RX 数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wang、

    我取消选中了"启用 halcogen 的环回通信"。 代码不会进入 EMACRxIntISR、因此0x08001500与08005024不同、pbuf_array 显示零。 与 MII 信号的控制一样、也从文档中检查了 PINMUX PINMMR。 也启用了中断。

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

    e2e.ti.com/.../ETHERNET_5F00_TEST2.rar

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

     您好、Wang、

    请参阅 launchpad 和 PHY 之间的硬件连接原理图。 但我们尚未连接 RJ-45。 由于我们在 PHY 本身中启用了环回、因此 TXD[3:0]和 RXD[3:0]信号出现在 PHY 引脚上。 但 Rx 中断根本不会产生。 请检查 sys_main.c

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

    您好 Shruthi、

    正如我说过的、如果 EMAC 和 PHY 以及 RJ45 (加磁性元件)之间的连接正确、HALCoGen 生成的 EMAC 驱动器将正常工作。

    对于外部回送、您需要将引脚1连接到引脚3、将引脚2连接到 RJ45的引脚6。

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

    已尝试您告知它的方式。 那么 Rx 中断也不会出现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wang、

    最后、我们可以获取中断并以缓冲区地址接收数据。 感谢您的所有建议。