搜索
bottom↓
回复: 28

LPC1768的串口见鬼,接USB转TTL后乱码,大家谁知道原因?

[复制链接]

出0入0汤圆

发表于 2014-12-23 11:03:24 | 显示全部楼层 |阅读模式
LPC1768芯片串口TTL电平
除了PL2303正常,CH340等别的芯片不正常,什么原因?
PS:CH340模块,是好的。接STM32 STM8 LPC1114 AVR PIC 等都正常,CH340自己收发或与PL2303收发也正常
LPC1768接别的USB转TTL芯片也不正常,只有接PL2303正常。

各位坛友谁有LPC1768,能不能测试下与非PL2303转TTL芯片,对接是不是正常。

出235入8汤圆

发表于 2014-12-23 13:49:40 | 显示全部楼层
如果你有示波器的话,可以测一下信号频率是否对。
一般情况是你的串口波特率没设准。LPC1768有一个波特率的校对

出0入0汤圆

发表于 2014-12-23 13:54:43 | 显示全部楼层
用CP2102试试

出0入0汤圆

发表于 2014-12-23 14:00:31 | 显示全部楼层
可以增加共模电感试试

出0入0汤圆

 楼主| 发表于 2014-12-23 16:24:36 | 显示全部楼层
z31com 发表于 2014-12-23 13:49
如果你有示波器的话,可以测一下信号频率是否对。
一般情况是你的串口波特率没设准。LPC1768有一个波特率的 ...

你是指测哪个频率,串口通信的吗?

出0入0汤圆

 楼主| 发表于 2014-12-23 16:54:29 | 显示全部楼层
  1. #include "lpc17xx.h"                              /* LPC17xx definitions    */
  2. #include "uart.h"

  3. #define FOSC                        12000000                            /*  Õñµ´Æ÷ƵÂÊ                  */

  4. #define FCCLK                      (FOSC  * 8)                          /*  Ö÷ʱÖÓƵÂÊ<=100Mhz          */
  5.                                                                         /*  FOSCµÄÕûÊý±¶                */
  6. #define FCCO                       (FCCLK * 3)                          /*  PLLƵÂÊ(275Mhz~550Mhz)      */
  7.                                                                         /*  ÓëFCCLKÏàͬ£¬»òÊÇÆäµÄżÊý±¶ */
  8. #define FPCLK                      (FCCLK / 4)                          /*  ÍâÉèʱÖÓƵÂÊ,FCCLKµÄ1/2¡¢1/4*/
  9.                                                                         /*  »òÓëFCCLKÏàͬ               */

  10. #define UART0_BPS     115200                                             /* ´®¿Ú0ͨÐŲ¨ÌØÂÊ             */
  11. #define UART2_BPS     115200                                             /* ´®¿Ú2ͨÐŲ¨ÌØÂÊ             */
  12. /*********************************************************************************************************
  13. ** Function name:       UART0_Init
  14. ** Descriptions:        °´Ä¬ÈÏÖµ³õʼ»¯´®¿Ú0µÄÒý½ÅºÍͨѶ²ÎÊý¡£ÉèÖÃΪ8λÊý¾Ý룬1λֹͣ룬ÎÞÆæżУÑé
  15. ** input parameters:    ÎÞ
  16. ** output parameters:   ÎÞ
  17. ** Returned value:      ÎÞ
  18. *********************************************************************************************************/
  19. void UART0_Init (void)
  20. {
  21.         uint16_t usFdiv;
  22.     /* UART0 */
  23.     LPC_PINCON->PINSEL0 |= (1 << 4);             /* Pin P0.2 used as TXD0 (Com0) */
  24.     LPC_PINCON->PINSEL0 |= (1 << 6);             /* Pin P0.3 used as RXD0 (Com0) */
  25.   
  26.           LPC_UART0->LCR  = 0x83;                      /* ÔÊÐíÉèÖò¨ÌØÂÊ               */
  27.     usFdiv = (FPCLK / 16) / UART0_BPS;           /* ÉèÖò¨ÌØÂÊ                   */
  28.     LPC_UART0->DLM  = usFdiv / 256;
  29.     LPC_UART0->DLL  = usFdiv % 256;
  30.     LPC_UART0->LCR  = 0x03;                      /* Ëø¶¨²¨ÌØÂÊ                   */
  31.     LPC_UART0->FCR  = 0x06;                                   
  32. }
复制代码

出235入8汤圆

发表于 2014-12-23 17:38:25 | 显示全部楼层
你看一下,串口那章,4.16节,有一个小数分频

出0入0汤圆

发表于 2014-12-24 15:55:03 | 显示全部楼层
我也遇到了一样的问题,不用太纠结。估计和误差有关系。

出0入0汤圆

 楼主| 发表于 2014-12-24 20:16:30 | 显示全部楼层
lujan1 发表于 2014-12-24 15:55
我也遇到了一样的问题,不用太纠结。估计和误差有关系。

怎么来解决这个问题,什么原因,程序的问题吗?

出0入0汤圆

发表于 2014-12-24 20:44:54 来自手机 | 显示全部楼层
电平匹配不?

出0入0汤圆

 楼主| 发表于 2014-12-24 21:49:45 | 显示全部楼层

电平是匹配的

出235入8汤圆

发表于 2014-12-27 19:34:25 | 显示全部楼层
下面是我以前做的东西,还算比较准。
if (PortNum == 0)
    {
//        LPC_PINCON->PINSEL0 &= ~0x000000F0;
//        LPC_PINCON->PINSEL0 |= 0x00000050;  /* RxD0 is P0.3 and TxD0 is P0.2 */

        LPC_PINCON->PINSEL0 |= (1 << 4);         /* Pin P0.2 used as TXD0 (Com0) */
        LPC_PINCON->PINSEL0 |= (1 << 6);         /* Pin P0.3 used as RXD0 (Com0) */

        /* By default, the PCLKSELx value is zero, thus, the PCLK for
           all the peripherals is 1/4 of the SystemFrequency. */
        /* Bit 6~7 is for UART0 */
        pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03;
        switch (pclkdiv)
        {
        case 0x00:
        default:
            pclk = SystemFrequency / 4;
            break;
        case 0x01:
            pclk = SystemFrequency;
            break;
        case 0x02:
            pclk = SystemFrequency / 2;
            break;
        case 0x03:
            pclk = SystemFrequency / 8;
            break;
        }

        LPC_UART0->LCR = 0x83;                         /* 8 bits, no Parity, 1 Stop bit */
        Fdiv           = (pclk * 100 / 16) / baudrate; /*baud rate */
        //注意:系统频率变更的以下的参数也需变,现频率为80M
        if (Fdiv % 100 != 0)
        {
            switch (baudrate)
            {
            case 115200:
                Fdiv           = 8;
                LPC_UART0->DLM = Fdiv / 256;
                LPC_UART0->DLL = Fdiv % 256;
                LPC_UART0->FDR = (5 + (14 << 4));
                break;
            case 57600:
                Fdiv           = 13;
                LPC_UART0->DLM = Fdiv / 256;
                LPC_UART0->DLL = Fdiv % 256;
                LPC_UART0->FDR = (2 + (3 << 4));
                break;
            case 38400:
                Fdiv           = 20;
                LPC_UART0->DLM = Fdiv / 256;
                LPC_UART0->DLL = Fdiv % 256;
                LPC_UART0->FDR = (5 + (8 << 4));
                break;
            case 19200:
                Fdiv           = 47;
                LPC_UART0->DLM = Fdiv / 256;
                LPC_UART0->DLL = Fdiv % 256;
                LPC_UART0->FDR = (5 + (13 << 4));
                break;
            case 9600:
                Fdiv           = 80;
                LPC_UART0->DLM = Fdiv / 256;
                LPC_UART0->DLL = Fdiv % 256;
                LPC_UART0->FDR = (5 + (8 << 4));
                break;
            default:
                Fdiv           = 80;
                LPC_UART0->DLM = Fdiv / 256;
                LPC_UART0->DLL = Fdiv % 256;
                LPC_UART0->FDR = (5 + (8 << 4));
                break;
            }
        }
        else
        {
            Fdiv           = Fdiv / 100;
            LPC_UART0->DLM = Fdiv / 256;
            LPC_UART0->DLL = Fdiv % 256;
        }

        LPC_UART0->LCR = 0x03;          /* DLAB = 0 */
        LPC_UART0->FCR = 0x87;          /* Enable and reset TX and RX FIFO. */

        NVIC_EnableIRQ(UART0_IRQn);
        NVIC_SetPriority(UART0_IRQn, 2);

        //LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS;        /* Enable UART0 interrupt */
        LPC_UART0->IER = IER_RBR | IER_RLS;                                     //
        return(TRUE);
    }

出235入8汤圆

发表于 2014-12-27 19:37:24 | 显示全部楼层
上传附件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-12-28 11:54:33 | 显示全部楼层

谢谢,还是波特率有误差引起的乱码,由此可见,PL2303容错能力很强啊,CH340最差

出0入0汤圆

发表于 2014-12-28 12:03:52 | 显示全部楼层
楼主说Pl2003容错能力强,但不能得出CH340最差的结论吧。

出0入0汤圆

 楼主| 发表于 2014-12-28 13:07:38 | 显示全部楼层
lsn_tj 发表于 2014-12-28 12:03
楼主说Pl2003容错能力强,但不能得出CH340最差的结论吧。

波特率差那么多,PL2303能工作,别的不工作,不能说明点问题吗?

出0入0汤圆

发表于 2014-12-28 13:51:33 | 显示全部楼层
你先说的是CH340和别的USB转TTL芯片都试过了,都不行的。
只有PL2003可以。在这一点上,只不过可以说PL2003最好,而不能直接说CH340最差啊。我还以为你又比较过CH340和其他的USB转TTL芯片呢,看来是没有了。

出0入0汤圆

 楼主| 发表于 2014-12-28 15:36:24 | 显示全部楼层
lsn_tj 发表于 2014-12-28 13:51
你先说的是CH340和别的USB转TTL芯片都试过了,都不行的。
只有PL2003可以。在这一点上,只不过可以说PL2003 ...

容错能力:这个我是买了好几种芯片测试的,FT232 CP2102 CH340 PL2303等,其中CH340在波特率一样的情况下,不能正常工作。

出0入0汤圆

发表于 2014-12-28 15:48:35 | 显示全部楼层
“LPC1768接别的USB转TTL芯片也不正常,只有接PL2303正常。”那这句话如何理解?

出0入0汤圆

 楼主| 发表于 2014-12-28 17:33:51 | 显示全部楼层
lsn_tj 发表于 2014-12-28 15:48
“LPC1768接别的USB转TTL芯片也不正常,只有接PL2303正常。”那这句话如何理解? ...

是这个意思,以前确实只有PL2303,正常工作,经过z31com指点,发现小数分频器没有设置,我设置了(可能算的不对),发现只有CH340不能工作了,别的正常。
后来参考z31com程序,修改下然后CH340也能工作了,所以才得出了以上的结论。
PS:我现在没有好的方法测试,容错能力,哪位大师可以有能力弄个小软件,可调微调波特率的,然后严格的测试下。看看波特率偏差多少后,芯片就乱码了。当然容错能力不代表芯片的稳定性。

出235入8汤圆

发表于 2015-1-3 11:37:10 | 显示全部楼层
不用小软件,用示波器来测呀,

出235入8汤圆

发表于 2015-1-3 11:38:31 | 显示全部楼层
1、测一下数据的上升沿时间,下降沿时间,
2、测一下频率。

出0入0汤圆

 楼主| 发表于 2015-1-3 19:16:10 | 显示全部楼层
z31com 发表于 2015-1-3 11:38
1、测一下数据的上升沿时间,下降沿时间,
2、测一下频率。

我想,微调波特率,然后看看哪个芯片先挂掉,但是微调波特率的信号怎么发生?从使用结果看,不同的USB转TTL芯片,容错能力有有区别的。

出0入34汤圆

发表于 2015-1-3 23:37:50 | 显示全部楼层
kxb 发表于 2015-1-3 19:16
我想,微调波特率,然后看看哪个芯片先挂掉,但是微调波特率的信号怎么发生?从使用结果看,不同的USB转T ...

看来楼主的目标貌似在帮各厂家做 Debug 的工作啊! 呵呵~

出0入0汤圆

发表于 2015-1-4 02:21:03 来自手机 | 显示全部楼层
有的U转串工作在3.3V时接收端配的电阻不对,触发电压会变化,可以试试在U转串的接收端串个电阻,1.5K左右

出0入0汤圆

 楼主| 发表于 2015-1-4 08:41:48 | 显示全部楼层
xyz543 发表于 2015-1-3 23:37
看来楼主的目标貌似在帮各厂家做 Debug 的工作啊! 呵呵~

因为调试程序中,发现了问题,所以就想知道各芯片究竟差异在哪

出235入8汤圆

发表于 2015-1-4 12:34:11 | 显示全部楼层
kxb 发表于 2015-1-3 19:16
我想,微调波特率,然后看看哪个芯片先挂掉,但是微调波特率的信号怎么发生?从使用结果看,不同的USB转T ...

先设小数点分频吧,先小调一下
有示波器吗?

出0入0汤圆

 楼主| 发表于 2015-1-4 12:36:47 | 显示全部楼层
z31com 发表于 2015-1-4 12:34
先设小数点分频吧,先小调一下
有示波器吗?

1768我调好了,就是小数分频的问题,现在可以兼容所有的USB转TTL了。

出0入34汤圆

发表于 2015-1-4 16:36:25 | 显示全部楼层
kxb 发表于 2015-1-4 08:41
因为调试程序中,发现了问题,所以就想知道各芯片究竟差异在哪

嗯,理解,跟您开个小玩笑的,勿介意。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 17:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表