|
接收的脚是LPC2136 ARM的2脚,此脚需要模拟接收。波特率9600,时钟:14.745600M。
我用定时器0定了两个值:第一:T0MR1=14745600/9600,这个用于定时接收数据位.第二:T0MR0=14745600/(9600*2)
这个用于起始位的定时检测。2脚设置为捕获输入,当2脚出现下降沿时,进入定时器0的中断,然后开始接收数据位,
数据位的接收就是每隔14745600/9600 us进入定时器接收一个bit。接收完一个字节后,就发给串口0,我琢磨着,这串口0不用再模拟了吧,我就将接收的数据直接赋给UART0的发送FIFO,即U0THR=data。可是串口工具上显示的全是乱码呢!
有人说波特率不对,我看了很多例子跟我设置的一样啊。
接收部分的程序:
if (count<8) //如果count<8,则接收数据
{
T0CCR=0x00; //禁止捕获中断
T0MCR=0x18; //允许MR1匹配,匹配之后产生中断并复位计数器
T0MR1=147456/baudrate;
T0MR0=147456/(baudrate*2);
temp >>=1;
if ((IOPIN0&(SimuRXD))!=0) //若接收的数据是高电平
{
temp |=0x80;
}
count++;
T0TCR=0x03; //启动定时器,并复位定时器
T0TCR=0x01; //启动定时器
}
发送部分的程序:
void SimuSendStr(uint8 *buf,uint16 lenght)
{
uint16 i;
for (i=0;i
{
U0THR =*(buf+i); //将值赋给UART0的发送FIFO
while((U0LSR&0x40)==0); //等待数据发送完毕
}
}
main()
{
GPIOInit();
InitSimuUart(9600);
uart0ini(9600);
IOCLR0=0x40000000;
while(1)
{
if(ReciveData==1)//如果接收到新数据,则发送出去
{ SimuSendStr(SimuUartRxBuff,SimuRxIndex);
ReciveData=0;
SimuRxIndex=0;
}
}
}
|
|