这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » LPC2214 请教:我用LPC2214做模拟串口为什么接收不行?

共2条 1/1 1 跳转至

LPC2214 请教:我用LPC2214做模拟串口为什么接收不行?

院士
2006-09-17 18:14:16     打赏
LPC2214 请教:我用LPC2214做模拟串口为什么接收不行?



关键词: LPC2214     请教     我用     模拟     串口     为什么         

院士
2006-12-22 22:43:00     打赏
2楼
问 现在我这个程序发送可以,波特率可以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: 看看他有没有边沿触发的没有的话,看看终端程序是不是一定要电平变为高电平才处理的,
是的话,就知道怎么修改了!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]