simuuart.c

来自「ARM(LPC2214)模拟串口程序」· C语言 代码 · 共 189 行

C
189
字号
/****************************************Copyright (c)************************************************
**
**                              	  深圳托普林科技有限公司
**                                 http://www.sztopping.com
**
**----------------------------------------------------------------------------------------------------
名称:SimuUart.c
功能:模拟串口
作者:Albert
日期:2005-04-28
说明:
*****************************************************************************************************/  

#include "config.h"


/***************************************************************
功能:  模拟串口收发口定义
***************************************************************/
#define SimuTXD   1<<28					//模拟串口发送口
#define SimuRXD   1<<29					//模拟串口接收口
  
#define SimuRxBuffSize  1024			//模拟串口接收缓冲区大小

uint8 SimuUartRxBuff[SimuRxBuffSize];	//模拟串口接收缓冲区
uint8 SimuRxIndex=0;           			//软件串口接收位置指针
uint8 SimuFlag;							

            
/****************************************************************************
* 名   称: IRQ_SimuUart()
* 功   能: 模拟串口接收中断服务函数
* 入口参数: 
* 出口参数: 
****************************************************************************/
void __irq IRQ_SimuUart(void)
{  
	static uint8 count,temp;  

	SimuFlag = 1;

   	if((T0IR&0x80)!=0)			//捕获到起始位
   	{             
    	T0TC=0;
	    T0TCR=0x03;                        		//启动定时器
    	T0TCR=0x01;                        		//启动定时器
	    T0IR =0x80;                             //复位捕获中断	
    	T0CCR=0x00;                             //禁止捕获
	    T0MCR=0x18;                             //允许MAT1匹配,中断方式
    	T0EMR=0;
	    IO0DIR &=~(SimuRXD);
    	PINSEL1 &= 0xf0ffffff;
   	}
   	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;              //设定TXD引脚工作CPIO,RXD引脚工作在捕捉(3)模式
     	}     
   	}
   	else if ((T0IR&0x04)!=0) 	//数据位定时检测
   	{        
     	T0IR |=0x04;                            //复位捕获中断	
     	if (count<8)
     	{
       		temp >>=1;
       		if ((IO0PIN&(SimuRXD))!=0)
       		{   
     	  		temp |=0x80;
       		}     	
       		count++;
     	}
     	else 
     	{
      		T0MCR=0x00;  						//禁止匹配
     		T0CCR=0xc00;  						//重新捕捉起始位
      		T0TCR=0;
      		T0TC=0;      						//停止定时器	
      		PINSEL1 &= 0xf0ffffff;
      		PINSEL1 |= 0x08000000;              //设定TXD引脚工作CPIO,RXD引脚工作在捕捉(3)模式
      		SimuUartRxBuff[SimuRxIndex] = temp; // 读取FIFO的数据,并清除中断标志
      		SimuRxIndex++;
      		if (SimuRxIndex>=SimuRxBuffSize)   
      			SimuRxIndex=0;  				
     	}
    }
   	VICVectAddr = 0x00;              			// 中断处理结束
}               

/****************************************************************************
* 名   称: InitSimuUart()
* 功   能: 初始化模拟串口
* 入口参数: 
* 出口参数: 
****************************************************************************/
void InitSimuUart(uint16 Baud)
{
  	PINSEL1 &= 0xf0ffffff;
  	PINSEL1 |= 0x08000000;                  	//设定TXD引脚工作CPIO,RXD引脚工作在捕捉(3)模式
  	IO0DIR |= SimuTXD;
 	IO0SET |= SimuTXD;                         	//初始化TXD引脚
  	T0TC=0;
  	T0TCR=0x03;
  	T0TCR=0;
  	T0PR=0;
  	T0PC=0;                                 	//不分频
  	T0CCR=0xc00;                            	//设定捕捉CAP3下降沿并中断
  	T0MR1=11059200/(Baud*2);
  	T0MR2=11059200/Baud;
  	T0IR=0xff;
  	VICIntSelect = 0x00000000;           		// 设置所有通道为IRQ中断
  	VICVectCntl5 = 0x24;                 		// 软串口中断通道分配到IRQ slot 1,
  	VICVectAddr5 = (uint32)IRQ_SimuUart;		// 设置软串口向量地址
  	VICIntEnable |= 0x00000010;           		// 使能中断
  	T0EMR=0;                                    
}


/****************************************************************************
* 名   称: SimuSendByte
* 功   能: 模拟串口发送字符
* 入口参数: 
* 出口参数: 
****************************************************************************/
void SimuSendByte(uint8 SChar)
{
	unsigned char 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 ((SChar&0x01)!=0) 
      			IO0SET |=SimuTXD;
      		else 
      			IO0CLR |=SimuTXD;
      		SChar >>=1;
    	}
    	else 
    		IO0SET |=SimuTXD;           //发送停止位
    	while (temp==(T0EMR&0x004));
    	temp=T0EMR&0x004;
  	}
  	T0TCR=0x00;                        	//停止定时器
  	T0CCR=0xc00;                        //允许接收捕获
  	T0TC=0;
}


/****************************************************************************
* 名   称: SimuSendStr
* 功   能: 模拟串口发送字符串
* 入口参数: 
* 出口参数: 
****************************************************************************/
void SimuSendStr(uint8 *buf,uint16 lenght)
{ 
  	uint16 i;
  	for (i=0;i<lenght;i++)
  	{
   		SimuSendByte(*(buf+i));	
  	}	
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?