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

[复制链接]
1072|27
手机看帖
扫描二维码
随时随地手机跟帖
heweibig| | 2019-4-17 19:36 | 显示全部楼层
楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
lizye|  楼主 | 2019-4-17 19:40 | 显示全部楼层
波特率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));
2400的时候,就正常

使用特权

评论回复
lizye|  楼主 | 2019-4-17 19:42 | 显示全部楼层
/**********************************************************         串口初始化设置 **********************************************************/

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

}
/**********************************************************

              串口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                    

                           

                      }

         

    }

}

使用特权

评论回复
zhaoxqi| | 2019-4-17 19:45 | 显示全部楼层
建议发送一个字节,用示波器看下波形

使用特权

评论回复
lizye|  楼主 | 2019-4-17 19:49 | 显示全部楼层
波特率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));

就正常

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

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

使用特权

评论回复
wyjie| | 2019-4-17 19:54 | 显示全部楼层
然后呢?你是怎么应对这个的呢

使用特权

评论回复
yszong| | 2019-4-17 19:58 | 显示全部楼层
我早上用串口0,232 通信1200到115200都可以

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

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

使用特权

评论回复
zhenykun| | 2019-4-17 20:01 | 显示全部楼层
这个是跟主频率或者UART所用的频率是相关的

使用特权

评论回复
heweibig| | 2019-4-17 20:05 | 显示全部楼层
波特率不同,中间的延时要求是不同的

使用特权

评论回复
午夜粪车| | 2019-4-17 20:09 | 显示全部楼层

这么低的波特率?

使用特权

评论回复
huangchui| | 2019-4-17 20:12 | 显示全部楼层
可以使用1m的波特率试试看。

使用特权

评论回复
yszong| | 2019-4-17 20:15 | 显示全部楼层
波特率存在问题

使用特权

评论回复
wyjie| | 2019-4-17 20:19 | 显示全部楼层
时钟存在偏差,数据应该不对。

使用特权

评论回复
huangchui| | 2019-4-17 20:21 | 显示全部楼层
时钟不是很完整的。

使用12M的晶振试试看。

使用特权

评论回复
jiaxw| | 2019-4-17 20:25 | 显示全部楼层

你可以通过波特率反推时钟

使用特权

评论回复
jiaxw| | 2019-4-18 15:41 | 显示全部楼层

建议使用12M的晶振试试看。

使用特权

评论回复
dengdc| | 2019-4-18 15:45 | 显示全部楼层
时钟不是整数,存在问题。

使用特权

评论回复
zhenykun| | 2019-4-18 15:48 | 显示全部楼层
楼主发送的数据是不是不完整的。

使用特权

评论回复
jiaxw| | 2019-4-18 15:52 | 显示全部楼层
这样的频率分频不准。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

852

主题

9757

帖子

2

粉丝