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.

[参考译文] TM4C1294NCPDT:为以太网应用准备新的定制板

Guru**** 2457760 points
Other Parts Discussed in Thread: TM4C1294NCPDT, EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/648135/tm4c1294ncpdt-preparing-a-fresh-custom-board-for-ethernet-applications

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件: EK-TM4C1294XL

您好,

我想知道、如何准备一个新的定制板(基于 TM4C1294NCPDT 的设计) 以用于网络/以太网示例。 我的意思是说、从 DHCP 获取 IP 等 它是否需要在软件方面进行任何更改/或更改示例示例、例如(TCP 回波示例、我之前已用于测试我的定制板、这里我找不到 EMAC_Init 函数的定义)、对于 Launchpad 而言不需要这些更改、但对于定制板而言是必需的

请在这方面提供任何帮助。

谢谢

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

    [引用 user="Techinspired"]在这里、我找不到 EMAC_Init 函数的定义)、这在 Launchpad 中不是必需的、但在定制板中是必需的

    大家好、Techinspirred、

     非常感谢其他线程的绿光。 :-)

    您能解释一下您在哪里阅读或发现 了上述信息。   定制 PCB 不拉取 IP 地址有什么问题? 您能否发布    PCB RJ45插孔部分的原理图?  

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

    您好 BP101、

    感谢您的回复!

    [引用 user="BP101"]您能否解释您在哪里阅读或发现 了上述信息。

    抱歉,我的错误...我想说我在   TCP 回显示例中找不到 EMAC_init()函数的定义。 我想检查该函数在 EMAC 配置端的作用。 我宣读了评论。"  此函数用于初始化 EMAC 驱动程序"。 因此、我检查了是否需要对 EMAC 配置的定制板进行任何更改。

    [报价用户="BP101]]您能否发布    PCB RJ45插孔部分的原理图?  [/报价]

    e2e.ti.com/.../Gateway_2D00_0.9.1.sch.pdf

    其次、我想问的是、对于任何定制板(基于 TM4C1294NCPDT 的设计)、需要在软件方面做什么更改/示例代码示例以使网络示例正常工作...即从 DHCP 获取 IP 地址等 我已在自定义板上对任意 MAC 地址(F5-DC-EA-90-10-F2)进行了编程。 除此之外、我还需要在软件/示例代码中进行哪些其他更改、对于 launchpad 而言、这些更改是不需要的、但对于定制板而言、需要进行这些更改(我对此不了解...因此询问)。

    此致、

    技术尖头

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

    通过:TIVAWARE_ROOT/driverlib/emac.c

    //
    //
    //! 初始化以太网 MAC 并设置与总线相关的 DMA 参数。
    //!
    //! \param ui32Base 是以太网控制器的基址。
    //! \param ui32SysClk 是以赫兹为单位的当前系统时钟频率。
    //! param ui32BusConfig 定义以太网 MAC
    //!的总线操作模式 DMA 控制器。
    //! \param ui32RxBurst 是以字为单位的最大接收突发大小。
    //! \param ui32TxBurst 是以字为单位的最大传输突发大小。
    //! \param ui32DescSkipSize 是要在
    //之间跳过的32位字的数量! 两个未链接的 DMA 描述符。 范围0到31的值是有效的。
    //!
    //! 此函数设置以太网 MAC DMA
    //!的总线相关参数 引擎。 必须在 EMAPPHYConfigSet()之后调用它,然后再次调用
    //! 在对 EMAPPHYConfigSet()进行任何后续调用之后。
    //!
    //! ui32BusConfig 参数是各种字段的逻辑 OR。
    //! 首先设置 DMA 通道优先级权:
    //!
    //! - b EMAC_BCONFIG_DMA_PRIO_权 重1
    //! - b EMAC_BCONFIG_DMA_PRIO_权 重2
    //! - b EMAC_BCONFIG_DMA_PRIO_权 重3
    //! - b EMAC_BCONFIG_DMA_PRIO_权 重_4
    //!
    //! 第二个字段设置
    //!时使用的接收和发送优先级 在 Rx 和 Tx DMA 之间仲裁。 优先级为 Rx:Tx、除非
    //! 也指定了 EMAC_BCONFIG_TX_PRIORITY、在这种情况下、它们成为
    //! TX:Rx。 如果
    //! b 指定了 EMAC_BCONFIG_PRIORY_FIXED。
    //!
    //! - b EMAC_BCONFIG_PRIORY_1_1
    //! - b EMAC_BCONFIG_PRIORY_2_1
    //! - b EMAC_BCONFIG_PRIORY_3_1
    //! - b EMAC_BCONFIG_PRIORY_4_1
    //!
    //! 还可以定义以下附加标志:
    //!
    //! - b EMAC_BCONFIG_TX_PRIORITY 表示发送 DMA 应为
    //! 系统侧总线的所有仲裁中具有更高的优先级。 如果不是
    //! 已定义、接收 DMA 具有更高的优先级。
    //! - b EMAC_BCONFIG_ADDR_ALIGN 与
    //协同工作! b EMAC_BCONFIG_FIXED_BURST、用于控制 AHB 突发的地址对齐。
    //! 当两个标志都被指定时、所有突发都与起始地址//
    ! 最低有效位。 如果未指定 b EMAC_BCONFIG_FIXED_BURST、
    //! 第一个突发未对齐、但后续突发与
    //! 地址。
    //! -\b EMAC_BCONFIG_ALT_descriptors 表示 DMA 引擎应该
    //! 使用类型
    //!中定义的替代描述符格式 tEMACDMADescriptor。 如果不存在,则使用基本描述符类型。
    //! 如果使用 IEEE 1588-2008高级
    //! 时间戳、VLAN 或 TCP/UDP/ICMP CRC 插入功能。 请注意
    、//! 为清楚起见、emac.h 不包含基本
    //!的类型定义 描述符类型。 有关基本
    //!的信息、请参阅器件数据表! 描述符结构。
    //! - b EMAC_BCONFIG_PRIORY_FIXED 表示一个固定优先级方案
    //! 在发送和接收 DMA //
    !之间进行仲裁时应使用 用于系统侧总线访问。 在这种情况下、接收通道始终具有
    //! 优先级、除非设置了 b EMAC_BCONFIG_TX_PRIORITY、在这种情况下为
    //! 传输通道具有优先级。 如果未
    //! 指定后、加权循环仲裁方案将与
    //! 使用\b EMAC_BCONFIG_PRIORY_1_1定义加权、
    //! b EMAC_BCONFIG_PRIOR_2_1、\b EMAC_BCONFIG_PRIORY_3_1或
    //! b EMAC_BCONFIG_PRIORY_4_1和\b EMAC_BCONFIG_TX_PRIORITY。
    //! - b EMAC_BCONFIG_FIXED_BURST 表示固定突发传输应该
    //! 应用。
    //! - b EMAC_BCONFIG_Mixed_burst 表示 DMA 引擎应该使用
    //! 混合突发类型、具体取决于要传输的数据长度
    //! 电压。
    //!
    //! ui32RxBurst 和 ui32TxBurst 参数指示最大
    值//! 相关 DMA 应在单
    个中传输的字数//! 事务。 有效值为1、2、4、8、16和32。 任何其他值
    //! 导致未定义的行为。
    //!
    //! 描述符列表为
    //时使用\e ui32DescSkipSize 参数! 使用环模式(其中描述符在内存中是连续的、最后
    一个//! 用\b end_for_ring 标志标记的描述符)而不是链接模式
    //! (其中每个描述符包含一个指向下一个描述符
    的字段//! 列表中)。 在环形模式下、硬件使用\ui32DescSkipSize 来
    //! 在硬件结束后跳过任何应用程序定义的字段-
    //! 定义的描述符字段。 参数值指示
    //!的数量 要在硬件定义
    的最后一个字段之后跳过的32位字//! 以到达下一个描述符的第一个字段。 使用
    //! tEMACDMADDescriptor 或\b tEMACAltDMADDescriptor //
    !的数组 为此驱动程序定义的类型,必须将\ui32DescSkipSize 设置为1才能跳过
    //! 将\e pvNext 指针添加到每个结构的末尾。
    //! 应用程序可以修改这些结构定义以包括它们自己
    的//! 应用特定数据、并在
    //! 所需的。
    //!
    //! \无返回。
    ////
    *****************
    void
    EMACInit (uint32_t ui32Base、uint32_t ui32SysClk、uint32_t ui32BusConfig、
    uint32_t ui32RxBurst、uint32_t ui32TxBurst、uint32_t ui32DescSkipSize)
    {
    uint32_t ui32Val、ui32Div;
    
    //
    //参数完整性检查。
    //
    assert (ui32DescSkipSize < 32);
    断言(ui32TxBurst <(32 * 8));
    断言(ui32RxBurst <(32 * 8));
    
    //
    //在继续操作之前,确保 DMA 软件复位已清除。
    //
    while (HWREG (EMAC0_BASE + EMAC_O_DMABUSMOD)和 EMAC_DMABUSMOD_SWR)
    {
    }
    
    //
    //设置公共标志。 请注意、该驱动程序假定我们始终使用
    // 8个字描述符,因此我们需要在此处的 EMAC_DMABUSMOD_ATDS 中执行或操作。
    //
    ui32Val =(ui32BusConfig |(ui32DescSkipSize << EMAC_DMABUSMOD_DSL_S)|
    EMAC_DMABUSMOD_ATDS);
    
    //
    //我们是否需要使用8X 突发长度乘法器?
    //
    if ((ui32TxBurst > 32)||(ui32RxBurst > 32))
    {
    //
    //将两个突发长度除以8并设置8X 突发长度
    //乘法器。
    //
    ui32Val |= EMAC_DMABUSMOD_8XPBL;
    ui32TxBurst >=3;
    ui32RxBurst >=3;
    
    //
    //完整性检查-两个突发长度都不应变为零。 如果
    //确实如此,这表示传递的值无效。
    //
    断言(ui32RxBurst);
    断言(ui32TxBurst);
    }
    
    //
    //接收和发送突发长度是否相同?
    //
    if (ui32RxBurst = ui32TxBurst)
    {
    //
    //是-设置为使用单次突发长度。
    //
    ui32Val |=(ui32TxBurst << EMAC_DMABUSMOD_PBL_S);
    }
    其他
    {
    //
    //否-我们需要为每个使用单独的突发长度。
    //
    ui32Val |=(EMAC_DMABUSMOD_USP |
    (ui32TxBurst << EMAC_DMABUSMOD_PBL_S)|
    (ui32RxBurst << EMAC_DMABUSMOD_RPBL_S);
    }
    
    //
    //最后,写入总线模式寄存器。
    //
    HWREG (ui32Base + EMAC_O_DMABUSMOD)= ui32Val;
    
    //
    //根据最快的系统时钟默认 MII CSR 时钟分频器。
    //
    ui32Div = g_pi16MIIClockDiv[NUM_CLOCK 除数- 1].ui32除数;
    
    //
    //根据当前系统时钟找到要使用的 MII CSR 时钟分频器。
    //
    for (ui32Val = 0;ui32Val < NUM_CLOCK_DISARINS;ui32V++)
    {
    if (ui32SysClk <= g_pi16MIIClockDiv[ui32Val].ui32SysClockMax)
    {
    ui32Div = g_pi16MIIClockDiv[ui32Val].ui32Divisor;
    中断;
    }
    }
    
    //
    //设置 MII CSR 时钟速度。
    //
    HWREG (ui32Base + EMAC_O_MIIADDR)=((HWREG (ui32Base + EMAC_O_MIIADDR)和
    ~EMAC_MIIADDR_CR_M)| ui32Div);
    
    //
    //禁用所有 MMC 中断、因为这些中断在复位时默认启用。
    //
    HWREG (ui32Base + EMAC_O_MMCRXIM)= 0xFFFFFFFF;
    HWREG (ui32Base + EMAC_O_MMCTXIM)= 0xFFFFFFFF;
    } 

    CB_1的明智之词(也经受住时间的考验!)  在这里绝对有价值;加载和连接整个 Tivaware 库的学习体验将向您传授您需要了解的大部分知识。 养成将您的研究分解为小型、易管理、可测试零件的习惯。

    首先关注小位。 它们将叠加在美丽的图片中。 话虽如此、您是否曾尝试先获取开发板示例... 在担心旧的"充满危险、因为这里有龙"定制板开发之路之前? 必须找到一个很好的平衡;根据硬件(定制板)设计人员的需要进行更改。 设计。

    在不了解您学习的最佳方式的情况下、我想提出一个一般性建议-获取定制电路板原理图的打印输出、并在 ETH 部分标记每个端口和引脚的轨迹。 需要考虑的面包屑。  

    分解、"保持简单、愚蠢"、然后冒险。 让我们大家知道您可能还需要什么。

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

    您好 BP101。

    [引用 user="BP101"]您能否发布    PCB RJ45插孔部分的原理图?  [/报价]

    请查找随附的以太网定制板原理图。 请告诉我在这里还缺少什么?

    e2e.ti.com/.../5773.Gateway_2D00_0.9.1.sch.pdf

    谢谢、此致、

    技术尖头

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    原理图中是否将以太网 U5 (TRJ19111DNL)用作内置 RJ45插孔的变压器? 与电路中的偏置电阻器和电容器值无关。

    EK-TM4C1294XL 原理图建议使用:
    HX1188民解力量或 HX1198民 解力量。
    HX1198MFNL 是获得最佳以太网性能的首选。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Techinspired"]我找不到 EMAC_init ()的定义

    这可能不是您想要的、但它位于您的 TivaWare 安装目录/packages/ti/drivers/EMAC.c 中

    void EMAC_init (void)
    {
    /*
    *只允许首次初始化执行任何操作。
    *接下来的是 nops。
    *
    if (EMAC_COUNT >= 0){
    返回;
    }
    
    /*调用每个驱动程序的初始化函数*/
    对于(EMAC_COUNT = 0;EMAC_CONFIG[EMAC_COUNT].fxnTablePtr!= NULL;
    EMAC_COUNT++){
    emac_config[emac_count].fxnTablePtr->emacInit(EMac_count);
    }
    
    返回;
    } 

    函数指针指向不进行任何硬件配置的 EMACSnow_init()。

    侧面问题、此函数是否尝试显示 EMAC Snow (burrr!) 还是 Emacs 现在(vim > emacs)?