打印
[ARM7]

LPC2132串口通讯问题,串口助手调试发送接收程序,接收乱码,无接收

[复制链接]
2872|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
庄吉|  楼主 | 2013-10-15 20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用串口发送数据给MCU,MCU就把数据返回给串口助手显示,出现狂接收00 00 00,有时又是乱码,有时没有接收,在MCU的TXD,RXD加上拉电阻也不行。MCU的RXD有 4.6V,TXD有 2.6V最后在TXD和RXD之间串联了一个220欧电阻,通讯正常,MCU有点温度。为什么TXD和RXD之间串联电阻才行???求大神啊,迷茫中......

相关帖子

沙发
阿南| | 2013-10-15 22:27 | 只看该作者
是否有接RS232转换芯片?

使用特权

评论回复
板凳
庄吉|  楼主 | 2013-10-16 09:00 | 只看该作者
阿南 发表于 2013-10-15 22:27
是否有接RS232转换芯片?

:L用了MAX232啊,会不会是因为MAX232质量问题啊

使用特权

评论回复
地板
tanshi_li| | 2013-10-16 10:46 | 只看该作者
多半是max232芯片的问题,测一下max232到pc的rx与tx的波形电压是否正常.

使用特权

评论回复
5
阿南| | 2013-10-16 14:34 | 只看该作者
对,或者直接换一片RS232芯片看看,这个假货特别多

使用特权

评论回复
6
庄吉|  楼主 | 2013-10-17 10:53 | 只看该作者
阿南 发表于 2013-10-16 14:34
对,或者直接换一片RS232芯片看看,这个假货特别多

换了,不行。MAX232给LPC2132/MAR7,TTL信号5V电平,LPC2132/ARM7给MAX232  3.3V电平,会不会是电压不匹配啊?

使用特权

评论回复
7
庄吉|  楼主 | 2013-10-17 10:54 | 只看该作者
tanshi_li 发表于 2013-10-16 10:46
多半是max232芯片的问题,测一下max232到pc的rx与tx的波形电压是否正常.

换了,不行。MAX232给LPC2132/MAR7,TTL信号5V电平,LPC2132/ARM7给MAX232  3.3V电平,会不会是电压不匹配啊?

使用特权

评论回复
8
阿南| | 2013-10-17 21:38 | 只看该作者
5。5到3.3V肯定不配置呀

使用特权

评论回复
9
阿南| | 2013-10-17 21:39 | 只看该作者
换成MAX3232

使用特权

评论回复
10
庄吉|  楼主 | 2013-10-18 10:10 | 只看该作者
阿南 发表于 2013-10-17 21:39
换成MAX3232

在TXD和RXD之间串联个电阻后,PC送来的数据经过串联的那个电阻有返回去了。都没有经过CPU,所以能正常显示。说到底还是程序问题啊:lol,我程序是周立功的例程啊,怎么会错 呢

使用特权

评论回复
11
庄吉|  楼主 | 2013-10-18 10:13 | 只看该作者
#include <LPC213x.H>


typedef unsigned int uint32;
typedef unsigned short int uint16;
typedef unsigned char uint8;

#define Fpclk  11059200


void DelayNS(uint32 dly)
{
        uint32 i;
        for(;dly>0;dly--)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
        for(i=0;i<50000;i++);
}


void PLL_Init()
{
  PLLCON = 1;          //使能PLL
  //VPBDIV = 0;     
  //Fpclk=Fcclk/4;
  PLLCFG=0x63;         //P=2,M=4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  PLLFEED = 0xaa;
  PLLFEED = 0x55;                        //更改生效
  while((PLLSTAT & (1 << 10)) == 0);  //等待PLL锁定
  PLLCON = 3;
  PLLFEED= 0xaa;
  PLLFEED = 0x55;       
       
}

typedef struct  UartMode         //定义串口模式设置数据结构
{                                                                                                                                                                                                                 
        uint8 datab;
        uint8 stopb;
        uint8 parity;
}
UARTMODE;


uint8 rcv_buf[8];
uint8 rcv_new;



void __irq IRQ_UART0(void)                   //接受中断
{
        uint8 i;
        if(0x04==(U0IIR&0x0F))
        rcv_new=1;
        for(i=0;i<8;i++)
        {
                rcv_buf[i]=U0RBR;
        }                                                                                               
        VICVectAddr=0x00;
}

void  SendByte(uint8 data)
{
        U0THR=data;
}

void ISendBuf(void)
{
        uint8 i;
        for(i=0;i<8;i++)
        {
                SendByte(rcv_buf[i]);
                DelayNS(100);
        }       
        while((U0LSR&0x40)==0);
}

uint8 UART0_Ini(uint32 baud,UARTMODE set)
{
        uint32 bak;                                                                           //参数过滤
        if((0==baud)||(baud>115200)) return(0);
        if((set.datab<5)||(set.datab>8)) return(0);
        if((0==set.stopb)||(set.stopb>2)) return(0);
        if(set.parity>4) return(0);

        U0LCR=0x80;                                                                           //设置串口波特率
        bak=(Fpclk>>4)/baud;
        U0DLM=bak>>8;
        U0DLL=bak&0xFF;
       

        bak=set.datab-5;                                                                 //设置串口模式
        if(2==set.stopb) bak|=0x04;

        if(0!=set.parity){set.parity=set.parity-1;bak|=0x08;}
        bak|=set.parity<<4;
        U0LCR=bak;
        return(1);

}

int main(void)
{
        UARTMODE uart0_set;
        PINSEL0=0x00000005;
        PINSEL0=0x00000000;
        rcv_new=0;
        uart0_set.datab=8;
        uart0_set.stopb=1;
        uart0_set.parity=0;

        UART0_Ini(115200,uart0_set);

        U0FCR=0x81;                                                         //设置触发点为8个字节
        U0IER=0x01;

        VICIntSelect=0x00000000;                                //设置中断允许
        VICVectCntl0=0x26;
        VICVectAddr0=(int)IRQ_UART0;
        VICIntEnable=0x00000040;

        while(1)
        {
                if(rcv_new==1)
                {
                        ISendBuf();
                        rcv_new=0;                                       
                }
        }
       
         return(0);
}

使用特权

评论回复
12
阿南| | 2013-10-18 13:17 | 只看该作者
主体程序应该不会错的,有问题也可能是在管脚的对应上存在些偏差

使用特权

评论回复
13
庄吉|  楼主 | 2013-10-19 16:29 | 只看该作者
阿南 发表于 2013-10-18 13:17
主体程序应该不会错的,有问题也可能是在管脚的对应上存在些偏差

我知道错哪里了,没有使能IRQ中断,所以没有反应不知道怎么使能..........

使用特权

评论回复
14
庄吉|  楼主 | 2013-10-19 16:32 | 只看该作者
庄吉 发表于 2013-10-19 16:29
我知道错哪里了,没有使能IRQ中断,所以没有反应不知道怎么使能..........

也就是IRQEnable();周立功在启动代码里就是使能,可我的启动代码我看不懂,我估计我的启动代码里设置IRQ中断关的。我看不懂

使用特权

评论回复
15
庄吉|  楼主 | 2013-10-19 16:33 | 只看该作者
庄吉 发表于 2013-10-19 16:29
我知道错哪里了,没有使能IRQ中断,所以没有反应不知道怎么使能..........

也就是IRQEnable();周立功在启动代码里就是使能,可我的启动代码我看不懂,我估计我的启动代码里设置IRQ中断关的。我看不懂

使用特权

评论回复
16
阿南| | 2013-10-19 22:42 | 只看该作者
找本汇编的书对着指令看,应该是可以看懂的。
或者看看《ARM Linux入门与实践》里面关于启动代码部分内容

使用特权

评论回复
17
庄吉|  楼主 | 2013-10-21 15:35 | 只看该作者
阿南 发表于 2013-10-19 22:42
找本汇编的书对着指令看,应该是可以看懂的。
或者看看《ARM Linux入门与实践》里面关于启动代码部分内容 ...

是不是难入门的原因就是这些定义和启动代码啊?

使用特权

评论回复
18
阿南| | 2013-10-21 15:40 | 只看该作者
可以这么理解,就好比你不知道盒子里面是什么,而盒子里面总发现怪怪的东西骚扰你一样

使用特权

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

本版积分规则

4

主题

25

帖子

0

粉丝