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.

TM4C1230E6PM 晶振16M的在485通信 波特率1200时出现怪现象

Other Parts Discussed in Thread: EK-TM4C123GXL

在485通信 波特率1200时出现怪现象

 

ROM_UARTCharPutNonBlocking(UART2_BASE, data_buffer);

while(UARTBusy(UART2_BASE));     //等待发送完成

在发送数据时,会多发几个字节 FC FC

 

如果改为

ROM_UARTCharPutNonBlocking(UART2_BASE, data_buffer);

delay();

在发送数据时,会多发几个字节 00 00

 

/**********************************************************

              串口2中断

**********************************************************/

void UART2_Handler(void)

{

         uint32_t ui32Status;

 

    ui32Status = ROM_UARTIntStatus(UART2_BASE, true);

    //获取中断状态  屏蔽中断状态

  

    ROM_UARTIntClear(UART2_BASE, ui32Status);

    //清除UART中断源

  

    while(ROM_UARTCharsAvail(UART2_BASE))

    {

        //接收数据

                            data_buffer=ROM_UARTCharGetNonBlocking(UART2_BASE);            

                           

                            data_buffer_cfg=1;

    }

}

//*****************************************************************************

//

// 主       函    数

//

//*****************************************************************************

int main(void)

{

       //uint32_t  i;

      

    sys_init();  //系统初始化           

    UART_init(); //串口初始化 

    Port_init(); //IO初始化

    ROM_IntMasterEnable();// 使能总中断

    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,~GPIO_PIN_3); //RDE=0

   

    GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_5,~GPIO_PIN_5);

    GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,~GPIO_PIN_6); //LED亮

   

    while(1)

    {

           if(data_buffer_cfg==1)

           {

                  data_buffer_cfg=0;

 

                  ROM_IntDisable(INT_UART2);

                  GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3); //RDE=1 

                            //data_buffer= 0xAA;

                            ROM_UARTCharPutNonBlocking(UART2_BASE, data_buffer);

                            //while(UARTBusy(UART2_BASE));   //等待发送完成    

                            delay();

                            ROM_IntEnable(INT_UART2);                 

                            GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,~GPIO_PIN_3); //RDE=0                    

                           

                      }

          

    }

}

  • 波特率4800以上的都正常通信

  • 楼主能把UART初始化代码发出来看看吗?

    另,建议先发送一个字节,并用示波器观看UART信号是否和预期一样?

  • /**********************************************************         IO初始化设置 **********************************************************/

     void Port_init(void)

     {   

     ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);   

     ROM_GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_5|GPIO_PIN_6);      

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

     //  ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_3); //PF3  RDE

      ROM_GPIODirModeSet(GPIO_PORTF_BASE,GPIO_PIN_3, GPIO_DIR_MODE_OUT);  

     ROM_GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_3, GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);//PF3 RDE

     }

     /**********************************************************         串口初始化设置 **********************************************************/

     void UART_init(void)

     {

     //UART2  RS485    

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);   

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);      

     GPIOPinConfigure(GPIO_PG4_U2RX);    

    GPIOPinConfigure(GPIO_PG5_U2TX);    

     ROM_GPIOPinTypeUART(GPIO_PORTG_BASE, GPIO_PIN_4 | GPIO_PIN_5);//设定PG4 PG5为串口        

     ROM_UARTConfigSetExpClk(UART2_BASE, ROM_SysCtlClockGet(), 1200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |                              UART_CONFIG_PAR_NONE)); //设定  UART for 115200, 8-N-1 operation    

     ROM_IntEnable(INT_UART2); //使能UART2中断    

    ROM_UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT);

    }

  • /**********************************************************         系统初始化 **********************************************************/

    void sys_init(void)

     {    

    ROM_FPUEnable();       //FPU使能 浮点单元    

     ROM_FPULazyStackingEnable(); //使能FPU堆栈

      ROM_SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ); //系统时钟设置

    }

     /**********************************************************         延时函数 **********************************************************/

    void  delay()

     {  

    uint32_t  i,j;

     for(i=0;i<1000;i++)

      {  

     for(j=0;j<1000;j++);

     }

     }

  • 波特率1200 单独发AA,

    如果只用以下

    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3); //RDE=1 

    ROM_UARTCharPutNonBlocking(UART2_BASE, data_buffer);

    while(UARTBusy(UART2_BASE));     //等待发送完成    

    结果显示 35

    如果加延时1MS

    SysCtlDelay(SysCtlClockGet() / (1000 * 3));

    结果显示 75

    如果加延时2MS

    结果显示 F5

    如果加延时3MS

    才显示 AA

     

    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,GPIO_PIN_3); //RDE=1 

    ROM_UARTCharPutNonBlocking(UART2_BASE, data_buffer);

    while(UARTBusy(UART2_BASE));     //等待发送完成    

    SysCtlDelay(3*SysCtlClockGet() / (1000 * 3));  

    GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_3,~GPIO_PIN_3); //RDE=0      

     

    但该命令在2400的时候,就会出现发完一个字节AA,后面会一直发字节E0

    感觉和数据关断设置有关

  • 如果不加

    SysCtlDelay(3*SysCtlClockGet() / (1000 * 3)); 

    就正常

  • 楼主您的PF3是控制RS485的发送使能吗?

    感觉好像是RS485总线有干扰。

    建议如果手上有TI的评估板,先用评估板去验证代码。或者测试一下您的板子上的CPU脚的TX RX波形,并检查RS485总线的电平,阻抗匹配等。

  • 楼主您的PF3是控制RS485的发送使能吗?是

    我感觉不是总线干扰,因为2400以上都可以

    我感觉有点像1200发送时间太长,导致冲突

    UARTCharGetNonBlocking  UARTCharPutNonBlocking

    UARTCharGet  UARTCharPut

    有什么区别,是否配对使用

    UARTCharGet能用在中断里面吗?

  • 手上没有TI的评估板

  • 如果改用UARTCharPut能正常发送,但中断中把UARTCharGetNonBlocking改为UARTCharGet,就收不到数据

  • UARTCharPutNonBlocking这个函数是串口发送,当发送FIFO中没有空间时,这个函数将跳出,并返回false。发送FIFO中有空间,则返回true,发送成功;

    UARTCharPut这个函数也是串口发送,当FIFO中没有空间时,函数将一直等待直到发送FIFO中有空间。如果发送FIFO中有可用空间,则将待发送字节写入发送FIFO。

    接收那个也是一样,UARTCharGet去收的话,接受FIFO如果没收收到数据,则会一直等待直到FIFO有数据,才会读完。UARTCharGetNonBlocking  不会等待,如果FIFO中无数据则会直接返回一个false并跳出。

     

    建议你安装最新的TivaWare,测试一下这个例程C:\ti\TivaWare_C_Series-2.1.0.12573\examples\boards\ek-tm4c123gxl\uart_echo

    测试没问题后,可以修改波特率再试试。

    建议检查一下硬件,包括串口、RS485接口芯片部分。

  • 补充一下,我用这个代码,把波特率修改为1200,在ek-tm4c123gxl这个LaunchPad上跑了一下没问题的。

  • 我早上用串口0,232 通信1200到115200都可以

    连续发送,无需加发送完成判断或延时

    而加了发送完成判断while(UARTBusy(UART2_BASE));,反而停止了,不知道为什么

     

  • 这句话加在哪里?

    仿真看一下发送不正常时程序停在哪里?观察一下相关的寄存器,看看是什么情况。