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.

[参考译文] EK-TM4C1294XL:Launchpad 和 PC 之间的以太网通信

Guru**** 2481465 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/698565/ek-tm4c1294xl-ethernet-communication-between-launchpad-and-pc

器件型号:EK-TM4C1294XL

您好!

我想在 EK-TM4C1294和 PC 之间通过以太网实现通信。 PC 将是服务器、我想在两者之间通过以太网传递8位数据。

执行此任务是否有任何相关示例?

谢谢你。

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

    您是否了解过 TivaWare 中的 Enet_IO 示例? 可从 http://www.ti.com/tool/SW-TM4C 下载 TivaWare

    此外、您还可以在 TivaWare 的 docs 文件夹中找到 EK-TM4C1294XL 的用户指南、其中提供了 TivaWare 随附的每个示例的说明。

    最后、TIA-RTOS 的 Tiva-C 示例集涵盖了以太网、因此您也可以查看这些示例 :www.ti.com/.../TI-RTOS-MCU
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看到 Enet_IO。 该示例将在我的项目的稍后部分为我提供帮助。
    首先、我想仅在 PC 和 TM4C1294XL 之间建立 LAN 连接以传递数据。
    我不想使用任何联机服务器。
    我已经通过 USB 建立了连接、我想通过以太网建立同样的连接。
    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了您看到的示例外、我们在 TivaWare 中没有其他示例。 您可以使用 enet_io 或 enet_lwip 示例作为起始代码、并用以下代码替换 enet_lwip.c。 这将使用 UDP 创建回显服务器。 如果您需要 TCP 回波示例、可以参阅以下两个链接。 如果您想使用 TI-RTOS 和基于 TI NDK 的 TCP 堆栈、则可以使用基于 TI-RTOS 的 TCP 和 UDP 回显示例。  

    //
    //
    // enet_lwip.c -使用 lwIP 的 WebServer 应用示例。
    //
    //版权所有(c) 2013-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //德州仪器(TI)提供此软件仅供
    和//仅供 TI 的微控制器产品使用。 软件归
    // TI 和/或其供应商所有,并受适用的版权
    //法律保护。 您不能将此软件与"病毒"开源
    //软件组合在一起以形成更大的程序。
    //
    //此软件按“原样”提供,且存在所有故障。
    //对于
    
    本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
    //情况下、TI 不对任何
    原因造成的特殊、意外或必然//损害负责。
    //
    //这是 EK-TM4C1294XL 固件包版本2.1.4.178的一部分。
    ////
    *****************
    
    #include 
    #include 
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/flash.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/rom_map.h"
    
    #include "driverlib/sysctl.udpinh"
    #include "drivers/udpintrinu.h
    
    
    
    
    
    
    
    
    
    
    //
    //! \addtogroup example_list
    //! 

    具有 lwIP 的以太网(enet_lwip)

    //! //! 此示例应用演示了 Tiva //! 使用 lwIP TCP/IP 堆栈的以太网控制器。 DHCP 用于获取 //! 以太网地址。 如果 DHCP 在未获取地址的情况下超时、 //! AutoIP 将用于获取链路本地地址。 是//!的地址 所选的值将显示在 UART 上。 //! //! UART0、连接到 ICDI 虚拟 COM 端口并以115、200运行、 //! 8-N-1用于显示来自此应用程序的消息。 使用 //! 按照命令重新构建所更改的任何文件系统文件。 //! //! ./../../../tools/bin/makefsfile -I FS -o enet_fsdata.h -r -h -q //! //! 有关 lwIP 的更多详细信息、请参阅 lwIP 网页、网址为: //! savannah.nongnu.org/.../ ///********* // // //定义设置系统时钟。 //// ***************** #define SYSTICKHZ 100 #define SYSTICKMS (1000 / SYSTICKHZ) //********* // //中断优先级定义。 这些值的前3位是 //有效的、较低的值表示较高优先级的中断。 //// ***************** #define SysTK_INT_PRIORITY 0x80 #define ETHERNET_INT_PRIORITY 0xC0 //********* // //当前 IP 地址。 //// ***************** uint32_t g_ui32IPAddress; //********* // //系统时钟频率。 //// ***************** uint32_t g_ui32SysClock; //********* // //用于管理 LED 闪烁的易失性全局标志,因为它用于中断 //和主应用程序。 LED 以 SYSTICKHZ 的速率闪烁。 //// ***************** 易失性 bool g_bled; //********* // //如果驱动程序库遇到错误,则调用的错误例程。 //// ***************** #ifdef debug void __error__(char *pcFilename、uint32_t ui32Line) { #endif void udp_echo_init (void); //********* // //显示 lwIP 类型的 IP 地址。 //// ***************** void DisplayIPAddress (uint32_t ui32Addr) { char pcBuf[16]; // //将 IP 地址转换为字符串。 // usprintf (pcBuf、"%d.%d.%d.%d"、ui32Addr & 0xff、(ui32Addr >> 8)& 0xff、 (ui32Addr >> 16)& 0xff、(ui32Addr >> 24)& 0xff); // //显示字符串。 // UARTprintf (pcBuf); } //************* // // lwIP 库支持任何与主机相关的计时器函数所需的//。 //// ***************** void lwIPHostTimerHandler (void) { uint32_t ui32NewIPAddress; // //获取当前 IP 地址。 // ui32NewIPAddress = lwIPLocalIPAddrGet (); // //查看 IP 地址是否已更改。 // if (ui32NewIPAddress!= g_ui32IPAddress) { // //查看是否分配了 IP 地址。 // if (ui32NewIPAddress == 0xffffffff) { // //表示没有链接。 // UARTprintf ("正在等待链接。\n"); } 否则、如果(ui32NewIPAddress =0) { // //没有 IP 地址,因此请指明 DHCP 进程是什么 //正在运行。 // UARTprintf ("正在等待 IP 地址。\n"); } 其他 { // //显示新的 IP 地址。 // UARTprintf ("IP 地址:"); DisplayIPAddress (ui32NewIPAddress); UARTprintf ("\n 回显服务器已就绪。\n"); } // //保存新的 IP 地址。 // G_ui32IPAddress = ui32NewIPAddress; } // //如果没有 IP 地址。 // if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff)) { // //不执行任何操作并继续等待。 // } } //********* // // SysTick 中断的中断处理程序。 //// ***************** void SysTickIntHandler (void) { // //调用 lwIP 计时器处理程序。 // lwIPTimer (SYSTICKMS); // //告诉应用程序更改 LED 的状态(换句话说 //闪烁)。 // G_bled = true; } //********* // //此示例演示了以太网控制器的使用。 //// ***************** int main (void) { uint32_t ui32User0、ui32User1; uint8_t pui8MACArray[8]; // //确保主振荡器已启用,因为这是所要求的 // PHY。 系统必须将一个25MHz 晶体连接到 OSC //引脚。 晶体时使用 SYSCTL_MOSC_HIGHFREQ 参数 //频率为10MHz 或更高。 // SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ); // //从 PLL 以120MHz 运行。 // G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); PinoutSet (true、false); // //配置 UART。 // UARTStdioConfig (0、115200、g_ui32SysClock); // //清除终端并打印横幅。 // UARTprintf ("\033[2J\033[H"); UARTprintf ("以太网 lwIP UDP 回显示例\n"); // //将的端口 N1配置为动画 LED 的输出。 // MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1); // //将 LED 初始化为关闭(0) // MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1); // //为周期性中断配置 SysTick。 // MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ); map_SysTickEnable(); map_SysTickIntEnable(); // //为的以太网控制器过滤配置硬件 MAC 地址 //传入数据包。 MAC 地址将存储在非易失性存储器中 // USER0和 User1寄存器。 // map_FlashUserGet (&ui32User0、&ui32User1); if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff) { // //我们永远不应该来这里。 如果 MAC 地址有、则这是一个错误 //未编程到器件中。 退出程序。 //告知用户没有 MAC 地址 // UARTprintf ("未对 MAC 进行编程!\n"); while (1) { } } // //告诉用户我们现在正在做什么。 // UARTprintf ("正在等待 IP.\n"); // //将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 MAC //对硬件寄存器进行编程所需的地址,然后对 MAC 进行编程 //将地址输入以太网控制器寄存器。 // pui8MACArray[0]=((ui32User0 >> 0)& 0xff); pui8MACArray[1]=((ui32User0 >> 8)& 0xff); pui8MACArray[2]=((ui32User0 >> 16)& 0xff); pui8MACArray[3]=((ui32User1 >> 0)& 0xff); pui8MACArray[4]=((ui32User1 >> 8)& 0xff); pui8MACArray[5]=((ui32User1 >> 16)& 0xff); // //使用 DHCP 初始化 lwIP 库。 // lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp); udp_echo_init(); // //设置中断优先级。 我们将 SysTick 中断设置为更高的值 //优先级比以太网中断高,以确保文件系统 如果 SysTick 在以太网处理程序运行时发生、则处理// tick //已处理。 这很可能是因为所有 TCP/IP 和 HTTP 工作都是 //在以太网中断上下文中完成。 // MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY); MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY); // //循环永久、处理 LED 闪烁。 所有工作都在中完成 //中断处理程序。 // while (1) { // //等待 SysTick 中断指示更改的状态 // LED。 // while (g_bled == false) { } // //清除标志。 // G_bled = false; // //切换 LED。 // MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、 (MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^ GPIO_PIN_1); } } void udp_echo_recv (void *arg、struct udp_pcb * pcb、struct pbuf * p、struct ip_addr * addr、u16_t port) { if (p!= NULL){ /*将收到的数据包发送回发件人*/ udp_sendto (pcb、p、addr、port); /*释放 pbuf */ pbuf_free (p); } } void udp_echo_init (void) { struct udp_PCB * pcb; /*获取新的 PCB */ PCB = UDP_NEW (); if (PCB == NULL){ LWIP_DEBUGF (UDP_DEBUG、("UDP_NEW FAILED!\n"); 返回; } /*绑定到端口23上的任何 IP 地址*/ if (udp_bind (PCB、IP_ADDR_ANY、23)!= ERR_OK){ LWIP_DEBUGF (UDP_DEBUG、("UDP_BIND FAILED!\n"); 返回; } /*将 udp_echo_recv()设置为回调函数 对于接收到的数据包*/ UDP_recv (PCB、UDP_ECHO_recv、NULL); }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我设法在 PC 和 TM4C1294XL 之间实现以太网通信。
    我在 Python 中设置了一个服务器应用程序、并设法将数据发送和接收到 launchpad、在该 Launchpad 中我分配了一个静态 IP 地址。
    现在的问题是、每次我想要发送/接收数据时、我都必须重置 Launchpad、以便在服务器/客户端之间建立通信。
    每次插入以太网电缆时、是否有任何方法建立通信?
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在 LaunchPad 上运行了什么? 您是否尝试使用 DHCP 地址? 有什么不同吗?