周立功的例程,设置出发点为8个字节,串口发送8个字节时,一切都会正常,发送9个字节时,测试了两种情况,第一种是能连续接受,但都不正确,如果再次发送8个字节又可以正常,第二种是发送3次都乱码,3次后,就接收不了了,再次发送8个字节也一样接收不了。令我不解的是:两个程序的区别,我好无解,求大神。程序如下:
#include <LPC213x.H>typedef unsigned int uint32;
typedef unsigned short int uint16;
typedef unsigned char uint8;
uint8 rcv_buf[8];
uint8 rcv_new;
#define Fpclk 11059200
void DelayNS(uint32 dly) //延时函数
{
uint32 i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
void PLL_Init() //PLL初始化
{
PLLCON = 1; //使能PLL
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;/////////**************重点*********************/
void __irq IRQ_UART1(void) //接受中断
{
uint8 i;
if(0x04==(U1IIR&0x0F)) //接受数据可用
{
rcv_new=1; //接受标志位。
}
for(i=0;i<8;i++)
{
rcv_buf=U1RBR; //读取数据
}
VICVectAddr=0x00; //清中断
} /////////**************重点**********************/
void SendByte(uint8 data)
{
U1THR=data;
while((U1LSR&0x40)==0);
}
void ISendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
SendByte(rcv_buf);
}
uint8 UART1_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);
U1LCR=0x80; //设置串口波特率
bak=(Fpclk>>4)/baud;
U1DLM=bak>>8;
U1DLL=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;
U1LCR=bak;
return(1);
}
void IRQEnable(void)
{
int temp;
__asm
{
MRS temp,CPSR
BIC temp,temp,#0x80
MSR CPSR_c,temp
}
}
int main(void)
{
UARTMODE uart1_set;
PINSEL0=0x00050000;
rcv_new=0;
uart1_set.datab=8;
uart1_set.stopb=1;
uart1_set.parity=0;
UART1_Ini(115200,uart1_set);
PLL_Init();
U1FCR=0x81; //设置触发点为8个字节
U1IER=0x01;
IRQEnable();
VICIntSelect=0x00000000; //设置中断允许
VICVectCntl0=0x27;
VICVectAddr0=(uint32)IRQ_UART1;
VICIntEnable=0x00000080;
while(1)
{
if(rcv_new==1)
{
ISendBuf();
rcv_new=0;
}
}
return(0);
}
|