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.

[参考译文] RTOS/EK-TM4C1294XL:UART9BitAddrSend 和 UART9BitAddrSet API

Guru**** 2449010 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/623691/rtos-ek-tm4c1294xl-uart9bitaddrsend-and-uart9bitaddrset-api

器件型号:EK-TM4C1294XL

工具/软件:TI-RTOS

我需要 TI 的回复。

目前,我有两个 EK-TM4C1294XL 用于在9位模式下试用 UART。

EK1是主设备、而 EK2是外设。

您能解释一下如何在主器件和外设中设置 UART9BitAddrSend 和 UART9BitAddrSet、以便在9位模式下 EK1和 EK2之间实现双向通信。 我想看到9位地址匹配中断在 EK1和 EK2中发生。 请使用 EK1和 EK2的数字示例。

 

谢谢、

Priya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    显示您现在正在执行的操作将有所帮助。

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

    以下是代码部分:

    EK1 (主设备)

    内部

    main (空)

      ROM_UARTEnable (UART5_BASE);

      ROM_UARTFIFODisable (UART5_BASE);

      ROM_UART9BitEnable (UART5_BASE);

      ROM_UART9BitAddrSet (UART5_BASE、0x43、0xFF);//x43是 EK2的虚拟外设地址。

      ROM_UART9BitAddrSend (UART5_BASE、0x43);

      //

      //启用 UART 中断。

      //

      ROM_IntEnable (INT_UART5);

      ROM_UARTIntEnable (UART5_BASE、UART_INT_9BIT | UART_INT_RX | UART_INT_RT);

    无效

    UARTIntHandler (空)

      uint32_t ui32Status;

      //

      //获取中断状态。

      //

      ui32Status = UARTIntStatus (UART5_BASE、TRUE);

      //

      //清除已发出的中断。

      //

      ROM_UARTIntClear (UART5_BASE、ui32Status);

      if ((UART_INT_RT 和 ui32Status)=UART_INT_RT){

        while (ROM_UARTBusy (UART5_BASE))

                {

                  //执行 nothng

                }

      }

      if (((UART_INT_RX 和 ui32Status)== UART_INT_RX)){

        IF (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))

                   {

                     GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);

                   }

                 其他

                   {

                     GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);

                   }

      }

      if (((UART_INT_9BIT & ui32Status)=UART_INT_9BIT){

        //接收 UART 字符

              while (ROM_UARTCharsAvail (UART5_BASE))

              {

                //

                //从 UART 读取下一个字符并将其写回 UART。

                //

                ROM_UARTCharGetNonBlocking (UART5_BASE);

                //uint32_t c = UARTCharGet (UART5_BASE);

                //

                //闪烁 LED 以显示字符传输正在发生。

                //

                IF (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))

                      {

                        GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);

                      }

                其他

                      {

                        GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);

                      }

              }

      }

    EK2 (外设)

    内部

    main (空)

    ROM_UARTEnable (UART5_BASE);

      ROM_UART9BitEnable (UART5_BASE);

      ROM_UART9BitAddrSet (UART5_BASE、0x21、0xFF);   

    //0x21主机 EK1的虚拟地址

    ROM_UART9BitAddrSend (UART5_BASE、0x21);

      ROM_UARTFIFODisable (UART5_BASE);

      //

      //启用 UART 中断。

      //

      ROM_IntEnable (INT_UART5);

      ROM_UARTIntEnable (UART5_BASE、UART_INT_RT | UART_INT_RX | UART_INT_9BIT);

    无效

    UARTIntHandler (空)

      uint32_t ui32Status;

      //

      //获取中断状态。

      //

      ui32Status = UARTIntStatus (UART5_BASE、TRUE);

      //

      //

      //清除已发出的中断。

      //

      ROM_UARTIntClear (UART5_BASE、ui32Status);

      if ((UART_INT_RT 和 ui32Status)=UART_INT_RT){

        while (ROM_UARTBusy (UART5_BASE))

               {

                 //执行 nothng

               }

      }

      if (((UART_INT_RX 和 ui32Status)== UART_INT_RX)){

        IF (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))

                  {

                    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);

                  }

                其他

                  {

                    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);

                  }

      }

      if (((UART_INT_9BIT & ui32Status)=UART_INT_9BIT)){

        //接收 UART 字符

          while (ROM_UARTCharsAvail (UART5_BASE))

          {

            //

            //从 UART 读取下一个字符         //

            ROM_UARTCharGetNonBlocking (UART5_BASE);

          }

          IF (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))

              {

                GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);

              }

            其他

              {

                GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);

              }

          RxComplete = 1;

      }

    设置图片(EK1和 EK2单独供电)。

    谢谢、

    Priya

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

    我看到两个直接的问题

    if ((UART_INT_RT 和 ui32Status)=UART_INT_RT){
    
    while (ROM_UARTBusy (UART5_BASE))
    
    {
    
    //进行通知
    
    }
    
    }
    

    您没有对接收超时做出任何响应。 因此、接收到的任何未超过接收阈值的数据都将丢失。

    if (((UART_INT_9BIT & ui32Status)=UART_INT_9BIT){
    
    //接收 UART 字符
    
    while (ROM_UARTCharsAvail (UART5_BASE))
    
    {
    
    //
    
    //从 UART 读取下一个字符并将其写回 UART。
    
    //
    
    ROM_UARTCharGetNonBlocking (UART5_BASE);
    
    //uint32_t c = UARTCharGet (UART5_BASE);
    
    //
    
    //闪烁 LED 以显示字符传输正在发生。
    
    //
    
    IF (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))
    
    {
    
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);
    
    }
    
    其他
    
    {
    
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);
    
    }
    
    }
    

    您尝试在9位中断响应中读取一个字符。 首先、您不会在9位1之后发送任何字符。 其次、即使您这样做、也不会有时间完全接收一个数据并在 FIFO 中进行读取。

    Robert