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:TFTP 通信失败

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/575712/tm4c1294ncpdt-tftp-communication-failed

器件型号:TM4C1294NCPDT

我尝试使用 TivaWare 上 utils 文件夹中包含的 tftp.c 和 tftp.h 文件在 EK-TM4C1294NCPDT 板中实现 TFTP 协议  2.1.3.156.我想通过 TFTP 读取闪存中特定存储器位置的值。

由于电路板上没有此协议的示例、因此我使用 enet_io 示例并进行修改以添加 TFTP 协议实现。 我使用 TFPInit 函数初始化 TFTP、如下代码所示:

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);

//
//配置调试端口供内部使用。
//
UARTStdioConfig (0、115200、g_ui32SysClock);

//
//清除终端并打印横幅。
//
UARTprintf ("\033[2J\033[H");
UARTprintf ("以太网 IO 示例\n");

//
//为周期性中断配置 SysTick。
//
MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ);
map_SysTickEnable();
map_SysTickIntEnable();

//
//为的以太网控制器过滤配置硬件 MAC 地址
//传入数据包。 MAC 地址将存储在非易失性存储器中
// USER0和 User1寄存器。
//
map_FlashUserGet (&ui32User0、&ui32User1);
if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)
{
//
//告知用户没有 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);
// lwIPInit (g_ui32SysClock、pui8MACArray、2887557220、4294934528、 2887526654、IPADDR_USE_STATIC);

//
//设置设备定位服务。
//
LocatorInit();
LocatorMACAddrSet (pui8MACArray);
LocatorAppTitleSet ("EK-TM4C1294XL enet_IO");

uint32_t i;
对于(i = 0;i < 99;i++){
Buffer[i]='A';
}
Buffer[99]='\0';

//
//初始化示例 httpd 服务器。
//
httpd_init();
TFTPInit (okToContinuue);

//
//设置中断优先级。 我们将 SysTick 中断设置为更高的值
//优先级比以太网中断高,以确保文件系统
如果 SysTick 在以太网处理程序运行时发生、则处理// tick
//已处理。 这很可能是因为所有 TCP/IP 和 HTTP 工作都是
//在以太网中断上下文中完成。
//
MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);

//
//将我们的标记信息传递到 HTTP 服务器。
//
HTTP_SET_SSI_handler ((tSSIHandler) SSIHandler、g_pcConfigSSITags、
num_config_SSI_tags);

//
//将我们的 CGI 处理程序传递到 HTTP 服务器。
//
http_set_cgi_handler (g_psConfigCGIURI、NUM_CONFIG_CGI_URI);

//
//初始化 IO 控件
//
io_init();

//
//永久循环,处理屏幕动画。 所有其他工作都是
//在中断处理程序中完成。
//
while (1)
{
//
//等待新的勾号出现。
//
while (!g_ulFlags)
{
//
//不执行任何操作。
//
}

//
//现在我们已经看到了标记,就清除它了。
//
HWREGBITW (&g_ulFlags、FLAG_TICK)= 0;

//
//切换 GPIO
//
MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、
(MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^
GPIO_PIN_1);
}
} 

我创建了回调函数、但现在我只执行了 TFPInit 和 pfnGetData Callback。

tTFPError getDataFromTFTP (struct _tTPConnection *psTFTP){

无符号超长整型 ulOffset;

UARTprintf ("获取块%d、%d\n"、psTFTP->ui32BlockNum、psTFTP->ui32DataLength);

//
//从何处读取该数据块? 这通过进行计算
//请求的 TFTP 块编号。
//
ulOffset =((psTFTP->ui32BlockNum - 1)* TFTP_BLOCK_SIZE);

//
//将数据复制到提供的缓冲区中。
//
memcpy (psTFTTFTP ->pui8Data、(unsigned char *)(buffer + ulOffset)、
psTFTP->ui32DataLength);

//
//告诉呼叫者一切正常。
//
return (TFTP_OK);
}

tTFPError putDataFromTFTP (struct _tTFPTConnection *psTFTP){

返回 TFTP_OK;
}

void closeTFTP (struct _tTFTPConnection *psTFTP){
}

tFTPError okToContinuue (struct _tTFTPConnection *psTFTP、bool bGet、
int8_t * pui8FileName、tTFPMode eMode){

psTFTTFTP -> pfnClose = closeTFTP;

//
//这是获取还是提交请求?
//
if (bGet)(如果(bGet))
{
//
//获取请求-填写图像大小和数据传输
//函数指针。
//
psTFTTFTP ->pfnGetData = getDataFromTFTP;
psTFTP->ui32DataRemaining = 100;
}
其他
{
//
//发出请求-填入数据传输函数指针。
//
psTFTP->pfnPutData = putDataFromTFTP;
}

返回 TFTP_OK;
} 

板上有 IP 地址、http 服务器工作正常。 但是、当我在窗口中使用本机 TFTP 客户端时、会调用 TFPRecv 函数和 pfnGetData 回调函数。 但当 TFPDataRecv 函数被调用时,TFPRecv 函数被调用,当第618行中的 UDP_recv 被再次调用时,发生 Fault_ISR。

为什么 永远不调用函数 TFPDataRecv?

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

    您是否在项目的 lwipopts.h 文件中启用了 UDP 协议?

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

    是的、问题不在 lwipopts.h 文件中。

    我使用 LWIP 2.0.0包中包含的 tftp 文件解决了问题。 (tftp_server.c 和 tftp_server.h)

    现在、TFTP 协议工作得非常完美。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Leonan、您好!

    我有一个关于 TFTP 服务器的问题。 只有我们必须在主程序中初始化 TFPInit 函数? 以及包含 tftp_server.c 和 tftp_server.h 文件的 lwIP 2.0.0软件包。 但其中没有 tftp_server 文件。 请分享您获取该文件的链接。

    谢谢。

    此致、

    Faizan Ahsan