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

📄 sci.c

📁 DSP部分功能测试 串口
💻 C
字号:
//-------------------------------//
//---sci.c-----------------------//
//-------------------------------//
#include "sci.h"


extern char SciRecBuf[INBUF_LEN];
char SciRecData[10];
extern unsigned int read_flag;
extern unsigned long Encode_counter;
extern ulong Maxest_counter;
extern uchar ucSq;
extern char pc_qubai,pc_tuixiao,pc_impact,pc_fangbai;
extern unsigned int ReadArr[10];
//void inline enable_int();
char uldata_fh;
char cParaNo;
extern unsigned int uipreangle;
int ltoascii(long val,char *buffer,int n);
int ltofascii(long val,char *buffer, int n);
//-------------------------------------------//
//------void sci_init(void)------------------//
//-----串口初始化----------------------------//
//-------------------------------------------//
unsigned int Len_RecChar;
int uiRecNum;
void sci_init(void)
{
	disable_int();
	*SCSR1=*SCSR1|0x0040;	//enable SCI clock//
	*MCRA=*MCRA|0x0003;	//enable TXD and RXD//
	*SCICCR=0x07;  //1 stop bit ,no even(odd)check,8bitdata;
	*SCICTL1=0x0013; //no RX ERR,SCI SRESET,no TXWAKE,no sleep,enable TX & RX;
	*SCICTL2=0x0002; //enable RX int,disable TX int;03:enable TX & RX int;
	*SCIHBAUD=(BAUD_9600_40M/0x100); //BAUD : 9600bps;
	*SCILBAUD=(BAUD_9600_40M%0x100);
	*SCIPRI = 0x00;   //SCI为高优先级中断 
	*SCICTL1=0x0033;  //使SCI脱离复位状态;
	*PADATDIR=*PADATDIR|0x0003;
	*IMR = *IMR|0x01;
	enable_int();
}
//--------------------------------------//
//---viod send_char_com(uchar ch)------//
//-------------------------------------//
void send_char_com( unsigned char ch)
{	

	while ((*SCICTL2 & 0x0080) == 0x0000)
	{
		delay(0x01);
	} ;
	*SCITXBUF = ch;
	while ((*SCICTL2 & 0x0040) == 0x0000)
	{
		delay(0x1);
	} ;  
//	delay(0xff);


}

//----------------------------------------------------------------//
//void send_string_com(uchar *str, uint strlen)-------------------//
//----send string to serial port ---------------------------------//
//----------------------------------------------------------------//
void send_string_com(char *str, unsigned int strlen) 
{ 
	unsigned int k ; 
	k=0;
	do 
	{ 
		send_char_com(*(str + k)); 
		k++; 
	} 
	while (k < strlen); 

} 

//-----------------------------------------------------------//
//----unsinged int send_num_com(unsigned long ul_x,unsigned int n_bit);--------//
//----send a ulong num to the serial port--------------------//
//-----------------------------------------------------------//
unsigned int send_num_com(unsigned long ul_x,unsigned int n_bit)
{
	unsigned char  asi_num[20];
	int i;

	for (i = 0; i<n_bit ; i++)
	{		
		asi_num[i]= (unsigned char)(ul_x%10 + 0x30);
		ul_x = ul_x/10;	
	}
	i = 0;
//	if(uldata_fh  == 0x2d)
//	{
//		send_char_com(0x2d);
//		i = 1;
//	}
	for( ; i<n_bit ;i++ )
	{
		send_char_com(asi_num[n_bit-1-i]);
	}

	return(0);
}
//-------------------------------------//
//-----unsinged int test_sci(void)-----//
//-------------------------------------//
unsigned int test_sci(void)
{
	unsigned int data_to_send,data_received; 

	if(read_flag == 1)
	{	
		
	//	*PBDATDIR = *PBDATDIR | 0xffff;
		DIE_H;

		delay(0x10); 
		send_num_com(Encode_counter,6);
		send_string_com(SciRecBuf,Len_RecChar);
		
		while ((*SCICTL2&0x0040) == 0x0000)
		{delay(0x01);
		} ;
		delay(0xff);
		//*PBDATDIR=*PBDATDIR & 0xfffb;
		DIE_L;
		delay(0xff);
		enable_int();
		Len_RecChar = 0;
		read_flag = 0;
	}
//	*PBDATDIR=*PBDATDIR | 0xffff;
//	data_to_send=0x005a;
//	*SCITXBUF=data_to_send;

//	while ( * SCICTL2 & 0x0040 == 0x0040) ;
//	*PBDATDIR=*PBDATDIR & 0xfffb;


	/*while(*IFR!=0x0010|*PIVR!=0x0006);*/
//	while((*SCIRXST&0x0040)==0x0000);
//	data_received= *SCIRXBUF;
//	if(data_received!=0x005a)return(0);
//	return(1);
	return(0);
}  

//--------------------------------------//
//-----void UartRec()-------------------//
//--------------------------------------//
void UartRec()
{

	unsigned char ch;

	ch =  *SCIRXBUF;
	if(read_flag==0)
	{
		if(ch == 0x05)
		{
			uiRecNum = 0;
			Len_RecChar = 0;
		}
		if(ch == EOT || uiRecNum>=INBUF_LEN)  //接收结束,收到0X0A
		{		
		//	disable_int();
			read_flag = 1;
			SciRecBuf[uiRecNum++] = ch;
			Len_RecChar = uiRecNum;
			uiRecNum=0;
		
		}
		else
		{
			if (ch > 127 ) //if1
			{ 
				uiRecNum = 0 ; 
				SciRecBuf[uiRecNum] = ch; 
			} 
			else 
			{ 
				SciRecBuf[uiRecNum] = ch; 
				uiRecNum++; 
			//	Len_RecChar++;
					
			} //endif1
		}//endif
	}//endif !read_flag
	*IFR = 0x0001;
	delay(0xf);
	
//	enable_int();
}

//----------------------------------------------------------------//
//-------checksum.c-----------------------------------------------//
//-------求校验和--------------------------------------------------//
//----------------------------------------------------------------//

//-----------------------------------------------------------------//
//------uchar chksum(uchar *p,uchar a, uchar n)--------------------//
//-----uchar checksum(要求校验和的数组,偏移量,共几个字节)-------//
//----返回校验和---------------------------------------------------//
//-----------------------------------------------------------------//
uchar chkxor(char *p,uint a,uint n)
{
	uint i;
	uchar checkxor;
	i=0;
	checkxor=0;
	for(i=0;i<n;i++)
	{
		checkxor ^= p[a+i];
	}

	return (checkxor);
}

uchar chksum(char *p,uint a,uint n)
{
	uint i;
	uchar checksum;
	i=0;
	checksum=0;
	for(i=0;i<n;i++)
	{
		checksum += p[a+i];
	}

	return checksum;
}

//	   指令代码义:
//收到00时,只发送实时数据
//收00 :05 30 32 30 30 30 32 0A
//发实时:02(STX1) 30 32(ADD2.3)3x(SQ4)'C'(flag5)data(6~15,实时脉冲)03(ETX16) 
//----checkxor(17.18) 0xa(over19).

//收到01时,发送当前最大值
//发01: 05 30 32 30 31 30 33 0A
//发最大:02(STX1) 30 32(ADD2.3)3x(SQ4)'M'(flag5)data(6~15,最大值脉冲)03(end16) 
//----checkxor(17.18) 0xa(over).

//收到11时,取摆按下,收到21时:取摆松开
//收11: 05 30 32 31 31 30 32 0A      || 收21:  05 30 32 32 31 30 31 0A
//收到12时,退销按下,收到22时:退销松开
//收12: 05 30 32 31 32 30 31 0A      || 收22:  05 30 32 32 32 30 32 0A
//收到13时,冲击按下,收到23时:冲击松开
//收13: 05 30 32 31 33 30 30 0A      || 收23:  05 30 32 32 33 30 33 0A
//收到14时,放摆按下,收到24时:放摆松开
//收14: 05 30 32 31 34 30 37 0A      || 收24:  05 30 32 32 34 30 34 0A

//收到30时,清零处理;所有位恢复初始状态
//发30: 05 30 32 33 30 30 31 0A

//收到40时,写入PLC的变量区,即实际最大扬角的脉冲值
//发40及数据:05 30 32 34 30 xx xx xx xx xx xx xx xx AA AA 0A  (16)

//收到41时,写入三段的取摆速度,共8位,依次为s0,s0,S1,s1,s2,s2,s3,s3;
//2020为空,s1s1为低
//发41: 05 30 32 34 31 s0 s0 s1 s1 s2 s2 s3 s3 AA AA 0A (16)  
//以上动作正常时回送:06(ACK) 30 32(ADD) 0A(LF)
//不正常时回送:H15(NAK) 30 32(ADD)XX(error code) H0A;  

//-------------------------------------------------------------//
//--uint SendSci(unsigned char plc_ad,uchar para,ulong uldata,uint n)--//
//--(DSP号,参数号,参数,位数)------------------------------------------//
//-------------------------------------//
uint SendSci(unsigned char dsp_ad,uchar para,ulong uldata,uint n)
{
	uint i;
	uchar checks;
	char  OutBuf[20];
	i=0;
//	uchar chksum = 0x3A;	
	if(uldata % 65536 > 0x7fff)
	{
		uldata = ~(uint)uldata + 1;
		uldata_fh = 0x2d;
	}
	else
	{
		uldata_fh = 0x30;
	}

	i = ltoascii((long)dsp_ad,OutBuf,2);
//	i += ltoascii((long)ucSq,OutBuf+i,1);
//	i += ltoascii((long)para,OutBuf+i,1);
	i += ltoascii((long)uldata,OutBuf+i,10);
	/*
	i = sprintf(OutBuf,"%02d",(uint)dsp_ad);
	i += sprintf(OutBuf+i,"%01d",(char)ucSq);
	i += sprintf(OutBuf+i,"%01d",(uint)para);
	i += sprintf(OutBuf+i,"%010ld",(ulong)uldata);
	*/
	if(uldata_fh == 0x2d)
	{
		OutBuf[5] = 0x2d;
	}
	
	checks = chkxor(OutBuf,0,i);
	checks = checks ^ para;
	checks = checks ^ ucSq;
		
	ltofascii((long)(checks),OutBuf,2);

	send_char_com(0x02);//STX
	send_num_com(dsp_ad,2); //dsp_ad
	send_char_com(ucSq); //SQ
	send_char_com(para); //C or M
	send_char_com(uldata_fh);
	send_num_com(uldata,n-1); //the num of pulse
	send_char_com(0x03); //ETX
	send_string_com(OutBuf,2);//checksum
   
//	send_string_com(p, 16); //(plc_ad + para + 要发

⌨️ 快捷键说明

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