LPC2132串口通讯问题,串口助手调试发送接收程序,接收乱码,无接收
用串口发送数据给MCU,MCU就把数据返回给串口助手显示,出现狂接收00 00 00,有时又是乱码,有时没有接收,在MCU的TXD,RXD加上拉电阻也不行。MCU的RXD有 4.6V,TXD有 2.6V最后在TXD和RXD之间串联了一个220欧电阻,通讯正常,MCU有点温度。为什么TXD和RXD之间串联电阻才行???求大神啊,迷茫中...... 是否有接RS232转换芯片? 阿南 发表于 2013-10-15 22:27 static/image/common/back.gif是否有接RS232转换芯片?
:L用了MAX232啊,会不会是因为MAX232质量问题啊 多半是max232芯片的问题,测一下max232到pc的rx与tx的波形电压是否正常. 对,或者直接换一片RS232芯片看看,这个假货特别多 阿南 发表于 2013-10-16 14:34 static/image/common/back.gif
对,或者直接换一片RS232芯片看看,这个假货特别多
换了,不行。MAX232给LPC2132/MAR7,TTL信号5V电平,LPC2132/ARM7给MAX2323.3V电平,会不会是电压不匹配啊? tanshi_li 发表于 2013-10-16 10:46 static/image/common/back.gif
多半是max232芯片的问题,测一下max232到pc的rx与tx的波形电压是否正常.
换了,不行。MAX232给LPC2132/MAR7,TTL信号5V电平,LPC2132/ARM7给MAX2323.3V电平,会不会是电压不匹配啊? 5。5到3.3V肯定不配置呀 换成MAX3232 阿南 发表于 2013-10-17 21:39 static/image/common/back.gif
换成MAX3232
在TXD和RXD之间串联个电阻后,PC送来的数据经过串联的那个电阻有返回去了。都没有经过CPU,所以能正常显示。说到底还是程序问题啊:lol,我程序是周立功的例程啊,怎么会错 呢 #include <LPC213x.H>
typedef unsigned int uint32;
typedef unsigned short int uint16;
typedef unsigned char uint8;
#define Fpclk11059200
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 structUartMode //定义串口模式设置数据结构
{
uint8 datab;
uint8 stopb;
uint8 parity;
}
UARTMODE;
uint8 rcv_buf;
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=U0RBR;
}
VICVectAddr=0x00;
}
voidSendByte(uint8 data)
{
U0THR=data;
}
void ISendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
{
SendByte(rcv_buf);
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);
}
主体程序应该不会错的,有问题也可能是在管脚的对应上存在些偏差 阿南 发表于 2013-10-18 13:17 static/image/common/back.gif
主体程序应该不会错的,有问题也可能是在管脚的对应上存在些偏差
我知道错哪里了,没有使能IRQ中断,所以没有反应不知道怎么使能.......... 庄吉 发表于 2013-10-19 16:29 static/image/common/back.gif
我知道错哪里了,没有使能IRQ中断,所以没有反应不知道怎么使能..........
也就是IRQEnable();周立功在启动代码里就是使能,可我的启动代码我看不懂,我估计我的启动代码里设置IRQ中断关的。我看不懂 庄吉 发表于 2013-10-19 16:29 static/image/common/back.gif
我知道错哪里了,没有使能IRQ中断,所以没有反应不知道怎么使能..........
也就是IRQEnable();周立功在启动代码里就是使能,可我的启动代码我看不懂,我估计我的启动代码里设置IRQ中断关的。我看不懂 找本汇编的书对着指令看,应该是可以看懂的。
或者看看《ARM Linux入门与实践》里面关于启动代码部分内容 阿南 发表于 2013-10-19 22:42 static/image/common/back.gif
找本汇编的书对着指令看,应该是可以看懂的。
或者看看《ARM Linux入门与实践》里面关于启动代码部分内容 ...
是不是难入门的原因就是这些定义和启动代码啊? 可以这么理解,就好比你不知道盒子里面是什么,而盒子里面总发现怪怪的东西骚扰你一样
页:
[1]