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:Telent 转串行桥接器需要在设计中根据使用 TivaWare、lwip 和 FreeRTOS 的 Tiva TM4C1294XL Enet_S2E 应用来驱动 GPIO。

Guru**** 2451970 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/637061/ek-tm4c1294xl-telent-to-serial-bridge-requires-gpio-actuation-in-design-based-on-the-tiva-tm4c1294xl-enet_s2e-application-using-tivaware-lwip-and-freertos

器件型号:EK-TM4C1294XL

 我有 telnet 尝试与定制板上的串行端口通信(基于 Tiva TM4C1294XL Enet_S2E 应用程序)。 这基本上是 EK-TM4C1294XL、在端口 c 的引脚5、6、7 (UCA0)上有一个额外的串行端口。 同一电路板设置为将数据从 USB 桥接至同一串行端口。 串行端口需要启用 GPIO 以进行发送(端口 C 引脚5)。 USB 转串行桥接器工作正常。 实际上,当 USB 转串行桥 接器(双向)通信时,我可以在 telnet 端口上看到数据。 为了使 Telent 能够将数据发送到串行端口、我必须驱动 GPIO 引脚。 使用我与串行端口一起使用的 telnet 端的 smae 软件会使许多 telnet 值混乱。

  当 telent.c 中的 SerialSend()向 TX FIFO 发送字符时,它不会启动 test_485_EN。 如果我从成功执行相同函数的 serial_task.c 例程中获取代码、则会严重破坏 telnet 代码。 ui32Port 应该为0或1、则会转至较大的伪数。 我想 Assert 语句会禁用此时的所有 IO。 注释掉两条 ROM_GPIOPinWrite 语句会使所有内容恢复正常?? 我可能会对 UCAx 有点高??? 控制寄存器。

serial.c、仅通过 telnet 调用:

===========================================================================================================

void SerialSend (uint32_t ui32端口、uint8_t ui8Char)


   Assert (ui32Port < MAX_S2E_PORTS);   //检查参数。

   //
   //在确定如何处理 UART 发送中断时禁用此中断
   //字符。  否则可能会导致该字符丢失、
   //或由于该字符被放置到 UART 中而导致输出停止
   //发送缓冲器,但从未传输到 UART FIFO 中。
   //
   UARTIntDisable (g_ui32UARTBase [ui32Port]、UART_INT_TX);

   if (RingBufEmpty (&g_sTxBuf[ui32Port])&&(UARTSpaceAvail (g_ui32UARTBase[ui32Port])))
   {
      // ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、1);  //此处设置485 Talk GAA Nov032017
      UARTCharPut (g_ui32UARTBase[ui32Port]、ui8Char);    //将该字符直接写入 FIFO。
      // ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、0);  // CLR 485在此收听 GAA Nov032017
   }
  否则、如果(!RingBufFull (&g_sTxBuf[ui32Port])             //查看发送缓冲区中是否有空间。
   {
      RingBufWriteOne (&G) sTxBuf[ui32Port]、ui8Char);     //将此字符放入发送缓冲区。
   }


   UARTIntEnable (g_ui32UARTBase [ui32Port]、UART_INT_TX);  //启用 UART 发送中断。

===========================================================================================================

SerialTask()可以阻止等待来自串行 ISR 的事件,它成功地使用了以下方法:

=========================================================================================================== 静态空串行任务(void *pvParameters)

   tSerialEvent sEvent;

  while (1)                                                         //循环永远。
   {
     xQueueReceive(g_QueSerial,(void*)&sEvent, portMAX_DELAY );   //阻止一条消息被中断处理程序放入队列中。

     if (sEvent.eEventType = RX)
       {
          if (((g_sParameters.SPORT [sEvent.ui8Port].ui8Flags 和       //如果启用了 Telnet 协议,请检查是否有传入的 IAC 字符,
               PORT_FLAG_Protocol)== PORT_PROTOCOL_Telnet)
             {
               if ((sEvent.ui8Char = Telnet_IAC)&&                //如果这是一个 Telnet IAC 字符,请将其写入两次。
                  (RingBufFree (&g_sRxBuf[sEvent.ui8Port])>=2))
                  {
                   RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
                   RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
                   }

               否则、如果((sEvent.ui8Char!= Telnet_IAC)&&                //如果不是 Telnet IAC 字符、则只能写入一次。
                       (RingBufFree (&g_sRxBuf[sEvent.ui8Port])>=1))
                   {
                   RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
                  }
            }
           else                                                           //如果不是 Telnet,则只写入一次数据。
             {
               RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
              }
      }

           else                                                            //检查它是否是 TX 中断
            {

           while (!RingBufEmpty (&G) sTxBuf[sEvent.ui8Port])&&              //在发送 FIFO 中有空间时循环
                 UARTSpaceAvail (g_ui32UARTBase [sEvent.ui8Port]))
           {
              ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、1);          //将485设置为在此处进行通信
               UARTCharPut (g_ui32UARTBase [sEvent.ui8Port]、
               RingBufReadOne (&g_sTxBuf[sEvent.ui8Port]);    //将下一个字符写入发送 FIFO。
               ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、0);          // CLR 485侦听此处
           }
       }
   }

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

    您好、Garry、

    [引用用户="Gary Armstring]ROM_GPIOPORTC_BASE、GPIO_PIN_5、1);  //在此设置485 Talk GAA Nov032017

     如果要将 PC5设置为高电平、则需要写入 ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、 GPIO_PIN_5)、或等效于 ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、0x20)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。 我将在星期一上班时进行更改。

    我想知道为什么 ROM_GPIOPinWrite()的存在会使远程任务中的 ui32Port 变量混乱? 我想 SerialSend()开头的 assert 调用会禁用 GPIO 库或 GPIO 端口吗?

    Assert (ui32Port < MAX_S2E_PORTS);//检查参数。

    UARTCharPUT()直接写入 UART,UART 应在该点传输,但它不会传输?? TM4C1294数据表第1175页

    UARTCharPut (g_ui32UARTBase [ui32Port]、ui8Char); //将该字符直接写入 FIFO。


    为什么这些呼叫在 SerialTask()中工作,而不是在 Serial (在 telent 任务下)中工作??? 我可以将示波器放在相应的引脚上、并且在串行任务中切换正在切换的引脚。 不能用了,但认为这与 include 文件有关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 Drivers Lib 用户指南第280页中找到了对 GPIOPinWrite()函数的引用。 呼叫看起来是正确的。 它在代码中的另一个位置再次工作。 未找到该调用 ROM_GPIOPinWrite()的 ROM 版本。 不知道有什么区别...
    14.2.3.46 GPIOPinWrite
    将值写入指定的引脚。
    原型:
    无效
    GPIOPinWrite (uint32_t ui32Port、uint8_t ui8引脚、uint8_t ui8Val)
    参数:
    ui32Port 是 GPIO 端口的基址。
    ui8引脚是引脚的位封装表示。
    ui8Val 是要写入引脚的值。
    描述:
    将相应的位值写入 ui8引脚指定的输出引脚。 写入引脚
    配置为输入引脚无效。
    引脚使用位封装字节指定、其中设置的每个位将引脚标识为
    字节的第0位代表 GPIO 端口管脚0、第1位代表 GPIO
    端口引脚1等。
    返回:
    无。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gary、
    将 ui8引脚视为一个门/掩码、用于将要输出的值传播到引脚上。 如果 GPIO_PIN_5 (0x20)是打开用于写入引脚5的门的掩码、则如果要设置引脚、则需要为 ui8Val 提供0x20以将 GPIO_PIN_5设置为高电平。

    您定义的 MAX_S2E_PORTS 是什么,您作为参数传递到 SerialSend()的 ui32Port 是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    MAX_S2E_Ports = 2. ENET_S2E 项目设计用于使用 telnet 端口23和26以及 UART 3和4的两个通信通道、该设计已修改为在通道1 (Telnet 端口26)上使用 UART5、因此 ui32Port 应始终为1。真的不知道为什么 ui32Port 出现混乱、 可能是堆栈问题?? 我发现我错误地认为 UART5正在工作、但实际上不是。 因此,我原来关于 UARTPut 和 ROM_GPIOPinWrite()在串行任务中工作,但在 telnet 任务中不工作的说法是不正确的。 看起来 UART 通信在每个地方都很糟糕。 我有一个新的 EK-TM4C1294XL LaunchPad、并将立即下载最新的代码、以便观察工作正常的系统。 我继承了 一位离开公司的工程师的项目。

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

     新 launchpad 在没有软件修改的情况下工作、不确定我的前代产品是如何使另一个设计变得如此糟糕。????