共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电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 |