请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:EK-TM4C1294XL 您好!
我想在 EK-TM4C1294和 PC 之间通过以太网实现通信。 PC 将是服务器、我想在两者之间通过以太网传递8位数据。
执行此任务是否有任何相关示例?
谢谢你。
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-TM4C1294和 PC 之间通过以太网实现通信。 PC 将是服务器、我想在两者之间通过以太网传递8位数据。
执行此任务是否有任何相关示例?
谢谢你。
除了您看到的示例外、我们在 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); }