首页>>论坛 >>技术社区 >>飞思卡尔社区论坛 >>32位MCU
|
我要发帖  | 我要投票  | 我要回复  | 收藏

Uart 收发数据问题 急 急 急

版主: 大学IV队  南京老练   
Uart 收发数据问题 急 急 急
 

使用uart0_init(19200);进行uart口的初始化,当uart0_putstr("uart OK!\n");时,用串口工具得到的是:1C FC 1C 00 1C 0E FF 1C 70 FF 1C 00 70 38 E0 8E 1C 8E 1C 80 E0 70 07 E0,这串数据不是uart OK的ascii 为什么?串口得到的数据是不是就是错的?

函数备注:

void uart0_putstr(char *str)
{
 while(*str!=0)
   uart0_putchar(*str++);
 }

void uart0_putchar(char c)
{
    //Wait until space is available in the FIFO
    while (!(MCF_UART0_USR&MCF_UART_USR_TXRDY))
    {
     ;
    }

    //Send the character
    MCF_UART0_UTB = (char)c;
}
 

 

望高手帮忙了!!!

于2012-02-10 00:00前回复此主题可获赠1积分。
此主题悬赏5积分[未解决]。
 
相关主题
回复 链接 收藏
 
RE:Uart 收发数据问题 急 急 急
 
1、你的电路板和PC机之间串口连接,有连接232这种电平转换芯片吗?
2、RX和TX和PC机的RX、TX交叉连接了吗?RX-TX,TX-RX
3、PC机串口波特率和MCU的波特率是否一致?
4、如果上述几步没有问题,请问一下MCU系统时钟的频率是多少?
 
站在ARM的平台上看DSP,我们还需要奋进。
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
串口助手那里 你是不是点击16进制显示了啊
 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 2 楼 于2012-02-07 02:15:24发表:
1、你的电路板和PC机之间串口连接,有连接232这种电平转换芯片吗?
2、RX和TX和PC机的RX、TX交叉连接了吗?RX-TX,TX-RX
3、PC机串口波特率和MCU的波特率是否一致?
4、如果上述几步没有问题,请问一下MCU系统时钟的频率是多少?
 

谢谢你的快速回复!

1。板子和电脑之间使用串口线直接连接,板子主芯片和板子上的串口之间有芯片(ADM3202)连接。

2。直接使用的串口连接线。

3。MCU的波特率怎么看?

是这个宏定义吗??

#define TERMINAL_BAUD   19200
#define UART_BAUD    TERMINAL_BAUD /*  115200*/

4。#define SYSTEM_CLOCK   80 /* system bus frequency in MHz */   芯片是MCF52258。

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 3 楼 于2012-02-07 02:33:13发表:
串口助手那里 你是不是点击16进制显示了啊
 

是数据不正确。串口助手里选择ASCII就显示乱码或者不显示。

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 2 楼 于2012-02-07 02:15:24发表:
1、你的电路板和PC机之间串口连接,有连接232这种电平转换芯片吗?
2、RX和TX和PC机的RX、TX交叉连接了吗?RX-TX,TX-RX
3、PC机串口波特率和MCU的波特率是否一致?
4、如果上述几步没有问题,请问一下MCU系统时钟的频率是多少?
 

看电路图,得知主芯片上的TXD0,通过ADM3202ARN后,连接到了板子上串口的pin2( 接收数据 (RXD)),说明第二个问题是正确的,对吗? 就是我的板子上实现了交叉连接,然后用9针串口线连接到PC机器上,这样有哪里还是错误的,请你指出,谢谢!!

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 5 楼 于2012-02-07 03:24:57发表:
回复第 3 楼 于2012-02-07 02:33:13发表:
串口助手那里 你是不是点击16进制显示了啊
 

是数据不正确。串口助手里选择ASCII就显示乱码或者不显示。

 

你没用mqx  是吧

你看看自己设置寄存器的时候 波特率 是多少啊,多数默认是115200  没有奇偶校验   一个停止位

再就是 好像系统时钟 跟波特率 没大关系。。。。你设置是多大波特率 就是多大   系统时钟变了  他也会自动还是115200  的 自己试试吧   乱的话 有可能是  波特率 

刚开始我以为你 16进制显示呢 你用的是 demo板子 还是 自己焊接的 啊 如果自己焊接的话 检查下硬件电路   用示波器 也可以看数据的 看看电压 有问题吗  应该多数是程序 问题   我的小意见。。。呵呵

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 7 楼 于2012-02-07 03:26:01发表:
回复第 5 楼 于2012-02-07 03:24:57发表:
回复第 3 楼 于2012-02-07 02:33:13发表:
串口助手那里 你是不是点击16进制显示了啊
 

是数据不正确。串口助手里选择ASCII就显示乱码或者不显示。

 

你没用mqx  是吧

你看看自己设置寄存器的时候 波特率 是多少啊,多数默认是115200  没有奇偶校验   一个停止位

再就是 好像系统时钟 跟波特率 没大关系。。。。你设置是多大波特率 就是多大   系统时钟变了  他也会自动还是115200  的 自己试试吧   乱的话 有可能是  波特率 

刚开始我以为你 16进制显示呢 你用的是 demo板子 还是 自己焊接的 啊 如果自己焊接的话 检查下硬件电路   用示波器 也可以看数据的 看看电压 有问题吗  应该多数是程序 问题   我的小意见。。。呵呵

 

非常感谢你的建议!!

我还没有用MQX,你有串口的例子吗??可以发给我看看吗??刚开始接触这些,总是遇到很多问题,谢谢你的帮助!!

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
这个真没有。。。我都是用mqx的 里面都是写好的 不需要一个个配置的
你仔细找找别人可能也有写的 有什么的不清楚的 你再问我 qq673299711
 
回复 链接 收藏
 
RE:Uart 收发数据问题 急 急 急
 
你还是把工程发出来吧。这样好找问题。我也可以帮你测试一下。
 
站在ARM的平台上看DSP,我们还需要奋进。
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 10 楼 于2012-02-08 01:52:51发表:
你还是把工程发出来吧。这样好找问题。我也可以帮你测试一下。
 

附件中是代码,你帮我测试下!谢谢安版主!!

附件:请先登陆查看附件!
 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 10 楼 于2012-02-08 01:52:51发表:
你还是把工程发出来吧。这样好找问题。我也可以帮你测试一下。
 

我用的板子是我们硬件工程师参考MCF52259 evb版自己焊接的,使用的芯片是MCF52258,系统时钟频率是80Mhz。

 
回复 链接 收藏
 
RE:Uart 收发数据问题 急 急 急
 
1、外部晶振是多大?
2、我看不到你的main函数,你怎么调用的?
3、有2种肯那个,系统时钟不正确,IO口配置不正确。
 
站在ARM的平台上看DSP,我们还需要奋进。
回复 链接 收藏
 
RE:Uart 收发数据问题 急 急 急
 
你应该调用这个函数:
uart_init (int uartch, int sysclk, int baud)
在uart.h里面。
 
站在ARM的平台上看DSP,我们还需要奋进。
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 13 楼 于2012-02-09 09:03:03发表:
1、外部晶振是多大?
2、我看不到你的main函数,你怎么调用的?
3、有2种肯那个,系统时钟不正确,IO口配置不正确。
 

main函数在\src\projects\example位置里面。

外部晶振是48MHz

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 14 楼 于2012-02-09 09:07:12发表:
你应该调用这个函数:
uart_init (int uartch, int sysclk, int baud)
在uart.h里面。
 

还有个问题,想问下你,

主芯片上的外部晶振,是48M的,为什么我用示波器量不出来,需要在软件哪里去设置时钟?

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 16 楼 于2012-02-09 09:13:24发表:
回复第 14 楼 于2012-02-09 09:07:12发表:
你应该调用这个函数:
uart_init (int uartch, int sysclk, int baud)
在uart.h里面。
 

还有个问题,想问下你,

主芯片上的外部晶振,是48M的,为什么我用示波器量不出来,需要在软件哪里去设置时钟?

 

你看下你的这个芯片资料 他的波特率的设置 和系统时钟有没有关系  这还看不出来吗

你想要系统时钟设置的话 我给你哥函数  这个是mqx下 写好的时钟初始化 函数 只需要你改数值

而且告诉你怎么去改了 

附件:请先登陆查看附件!
 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 13 楼 于2012-02-09 09:03:03发表:
1、外部晶振是多大?
2、我看不到你的main函数,你怎么调用的?
3、有2种肯那个,系统时钟不正确,IO口配置不正确。
 

外部晶振为48Mhz,

如果在程序的初始化mcf5225x_init函数中不进行pll的初始化,晶振不振.

如果添加了pll初始化,函数如下:

void
mcf5225x_pll_init(void)
{
    MCF_CLOCK_OCLR = 0xC0;    //turn on crystal
    MCF_CLOCK_CCLR = 0x00;    //switch to crystal    
    MCF_CLOCK_OCHR = 0x00;    //turn off relaxation osc

     /* The PLL pre divider - 48MHz / 6 = 8MHz */
    MCF_CLOCK_CCHR =0x05;

    MCF_CLOCK_SYNCR &= ~(MCF_CLOCK_SYNCR_PLLEN);
    MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_CLKSRC | MCF_CLOCK_SYNCR_PLLMODE; 

     //这里对8M*10=80Mhz
    MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_MFD(3) | MCF_CLOCK_SYNCR_RFD(0); 
 
 MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_PLLEN; 
 while (!(MCF_CLOCK_SYNSR & MCF_CLOCK_SYNSR_LOCK))
 {
 }
}

为什么我从48M晶振两侧量出来的是16Mhz呢?

请帮我看下,哪里出现问题了? 谢谢...

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
。。。。。。。。。。。。。。这个从何说起呢
我给你的这个写好的肯定是对的 只要不超出多余80M 都是正常工作的
至于你说的测出不对
第一 你别看原理图 你看你实际的板子是不是48M的
第二 是不是测错了啊,,,,,,
第三 我就蒙圈了,,,
最后 你这都不是你串口数据的问题
 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 19 楼 于2012-02-10 04:24:34发表:
。。。。。。。。。。。。。。这个从何说起呢
我给你的这个写好的肯定是对的 只要不超出多余80M 都是正常工作的
至于你说的测出不对
第一 你别看原理图 你看你实际的板子是不是48M的
第二 是不是测错了啊,,,,,,
第三 我就蒙圈了,,,
最后 你这都不是你串口数据的问题
 

嘿嘿,上面安版主又说起到,串口数据不对,系统时钟可能存在问题!

我板子上的晶振就是48MHz的,只是我现在用pll将系统时钟调到了80Mhz,按照我刚才提供的代码,我不知道是否是正确的?

我如何验证是否将core调到了80Mhz、??

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 17 楼 于2012-02-09 10:59:34发表:
回复第 16 楼 于2012-02-09 09:13:24发表:
回复第 14 楼 于2012-02-09 09:07:12发表:
你应该调用这个函数:
uart_init (int uartch, int sysclk, int baud)
在uart.h里面。
 

还有个问题,想问下你,

主芯片上的外部晶振,是48M的,为什么我用示波器量不出来,需要在软件哪里去设置时钟?

 

你看下你的这个芯片资料 他的波特率的设置 和系统时钟有没有关系  这还看不出来吗

你想要系统时钟设置的话 我给你哥函数  这个是mqx下 写好的时钟初始化 函数 只需要你改数值

而且告诉你怎么去改了 

 

压缩包里面就一个.h文件,没有其他文件了吗?

 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
你不就要时钟设置的吗 ,,,,无语了 有事qq说 在这不太方便
 
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 14 楼 于2012-02-09 09:07:12发表:
你应该调用这个函数:
uart_init (int uartch, int sysclk, int baud)
在uart.h里面。
 

安版主,我的工程有没有进展啊?

系统时钟和波特率 自己认为都没有设置错误

从示波器上看到发出数据波形 就是错误的数据

 
回复 链接 收藏
 
RE:Uart 收发数据问题 急 急 急
 
我看了你的程序了,你的程序中并没有初始化过时钟,那么默认是时钟可能是48MHz,你仿真的时候,可以在debug选项下面选择查看时钟,就能查看到当前时钟,或者通过仿真的command窗口,在开始仿真的时候会输出时钟频率。
 
站在ARM的平台上看DSP,我们还需要奋进。
回复 链接 收藏
 
回复:Uart 收发数据问题 急 急 急
 
回复第 24 楼 于2012-02-14 03:30:58发表:
我看了你的程序了,你的程序中并没有初始化过时钟,那么默认是时钟可能是48MHz,你仿真的时候,可以在debug选项下面选择查看时钟,就能查看到当前时钟,或者通过仿真的command窗口,在开始仿真的时候会输出时钟频率。
 

安老大,由于我的工具调试有问题,我就采取了其他的方法(DMA timer看pin脚电平的时间)获得当前时钟频率,得到的不是80MHZ,也不是48Mhz,而是27Mhz左右(另:直接测量芯片管脚43,clockout,得到的也是27Mhz),在软件中我用pll将频率拉升至80Mhz的,代码和referencemanual中讲的一致,为什么频率会出现27Mhz,我很疑惑,不知道是什么原因?

void mcf5225x_pll_init(void)

 MCF_CLOCK_OCLR = 0xC0;    //turn on crystal  //0xF0
 MCF_CLOCK_CCLR = 0x00;    //switch to crystal
  MCF_CLOCK_OCHR = 0x00;    //turn off relaxation osc

 /* The PLL pre divider - 48MHz / 6 = 8MHz */
 MCF_CLOCK_CCHR =0x05; 
 
 /* Multiply 48Mhz reference crystal /CCHR by 10 to acheive system clock of 80Mhz */
 MCF_CLOCK_SYNCR &= ~(MCF_CLOCK_SYNCR_PLLEN);
  MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_CLKSRC | MCF_CLOCK_SYNCR_PLLMODE; 
 //80
 MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_MFD(3) | MCF_CLOCK_SYNCR_RFD(0);
 
 MCF_CLOCK_SYNCR |= MCF_CLOCK_SYNCR_PLLEN; 
 while (!(MCF_CLOCK_SYNSR & MCF_CLOCK_SYNSR_LOCK))
 {
 
 }
}

 
回复 链接 收藏
 
我要发帖  | 我要投票  | 我要回复  | 收藏