打印
[技术问题解答]

MK60DN512ZVLQ10 UART通讯异常(已解决)

[复制链接]
4264|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fl373410295|  楼主 | 2014-5-19 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 FSL_TICS_A 于 2014-5-19 14:42 编辑

型号:MK60DN512ZVLQ10

系统晶振采用有源50MHZ, 系统时钟配置为96MZH,总线时钟为48MHZ.

     1、配置UART0波特率为115200
         UART0->BDH |= 0x00;
         UART0->BDL |= 0x34;      
         UART0->C4 |= UART_C4_BRFA(2);
        和电脑调试软件能正常收发数据 。   

     2、配置UART5波特率为115200
          UART5->BDH |= 0x00;
          UART5->BDL |= 0x1A;      
          UART5->C4 |= UART_C4_BRFA(1);   
          和电脑调试软件不能正常收发数据 ,电脑接收到的数据是乱码。  
     
     以上问题是什么原因引起的呢?希望能指点一下,谢谢。(如果配置波特率为9600,都能正常收发数据)

相关帖子

沙发
FSL_TICS_Jeremy| | 2014-5-19 11:16 | 只看该作者
你好,楼主!
根据你在帖子中列出的波特率配置来看,两者确实没有区别,我先看看参考手册这么说的吧,然后回复你。

使用特权

评论回复
板凳
FSL_TICS_Jeremy| | 2014-5-19 11:32 | 只看该作者
你好,楼主!
你可以试试以下的代码来配置波特率看看。
void uart_init (UART_MemMapPtr uartch, int sysclk, int baud)
{
    register uint16 sbr, brfa;
    uint8 temp;
   
    /* Enable the clock to the selected UART */   
    if(uartch == UART0_BASE_PTR)
        SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;
    else
        if (uartch == UART1_BASE_PTR)
            SIM_SCGC4 |= SIM_SCGC4_UART1_MASK;
        else
            if (uartch == UART2_BASE_PTR)
                SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
            else
                if(uartch == UART3_BASE_PTR)
                    SIM_SCGC4 |= SIM_SCGC4_UART3_MASK;
                else
                    if(uartch == UART4_BASE_PTR)
                        SIM_SCGC1 |= SIM_SCGC1_UART4_MASK;
                    else
                        SIM_SCGC1 |= SIM_SCGC1_UART5_MASK;
                                
    /* Make sure that the transmitter and receiver are disabled while we
     * change settings.
     */
    UART_C2_REG(uartch) &= ~(UART_C2_TE_MASK
                | UART_C2_RE_MASK );

    /* Configure the UART for 8-bit mode, no parity */
    UART_C1_REG(uartch) = 0;    /* We need all default settings, so entire register is cleared */
   
    /* Calculate baud settings */
    sbr = (uint16)((sysclk*1000)/(baud * 16));
        
    /* Save off the current value of the UARTx_BDH except for the SBR field */
    temp = UART_BDH_REG(uartch) & ~(UART_BDH_SBR(0x1F));
   
    UART_BDH_REG(uartch) = temp |  UART_BDH_SBR(((sbr & 0x1F00) >> 8));
    UART_BDL_REG(uartch) = (uint8)(sbr & UART_BDL_SBR_MASK);
   
    /* Determine if a fractional divider is needed to get closer to the baud rate */
    brfa = (((sysclk*32000)/(baud * 16)) - (sbr * 32));
   
    /* Save off the current value of the UARTx_C4 register except for the BRFA field */
    temp = UART_C4_REG(uartch) & ~(UART_C4_BRFA(0x1F));
   
    UART_C4_REG(uartch) = temp |  UART_C4_BRFA(brfa);   

    /* Enable receiver and transmitter */
    UART_C2_REG(uartch) |= (UART_C2_TE_MASK
                | UART_C2_RE_MASK );
}
/**

使用特权

评论回复
地板
fl373410295|  楼主 | 2014-5-19 13:00 | 只看该作者
FSL_TICS_Jeremy 发表于 2014-5-19 11:32
你好,楼主!
你可以试试以下的代码来配置波特率看看。
void uart_init (UART_MemMapPtr uartch, int syscl ...

您好,非常感谢。参考您提供的代码做修改现在已经可以正常通讯了!
但原因还是不太清楚,是怎么造成的?

以下是修改的代码:
1、
//UART5->C1 &= ~(UART_C1_M_MASK);                        
//UART5->C1 &= ~(UART_C1_PE_MASK);                                 
//UART5->S2 &= ~UART_S2_MSBF_MASK;   
                                
替换成: UART5->C1 = 0;

2、
//UART5->BDH |= 0x00;
       
//  UART5->BDL |= 0x1A;      

//UART5->C4 |= UART_C4_BRFA(1);  (寄存器的值计算同下,只是把BDH、BDL、C4寄存器值取0计算)

//UART5->RWFIFO = UART_RWFIFO_RXWATER(1);
               
//UART5->TWFIFO = UART_TWFIFO_TXWATER(0);

替换为:               
   sbr = (uint16_t)((48000*1000)/(115200 * 16));
   temp = UART5->BDH & ~(UART_BDH_SBR(0x1F));
   UART5->BDH = temp |  UART_BDH_SBR(((sbr & 0x1F00) >> 8));
    UART5->BDL = (uint8_t)(sbr & UART_BDL_SBR_MASK);
   
    brfa = (((48000*32000)/(115200 * 16)) - (sbr * 32));
    temp = UART5->C4 & ~(UART_C4_BRFA(0x1F));
    UART5->C4  = temp |  UART_C4_BRFA(brfa);  

使用特权

评论回复
5
FSL_TICS_A| | 2014-5-19 14:42 | 只看该作者
你好,楼主!
上面的代码是飞思卡尔官方例程中对UART波特率配置的函数,你可以把对应的值打印出来,
对比一下跟你原先配置的值的区别。

使用特权

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

本版积分规则

12

主题

58

帖子

0

粉丝