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.
工具/软件:Code Composer Studio
大家好、
我想通过 EMAC 与 PHY 通信。 我在 Halcogen 中使用了作为环回的可用代码、环回运行正常。 但是、每当我发送数据包时、TX_EN 都不会被调整。 TX_CLK 和 RX_CLK 正确进入。 我尚未连接任何 DHCP/UDP。 请给出答案。
工具/软件:Code Composer Studio
大家好、我没有收到任何答案。
器件型号:RM46L852
工具/软件:Code Composer Studio
大家好、
请告诉我们 EMAC 设置。 我使用的是 RM46L852 Launchpad 和 DP83640。 与 HDK 相似。 我能够在存储器位置看到传输的字节。 但实际上是通过示波器。不是。 既未检测到 TXEN、也未检测到其他 TXD。 请建议
您好、Wang、
它是 PHY 内部回路。 我已经设置了 DP83640中的位。其他下拉寄存器已按照您的建议连接。 我更改了通道1 TXD 正常工作、但 RXD 不会从 PHY 输出。 我可以通过0xFC521010看到 RX_CLK 和 RX1HDP、但缓冲器指针中没有数据。
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)*/
/*用户代码结束*/
/********* 文件结尾 /
您好、Wang、
我取消选中了"启用 halcogen 的环回通信"。 代码不会进入 EMACRxIntISR、因此0x08001500与08005024不同、pbuf_array 显示零。 与 MII 信号的控制一样、也从文档中检查了 PINMUX PINMMR。 也启用了中断。