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

📄 sci.c

📁 DSP2407实现SCI串口通信的C语言源代码。 分别使用2个中断实现串口的接收/发送。
💻 C
字号:
//该程序实现2407的串口异步通信
#include 	"NC.h"
//禁止总中断子程序       
void inline disable() 
{
  asm(" setc INTM");
  asm(" setc SXM");
}
//使能总中断子程序
void 	inline 	enable() 
{
   asm(" clrc INTM");
}
main( ) 
{
 disable();      		    	//禁止所有中断 
 IFR=0xFFFF;				// 清除中断标志   
 SCSR1=0X87FF;        	        //CLKIN=6M,CLKOUT=24M
 WDCR=0xE8;           		//不使能看门狗
 SCICCR=0x07;           	//1个停止位,不使能奇偶校验,空闲线多处理器模式,07为外部回送或外部发送/接受模式,
                                //17为内部,8位字符
SCICTL1=0x13;         	//#0013H 使能接收和发送,SLEEP=0 禁止休眠
                        //方式 , 禁止接收错误中断,TXWAKE=0 即没
                        //有选定的发送特征
SCICTL2=0x03;          	//dis接收和发送中断
SCIHBAUD=0X0;//0x2;
SCILBAUD=0Xc2;//0x70;                //波特率=9600B/S
SCICTL1=0x33;          	//使SCI脱离复位状态
SCIPRI=0x60;           	//SCI中断(接收和发送中断)为低优先级中断
MCRA=0x3;
	IMR=0x10;			    //使能UART中断-INT5
	 enable();			    		//使能总中断
 	SCITXBUF=0x77;            //见P229页的说明
	 while(1) 
	 {
	   SCICTL1=0x33;
	   
	//   while((SCICTL2 & 0x40)!=0x40);
     };
}
void   UartSent()          	//发送服务程序
{
	 static  int  i=0;
	const  char  var[20]={0xaa,0xbb,0xcc,0xdd,0xee,0xff};//"f2407A UART is fine?";//定义一段需要发送的字符串
  
//    char *var;
//    var[0]=0xaa;
//    var[1]=0xbb;
//    var[2]=0x12;
//    var[3]=0xcc;

	if(i>strlen(var))  return;	//如果需要发送的字符都已经发送完,则中断直接返回
	SCITXBUF=var[i++];	//依次发送定义的字符串中的各个字符
	IFR=0x0010; 			//清除IFR中相应的中断标志 
	enable();				//开总中断,因为一进入中断服务程序总中断就自动关闭了
}   
void   UartRec()          		//接收服务程序
{                        
    static  int  receive[21],j=0;   //19个目标字符,但是接受到时,第一个为0,所以至少应该是20个元素得一个数组,
                                    //定义为21个元素的数组可以使receive的第一个和最后一个都是NULL?   
    receive[j] = SCIRXBUF;         //依次接收字符 
   if(receive[1]==102)  PADATDIR=0x0808;   //判断第一个字符是否为f,可用于判断G代码的类型
    j++; 
    if(j>=21) j = 0;      //可以去掉
    IFR= 0x0010;			//清除IFR中相应的中断标志 
	enable();				//开总中断,因为一进入中断服务程序总中断就自动关闭了
}
void  interrupt  uarttr()    		//中断服务程序
{
	switch (PIVR)			//根据中断向量寄存器PVIR的值区别是接收还是发送中断
	{
        case 6: UartRec();break;	//如果PIVR=6,则发生了接收中断,执行接收服务程序
	    case 7: UartSent();break;	//如果PIVR=7,则发生了发送中断,执行发送服务程序
	}
}
//当由于干扰而引起其它中断时,中断进入此程序直接返回主程序
void  interrupt  nothing() 
{
	return;
}

⌨️ 快捷键说明

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