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.

[参考译文] F28M35H52C:尝试使用主皮质m3内核的UART1开发简单的Modbus ASCII应用程序。 在Linux Mint上使用CCS 6.0。

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/617853/f28m35h52c-trying-to-develop-a-simple-modbus-ascii-application-using-uart1-of-master-cortex-m3-core-using-ccs-6-0-on-linux-mint

部件号:F28M35H52C

应用程序同时使用接收中断和发射中断。 我在禁用之前遇到接收问题,因此禁用了FIFO操作。  

 

我一直在使用从我的笔记本电脑传输8字节的Modbus主设备测试此应用程序。 我在控制器上接收8个字节,并在传输一些响应之前进行一些处理。

 

现在,传输是我被卡住的地方,当我试图传输一些数据时,我在UARTCharPutt (数据)功能处有一个中断点,并且单步期望在接收(笔记本电脑)终端上看到相同的数据。 但我看不到传输的任何内容,有时当我在没有任何中断点的情况下运行代码时,我会看到数据是传输的,但不是按发送数据的磁体顺序传输的。

 

我已经尝试了F28M35H控制器TI参考手册UART部分中提到的所有可能的选项。  

 

请查找此帖子中附加的应用程序项目(.7z), 任何帮助都可以指出我在哪里落后?e2e.ti.com/.../Modbus_2D00_Slave.7z

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

    Andres,

    如果您发布相关代码的小片段,这将很有帮助,阅读整个项目可能非常耗时。

    我不知道断点如何在M3上工作,它们可能会干扰UART功能。 我将了解我在这个主题上可以找到的内容。

    至于以错误顺序传输的数据,您能否提供一个示例?

      • 您向UARTCharPut函数提供哪些类型的数据(int,char,uint等)?
      • 是否可以在传输前立即使用内存浏览器读取数据以检查数据是否正确?

    此致,
    科迪

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

    感谢Cody的回复,

     

    这是我要做的事情,

     

    1.按照参考手册中的说明初始化UART1,这可以在${PROJECT }/src/UART_Interface.c文件中看到。 初始化UART1的确切代码片段如下所示:

     

       void InitUART 1 (void){

     

      SysCtlPeripheralEnable(sysctl_Periph_UART1);

      SysCtlPeripheralEnable(sysctl_Periph_GPIOD);

      InitMasterInterrupt();

      GPIOPinConfigure(GPIO_PD0_U1RX);

      GPIOPinConfigure(GPIO_PD1_U1TX);

      GPIOPinTypeUART (GPIO _PORTD_BASE,GPIO PIN_0 | GPIO PIN_1);

      UARTConfigSetExpClk (UART1_BASE,SysClockGet (system_clock_speed),9600,

                             (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |

                             UART_CONFIG_PAR_NONE));

     

      //启用UART0中断。

       IntRegister (INT_UART1,UART1IntHandler);

       IntEnable (INT_UART1);

       UARTIntEnable (UART1_BASE,UART_INT_RX | UART_INT_TX);

     }


    注:我已通过注释掉UARTEnable函数内的FIFO启用宏来禁用FIFO模式。 禁用FIFO后,我开始按从Master发送的顺序接收数据。  

     

    2.我已在 ${PROJECT }/src/UART_Interrupt.c 文件中定义了UART1中断处理程序。 此处理程序用于处理RX和TX生成的中断。 可以在下面看到Handler的代码片段:  

     

       void UART1IntHandler (void)

      {

        未签名的long ulStatus;



         ulStatus = UARTINStatus (UART1_BASE,TRUE);





         IF (0x10和ulStatus)

        {

           UART1Buffer[UART1Count++] = UARTCharGet (UART1_BASE); //将我收到的字节数据存储在缓冲区中!  



           IF (UART计数>30)

          {

          UART 1计数= 0;

          }

          tx_cnt = 0;

        }

        否则

        {

               tx_cnt=1;

        }



        UARTIntClear (UART1_BASE,ulStatus);

      }

     

    3.收到数据后,我先进行Modbus数据处理,然后再将一些数据传输回主机。 传输在文件 ${project}/src/UART_Interface.c.中定义  代码片段如下所示:


    extern unsigned int ts_cnt;

    void WriteToUART1 (const unsigned char pucBuffer)

    //UARTCharPut (UART1_BASE,pucBuffer);      //在使用TX中断方法之前先使用此方法,如下所示,在while (1)之后  

     

    同时(1)

    IF (UART SpaceAvail (UART1_BASE))

    UARTCharPutt (UART1_BASE,pucBuffer);

    while (!tx_cnt);

    tx_cnT=0;

    返回;

    }

    }

    }

     

    • 您向UARTCharPut函数提供哪些类型的数据(int,char,uint等)?

     如上所述(代码片段3),我使用的是char数据。  

    • 是否可以在传输前立即使用内存浏览器读取数据以检查数据是否正确?

    我没有尝试使用内存浏览器, 但我在传输时使用断点检查寄存器窗口中的UARTDR寄存器。在这里我看到,在我步过UARTChrPut()函数后,数据不会被刷新。也就是说,我在UARTDR寄存器中看不到我尝试传输的相同数据。 因此,这会导致数据传输丢失或按顺序在主中继器上接收数据。


    下面是一个示例场景,当我说收到的数据顺序错误时:


    例如:假设我在禁用FIFO的情况下尝试通过UART1逐字节传输0123456789,因此我应该期望在主终端上以相同的顺序接收数据。 但是,我有时收到1.2087万,但有一些数据丢失和订单错误,有时收到0123465897。


    我没有考虑使用DMA,但我认为这种简单的应用程序不需要DMA? 请给出建议。  


    谢谢

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

    Andres,

    让我们尝试限制问题的位置。 您能否使用示波器来确保传输正确的帧?

    您可以尝试的另一项操作是环回,将TX连接到RX,将RX连接到同一  设备上另一个UART或SCI模块的TX。


    此致,
    科迪