⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2_uart_sst.c

📁 sst芯片参考 增强UART功能
💻 C
📖 第 1 页 / 共 2 页
字号:
			   if(uart2_tx.tx_bitcont==0)
			    uart2_tx.tx_state=TX_STOP_BIT;			//8位的数据发送完毕,将状态改为发送停止位
		  }break ;

  		  case TX_STOP_BIT:
		  {  //sent stop bit							//是发送的停止位状态,发送停止位,
			   TXD2=1;
			   uart2_tx.tx_state=TX_STOP_END;			//置发送状态置为发送结束标志
		  }break ;

		  case TX_STOP_END:
		  { //a byte data was sent finished 			//是发送结束标志,重置为发送起始位状态
			   uart2_tx.tx_state=TX_START_BIT;
			   uart2_tx.count++;						//发送的数据个数加一
			   if(uart2_tx.len==uart2_tx.count)			//判断是否缓冲区的数据全部发送完?
			   {
				    CCAPM2=DISABLED_MODE;				//发送的数据长度等于发送的数据个数,禁止PCA的操作
				    uart2_tx.tx_state=0xff;				//置禁止发送				
			   }		
		  }break ;

		  default : CCAPM2=DISABLED_MODE; break ;		//其它状态,统统禁止发送
	}
 }
//=============================	UART2的发送过程====================================
 if (CCF3)					//是PCA1的捕捉响应标志,说明PCA1管脚上有下降沿或上升沿出现,
 {							//第一次是属于外部捕捉的下降沿中断,以后便是软件定时器的采集定时中断(在每位的中间时刻进行采集数据)
	  CCF3=0;				//清接收的PCA1中断标志
	  switch (uart2_rx.rx_state)
	  {
		   case RX_START_EDGE:								//是接收的起始边沿
		   {
		   		
				temp_ccap = CCAP3H *0x100 + CCAP3L + HALF_SPEEDL;  //???为何要多加一个位的低8位时间?--由于高8位进位的问题捕捉当前的时间,再加上半位的时间为何要多加一个位的低8位时间?,
				CCAP3H = temp_ccap/0x100 +HALF_SPEEDH ;  //重置捕捉的高8位数据,再加半位时间											//就是下一个起始位的中间采集时刻
				CCAP3L += HALF_SPEEDL;					//实际上,CCAP0L并没有多加一次FULL_SPEEDL,加也只是加在了temp_ccap上重置捕捉的低8位数据,再加半位时间
		
			    CCAPM3=TIME_INIT;							//置为软件定时器中断方式,计算下一位的采集时间			    
			    uart2_rx.rx_state=RX_START_BIT;				//置下一个状态为:接收起始位
		   }break;
		   case RX_START_BIT:								//是接收起始位
		   {										
		   		temp_ccap = CCAP3H *0x100 + CCAP3L + FULL_SPEEDL; //???:为何要多加一个位的低8位时间??--由于高8位进位的问题
				CCAP3L += FULL_SPEEDL;			//实际上,CCAP0L并没有多加一次FULL_SPEEDL,加也只是加在了temp_ccap上
			    CCAP3H = temp_ccap/0x100 +FULL_SPEEDH ;	//置下一个位的采集时间,就是本次的时间加上一个位的时间

	
			    if (RXD2)
			    {
			         uart2_rx.rx_state=RX_START_EDGE;		//如果RXD2=1,说明不是起始位,起始位应为0
			         CCAPM3=NEG_CAP_INT;					//置为下降沿捕捉中断方式	
			    }
			    else
			    {
				     uart2_rx.rx_state=RX_DATA_BIT;			//RXD2=0,为接收的起始位,置下一状态为数据接收
				     uart2_rx.rx_bitcont=8;					//接收8位的数据
			    }
		   }break;
		   case RX_DATA_BIT:								//是接收数据位的状态
		   {
		   		temp_ccap = CCAP3H *0x100 + CCAP3L + FULL_SPEEDL;		//???为何要多加一个位的低8位时间?
				CCAP3L += FULL_SPEEDL;
			    CCAP3H = temp_ccap/0x100 +FULL_SPEEDH ;		//置下一个位的采集时间

			    uart2_rx.buff[uart2_rx.count]=uart2_rx.buff[uart2_rx.count]>>1;	//接收的内容右移一位
			    if(RXD2)
			    	uart2_rx.buff[uart2_rx.count]|=0x80;		//I/O是1,置D7位为1
			    uart2_rx.rx_bitcont--;							//位数减一(共需移8位)
			    if(uart2_rx.rx_bitcont==0)
			    {
			    	uart2_rx.rx_state=RX_STOP_BIT;				//8位接收完,准备接收停止位.
			    }
		   }break;
		   case RX_STOP_BIT:									//为接收的停止位,重置下降沿的起始位
		   { 			    
			    CCAPM3=NEG_CAP_INT;								//置为下降沿捕捉中断方式
				if(RXD2) 									//停止位应是1,如果是零,非正确数据,丢弃
					{
				     	uart2_rx.count++ ;						//是正确数据,接收的数据个数加一
						uart2_rx.no_data_count = 0 ;				//置有接收到的数据标志
					}
			    uart2_rx.rx_state=RX_START_EDGE;				
	   		
		   }break;

	  	   default :break;
	    
	 	}
  }
}

//=================================================================

void UART_SST_init(void)    //PCA 初始化
{
 //CMOD   = 0x01 ; //CIDL=0,WDTE=0,CPS1 CPS0=00 Fosc/12 ,/ECF=1
 CMOD   = 0x03 ; //CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1  //TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
 CCON= 0X0;
 CL = 0X0;							//PCA计数器初设为00
 CH = 0X0;
 CCAPM0 = DISABLE_MODE ;			//禁止PCA0的操作
 CCAPM1 = DISABLE_MODE ;			//禁止PCA1的操作
 CCAPM2 = DISABLE_MODE ;			//禁止PCA2的操作
 CCAPM3 = DISABLE_MODE ;			//禁止PCA3的操作


 PPC = 1;							//置PCA中断为最高级
 IPH |= 0x40;//highest PRI			//置PCA中断为最高级
 EC = 1;							//PCA中断允许

 AUXR &=0xfd;						//选择EXRAM作为UART的缓冲区
 
 uart1_rx.no_data_count = 0 ;
 uart1_tx.tx_state = 0xff ;
 uart2_rx.no_data_count = 0 ;
 uart2_tx.tx_state = 0xff ;
}

//==================UART1==============================
void UART1_tx_enable(void)				//PCA 的UART发送允许
{
	 CH=0;							//PCA计数器初置为00
	 CL=0;
	 CCAP0L=FULL_SPEEDL;			//软件定时的长度为一位的时间长度
	 CCAP0H=FULL_SPEEDH;
	 CCAPM0= TIME_INIT;//01001001			//置为软件定时器中断方式
	 uart1_tx.count=0x0;			//发送的个数初设为00
	 uart1_tx.tx_state=TX_START_BIT;	//发送的初始状态为发送起始位
	 CR = 1;
}
/*pca receive enable*/
void UART1_rx_enable(void)					//允许PCA 的UART接收
{
	 CCAPM1=NEG_CAP_INT;				//置为下降沿捕捉中断方式
	 uart1_rx.rx_state=RX_START_EDGE;	//接收的起始状态为下降沿触发
	 uart1_rx.count=0x00;				//接收的数量初设为00
	 CR = 1;//attention: CR didn't stop at discretion , 
}
//-----------------------------------
void UART1_rx_disable(void)
{
	 CCAPM1=DISABLE_MODE;					//禁止PCA1的操作
	 uart1_rx.rx_state=RX_START_EDGE;		//接收状态恢复到开始的下降沿
}
//-----------------------------------
void UART1_send_out ( uchar *p , uint len )			//发送以P地址开始的单元内容,发送个数为LEN
{ 
    uint j ;
	if(uart1_tx.tx_state==0xff) 
	{		 
	  	uart1_tx.len = len  ; 				//置发送的数据长度
		for ( j = 0 ; j < len ; j++ )
		{ 
			uart1_tx.buff[j] = *p ;			//搬移至UART1的发送缓冲区内
			p++ ;
		}
		UART1_tx_enable( );	      				//打开PCA的UART发送
	}
}
//==================UART2==============================
void UART2_tx_enable(void)				//PCA 的UART发送允许
{

	 CH=0;							//PCA计数器初置为00
	 CL=0;
	 CCAP2L=FULL_SPEEDL;			//软件定时的长度为一位的时间长度
	 CCAP2H=FULL_SPEEDH;
	 CCAPM2= TIME_INIT;//01001001			//置为软件定时器中断方式
	 uart2_tx.count=0x0;			//发送的个数初设为00
	 uart2_tx.tx_state=TX_START_BIT;	//发送的初始状态为发送起始位
	 CR = 1;

}
void UART2_rx_enable(void)					//允许PCA 的UART接收
{
	 CCAPM3=NEG_CAP_INT;				//置为下降沿捕捉中断方式
	 uart2_rx.rx_state=RX_START_EDGE;	//接收的起始状态为下降沿触发
	 uart2_rx.count=0x00;				//接收的数量初设为00
	 CR = 1;//attention: CR didn't stop at discretion , 
}
//-----------------------------------
void UART2_rx_disable(void)
{

	 CCAPM3=DISABLE_MODE;					//禁止PCA1的操作
	 uart2_rx.rx_state=RX_START_EDGE;		//接收状态恢复到开始的下降沿
}
//-----------------------------------
void UART2_send_out ( uchar *p , uint len )			//发送以P地址开始的单元内容,发送个数为LEN
{ 
    uint j ;
	if(uart2_tx.tx_state==0xff) 
	{		 
	  	uart2_tx.len = len  ; 				//置发送的数据长度
		for ( j = 0 ; j < len ; j++ )
		{ 
			uart2_tx.buff[j] = *p ;			//搬移至uart2的发送缓冲区内
			p++ ;
		}
		UART2_tx_enable( );	//pca_tx_ena( );	//打开PCA的UART发送
	}

}




⌨️ 快捷键说明

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