共2条
1/1 1 跳转至页
LPC2214 请教:我用LPC2214做模拟串口为什么接收不行?
问
现在我这个程序发送可以,波特率可以9600以上,但接收时不产生中断,我用示波器量了一下引脚有波形
#include "config.h"
#include "SimuUart.h"
#define SimuTXD 1<<28 //模拟串口发送
#define SimuRXD 1<<29 //模拟串口接收
#define SimuRxBuffSize 30 //模拟串口接收缓冲区
unsigned char SimuRxIndex=0; //软件串口接收位置指针
unsigned char SimuUartRxBuff[SimuRxBuffSize]; //模拟串口接收缓冲区
/****************************************************************
* 名 称: Irq_SimuUart()
* 功 能: 模拟串口中断
* 入口参数:
* 出口参数:
****************************************************************/
void __irq Irq_SimuUart(void)
{
static unsigned char count,temp;
if((T0IR&0x80)!=0) //捕获到起始位
{
T0TC=0;
T0TCR=0x03; //启动定时器
T0TCR=0x01; //启动定时器
T0IR =0x80; //复位捕获中断
T0CCR=0x00; //禁止捕获
T0MCR=0x18; //允许MAT1匹配,中断方式
T0EMR=0;
IO0DIR &=~(SimuRXD);
PINSEL1 &= 0xf0ffffff;
//IO0SET |=(1<<SRXD);
}
else if ((T0IR&0x02)!=0) //起始位定时检测
{
T0IR =0x02; //复位匹配中断
if((IO0PIN&(SimuRXD))==0) //判断起始位是否有效
{
T0MCR=0xc0; //允许MAT2匹配,中断方式
T0EMR=0;
count=0;
temp=0;
}
else
{
T0MCR=0x00; //禁止匹配
T0CCR=0xc00; //重新捕捉起始位
T0TCR=0x02;
T0TC=0; //停止定时器
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x08000000;
}
}
else if ((T0IR&0x04)!=0) //数据位定时检测
{
T0IR |=0x04; //复位捕获中断
if (count<8)
{
temp >>=1;
if ((IO0PIN&(SimuRXD))!=0)
{
temp |=0x80;
}
// timerval[count]=IO0PIN;
count++;
}
else
{
T0MCR=0x00; //禁止匹配
T0CCR=0xc00; //重新捕捉起始位
T0TCR=0;
T0TC=0; //停止定时器
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x8000000;
SimuUartRxBuff[SimuRxIndex] = temp;
SimuRxIndex++;
if (SimuRxIndex>=SimuRxBuffSize)
SimuRxIndex=0; /*接收到一个完整的数据*/
}
}
VICVectAddr = 0x00; // 中断处理结束
}
/******************************************************************
* 名 称: SimuSendByte()
* 功 能: 模拟串口发送字节
* 入口参数:
* 出口参数:
*******************************************************************/
void SimuSendByte(unsigned char T_data)
{
uint8 temp,count;
T0CCR=0; //禁止接收捕获
T0TC=0;
T0TCR=0x03; //启动定时器
T0TCR=0x01; //启动定时器
IO0CLR |= SimuTXD; //发送起始位(起始位-低电平)
T0EMR=0x0300; //发生匹配后输出翻
T0MCR=0x80; //设定MR2发生匹配时TC复位
temp=T0EMR&0x004;
while (temp==(T0EMR&0x004));
temp=T0EMR&0x004;
for (count=0;count<9;count++)
{
if (count<8)
{
if ((T_data&0x01)!=0)
IO0SET |=SimuTXD;
else
IO0CLR |=SimuTXD;
T_data >>=1;
}
else
IO0SET |=SimuTXD; //发送停止位
while (temp==(T0EMR&0x004));
temp=T0EMR&0x004;
}
T0TCR=0x00; //停止定时器
T0CCR=0xc00; //允许接收捕获
T0TC=0;
}
/****************************************************************
* 名 称: InitSimuUart()
* 功 能: 初始化模拟串口
* 入口参数:
* 出口参数:
****************************************************************/
void InitSimuUart(unsigned int Baud)
{
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x08000000; //设定TXD引脚工作GPIO,RXD在捕捉(3)模式
IO0DIR |= SimuTXD;
IO0SET |= SimuTXD; //初始化TXD引脚
T0TC=0; //定时器计数器
T0TCR=0x03; //定时器控制器(复位/使能)
T0TCR=0;
T0PR=0; //预分频寄存器
T0PC=0; //预分频计数器(不分频)
T0CCR=0x400; //设定捕捉CAP3下降沿并中断
T0MR1=11059200/(Baud*2);
T0MR2=11059200/Baud; //波特率
T0IR=0xff; //中断寄存器(匹配,捕获通道0-3的中继标志)
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1 = 0x24; // 软串口中断通道分配到IRQ slot 1,
VICVectAddr1 = (unsigned int)Irq_SimuUart;// 设置软串口向量地址
VICIntEnable = 0x00000010; // 使能中断
T0EMR=0;
T0TCR=0;
}
uint8 SendBuff[62]={'1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
/****************************************************************
* 名 称: SimuSendString()
* 功 能: 模拟串口发送字符串
* 入口参数:
* 出口参数:
****************************************************************/
void SimuSendString(uint8 *pData,uint16 size)
{
uint16 i;
for(i=0;i<size;i++)
{
SimuSendByte(*pData);
pData++;
}
}
/*********************************************************************
* 名 称: Main()
* 功 能: 主函数
* 入口参数:
* 出口参数:
********************************************************************/
int main(void)
{
uint32 i;
InitSimuUart(1200);
while(1)
{
SimuSendString(SendBuff,62);
for(i=0;i<5000000;i++);
}
return(0);
}
答 1: 怎么没人回答我的帖子呢? 答 2: 看看他有没有边沿触发的没有的话,看看终端程序是不是一定要电平变为高电平才处理的,
是的话,就知道怎么修改了!
#include "config.h"
#include "SimuUart.h"
#define SimuTXD 1<<28 //模拟串口发送
#define SimuRXD 1<<29 //模拟串口接收
#define SimuRxBuffSize 30 //模拟串口接收缓冲区
unsigned char SimuRxIndex=0; //软件串口接收位置指针
unsigned char SimuUartRxBuff[SimuRxBuffSize]; //模拟串口接收缓冲区
/****************************************************************
* 名 称: Irq_SimuUart()
* 功 能: 模拟串口中断
* 入口参数:
* 出口参数:
****************************************************************/
void __irq Irq_SimuUart(void)
{
static unsigned char count,temp;
if((T0IR&0x80)!=0) //捕获到起始位
{
T0TC=0;
T0TCR=0x03; //启动定时器
T0TCR=0x01; //启动定时器
T0IR =0x80; //复位捕获中断
T0CCR=0x00; //禁止捕获
T0MCR=0x18; //允许MAT1匹配,中断方式
T0EMR=0;
IO0DIR &=~(SimuRXD);
PINSEL1 &= 0xf0ffffff;
//IO0SET |=(1<<SRXD);
}
else if ((T0IR&0x02)!=0) //起始位定时检测
{
T0IR =0x02; //复位匹配中断
if((IO0PIN&(SimuRXD))==0) //判断起始位是否有效
{
T0MCR=0xc0; //允许MAT2匹配,中断方式
T0EMR=0;
count=0;
temp=0;
}
else
{
T0MCR=0x00; //禁止匹配
T0CCR=0xc00; //重新捕捉起始位
T0TCR=0x02;
T0TC=0; //停止定时器
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x08000000;
}
}
else if ((T0IR&0x04)!=0) //数据位定时检测
{
T0IR |=0x04; //复位捕获中断
if (count<8)
{
temp >>=1;
if ((IO0PIN&(SimuRXD))!=0)
{
temp |=0x80;
}
// timerval[count]=IO0PIN;
count++;
}
else
{
T0MCR=0x00; //禁止匹配
T0CCR=0xc00; //重新捕捉起始位
T0TCR=0;
T0TC=0; //停止定时器
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x8000000;
SimuUartRxBuff[SimuRxIndex] = temp;
SimuRxIndex++;
if (SimuRxIndex>=SimuRxBuffSize)
SimuRxIndex=0; /*接收到一个完整的数据*/
}
}
VICVectAddr = 0x00; // 中断处理结束
}
/******************************************************************
* 名 称: SimuSendByte()
* 功 能: 模拟串口发送字节
* 入口参数:
* 出口参数:
*******************************************************************/
void SimuSendByte(unsigned char T_data)
{
uint8 temp,count;
T0CCR=0; //禁止接收捕获
T0TC=0;
T0TCR=0x03; //启动定时器
T0TCR=0x01; //启动定时器
IO0CLR |= SimuTXD; //发送起始位(起始位-低电平)
T0EMR=0x0300; //发生匹配后输出翻
T0MCR=0x80; //设定MR2发生匹配时TC复位
temp=T0EMR&0x004;
while (temp==(T0EMR&0x004));
temp=T0EMR&0x004;
for (count=0;count<9;count++)
{
if (count<8)
{
if ((T_data&0x01)!=0)
IO0SET |=SimuTXD;
else
IO0CLR |=SimuTXD;
T_data >>=1;
}
else
IO0SET |=SimuTXD; //发送停止位
while (temp==(T0EMR&0x004));
temp=T0EMR&0x004;
}
T0TCR=0x00; //停止定时器
T0CCR=0xc00; //允许接收捕获
T0TC=0;
}
/****************************************************************
* 名 称: InitSimuUart()
* 功 能: 初始化模拟串口
* 入口参数:
* 出口参数:
****************************************************************/
void InitSimuUart(unsigned int Baud)
{
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x08000000; //设定TXD引脚工作GPIO,RXD在捕捉(3)模式
IO0DIR |= SimuTXD;
IO0SET |= SimuTXD; //初始化TXD引脚
T0TC=0; //定时器计数器
T0TCR=0x03; //定时器控制器(复位/使能)
T0TCR=0;
T0PR=0; //预分频寄存器
T0PC=0; //预分频计数器(不分频)
T0CCR=0x400; //设定捕捉CAP3下降沿并中断
T0MR1=11059200/(Baud*2);
T0MR2=11059200/Baud; //波特率
T0IR=0xff; //中断寄存器(匹配,捕获通道0-3的中继标志)
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1 = 0x24; // 软串口中断通道分配到IRQ slot 1,
VICVectAddr1 = (unsigned int)Irq_SimuUart;// 设置软串口向量地址
VICIntEnable = 0x00000010; // 使能中断
T0EMR=0;
T0TCR=0;
}
uint8 SendBuff[62]={'1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
/****************************************************************
* 名 称: SimuSendString()
* 功 能: 模拟串口发送字符串
* 入口参数:
* 出口参数:
****************************************************************/
void SimuSendString(uint8 *pData,uint16 size)
{
uint16 i;
for(i=0;i<size;i++)
{
SimuSendByte(*pData);
pData++;
}
}
/*********************************************************************
* 名 称: Main()
* 功 能: 主函数
* 入口参数:
* 出口参数:
********************************************************************/
int main(void)
{
uint32 i;
InitSimuUart(1200);
while(1)
{
SimuSendString(SendBuff,62);
for(i=0;i<5000000;i++);
}
return(0);
}
答 1: 怎么没人回答我的帖子呢? 答 2: 看看他有没有边沿触发的没有的话,看看终端程序是不是一定要电平变为高电平才处理的,
是的话,就知道怎么修改了!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |