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

📄 xp_vc33_body.c

📁 DSP,C33原代码,很好的!有I2C,串口,SPIDENG 子程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		Delay_N_uS(6);
		if ( d & BIT7 ) 
			SET_SDA;//I2C_SDA =1;
		else            
			RESET_SDA;//I2C_SDA =0;
		Delay_N_uS(6);
			SET_SCLK;//I2C_SCK = 1;
		Delay_N_uS(6);
			RESET_SCLK;//I2C_SCK = 0;
		d = d << 1;
	}
	Delay_N_uS(6);
	SET_SDA;//I2C_SDA = 1; 
	xp_SetSdaIn();
	Delay_N_uS(6);
	SET_SCLK;//I2C_SCK = 1;
	
	Delay_N_uS(6);
	bit_ack =! READ_SDA;//I2C_SDA 
	Delay_N_uS(6);
	RESET_SCLK;//I2C_SCK =0;
	Delay_N_uS(6);
	xp_SetSdaOut();
	Delay_N_uS(6);
	return bit_ack;
}
uchar I2C_Receive_Byte(void)
{
	uchar i = 8, d = 0;
	RESET_SCLK;
	Delay_N_uS(6);
	
	while ( i--)
	{
		SET_SDA;
		Delay_N_uS(6);
		xp_SetSdaIn();
		d = d << 1;
		Delay_N_uS(6);
		SET_SCLK;//I2C_SCK =1;  
		Delay_N_uS(6);
		if ( READ_SDA )//I2C_SDA
			d++; 
		RESET_SCLK;//I2C_SCK =0;
		Delay_N_uS(6);
		xp_SetSdaOut();
	}
	return d;
}
void xp_SEPROM_WriteBlock(uchar *buffer,uint AT24C64_address,uint count)
{
	//Delay_N_mS(40);
	while(count--)
	{
		I2C_Start();
		/*I2C_Send_Byte( 0xa0 + AT24C64_address /256 *2);*/  /* 24C16  USE */
		if(I2C_Send_Byte( 0xa2 ))
			if(I2C_Send_Byte( AT24C64_address/256 ))
				if(I2C_Send_Byte( AT24C64_address %256 ))
					if(I2C_Send_Byte( *buffer ))
						I2C_Stop();
		Delay_N_mS(12);       /* 12 waiting for write cycle to be completed */
		buffer++;
		AT24C64_address++;
	}
}
void xp_SEPROM_ReadBlock(uchar *buffer,uint AT24C64_address,uint count)
{
	while(count--)
	{
		I2C_Start();
		/*I2C_Send_Byte( 0xa0 + AT24C64_address / 256 *2 );*/   /* 24C16 USE */
		if(I2C_Send_Byte( 0xa2 ))
			if(I2C_Send_Byte( AT24C64_address/256 ))
				if(I2C_Send_Byte( AT24C64_address % 256 ))
					I2C_Start();
		/*I2C_Send_Byte( 0xa1 + AT24C64_address /256 *2 );*/
		if(I2C_Send_Byte( 0xa3 ))
			*buffer = I2C_Receive_Byte();
		I2C_Nack();
		I2C_Stop();
		buffer++;
		AT24C64_address++;
	}
}


/************************************************************************/
/*                          开关量输入输出                              */
/************************************************************************/

int	xp_SWITCH_In(void)//读取输入开关量
{
	int result = 0;
#if  _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)
	result = (~R_KI_20) & 0xfffff;
#else
	//
#endif
	return  result;
	
} 

void	xp_SWITCH_Out(int outdata)//输出开关量
{

	W_KO_16 = outdata;

	
}
void	xp_SWITCH_OutEnable(bool yesorno)//开关量输出使能
{

#if  _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)
		W_OUTEN = yesorno; 
#else
	//
#endif

}

/************************************************************************/
/*                          模拟输入                                    */
/************************************************************************/

void	 xp_AD_SelectChannelGroup(int chgroup)//选择模拟通道
{
	W_ADCH = chgroup;
	
}

void	 xp_AD_Start(void)//启动AD 转换
{
	int read = R_AD_START;
	
}

bool	xp_AD_Over(void)//AD转换结束了吗?
{
	uint	over = R_GPS_ADST_FREST & BIT1;
	if(over)
		return false;
	else
		return true;
}
/*
*	result 必须是四维浮点数组的头指针
*/
void	 xp_AD_QueryRead(double* result)//查询法读AD 转换结果
{
	int i,read;
	
	for(i = 0; i < 4; i++)
	{
		read = R_AD_RESULT & 0x3fff;
		*(result + i) = ADResConv(read); 		
	}
	
}

/************************************************************************/
/*                          测频                                        */
/************************************************************************/
/*
 *	输入的正弦波先经过整形,然后2分频,再进行测频
 */
/*
 *	采用内部时钟方式计数时,每单位50ns,两路测频都采用查询法
 *  ,它们都靠定时器1来计数 BIT2--4   BIT3---1
 */
double	 xp_FREQ_TestOne(void)//测量第一路模拟输入信号的频率
{

	/**查询法计分频后半个周期**/
	int		tmp = 0;
	double result = 0.0;

#if  _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)
	xp_VC33_StopTimer(TIMER1);
	xp_VC33_SetTimer(TIMER1,INFINITE);
	
	if(R_GPS_ADST_FREST & BIT3)/*现在是高电平*/
	{
		while (R_GPS_ADST_FREST & BIT3)/*下降沿到了跳出循环开始计数*/
		{
			;
		}
		xp_VC33_StartTimer(TIMER1);

		while (!(R_GPS_ADST_FREST & BIT3))/*上升沿到了跳出循环停止计数*/
		{
			;
		}

		tmp = xp_VC33_StopTimer(TIMER1);
		result = 1 * 10e9/ (tmp * 50.0 );
	}
	else/*现在是低电平*/
	{
		while (!(R_GPS_ADST_FREST & BIT3))/*上升沿到了跳出循环开始计数*/
		{
			;
		}
		xp_VC33_StartTimer(TIMER1);

		while (R_GPS_ADST_FREST & BIT3)/*下降沿到了跳出循环停止计数*/
		{
			;
		}

		tmp = xp_VC33_StopTimer(TIMER1);
		result = 1 * 10e9/ (tmp * 50.0 );
	}
#else
	//
#endif

	return result;
}


double	 xp_FREQ_TestFour(void)// 测量第四路模拟输入信号的频率
{
	/**查询法计分频后半个周期**/
	int		tmp = 0;
	double result = 0.0;

#if  _LTC33_EDITION_ == (_LTC33A_ || _LTC33B_)

	xp_VC33_StopTimer(TIMER1);
	xp_VC33_SetTimer(TIMER1,INFINITE);
	
	if(R_GPS_ADST_FREST & BIT2)/*现在是高电平*/
	{
		while (R_GPS_ADST_FREST & BIT2)/*下降沿到了跳出循环开始计数*/
		{
			;
		}
		xp_VC33_StartTimer(TIMER1);

		while (!(R_GPS_ADST_FREST & BIT2))/*上升沿到了跳出循环停止计数*/
		{
			;
		}

		tmp = xp_VC33_StopTimer(TIMER1);
		result = 1 * 10e9/ (tmp * 50.0 );
	}
	else/*现在是低电平*/
	{
		while (!(R_GPS_ADST_FREST & BIT2))/*上升沿到了跳出循环开始计数*/
		{
			;
		}
		xp_VC33_StartTimer(TIMER1);

		while (R_GPS_ADST_FREST & BIT2)/*下降沿到了跳出循环停止计数*/
		{
			;
		}

		tmp = xp_VC33_StopTimer(TIMER1);
		result = 1 * 10e9/ (tmp * 50.0 );
	}

#else
	//

#endif

	return result;	
}

/************************************************************************/
/*                         串口通信                                     */
/************************************************************************/

void	xp_COM_Init(int channel)/*打开串口*/
{
	int temp;
    switch(channel)
    {
	case 0:
		LCRA=0x80;     /*选择特殊寄存器组*/
		DLLA=0x0c;     /*设置波特率为9600bps*/
		DLMA=0;   
		LCRA=0x03;
		//MCRA=0x0f; 
		IERA=0x01;
		FCRA=0xc7; 
		temp = (RHRA) & BYTE0;
		
		break;
	case 1:
		LCRB=0x80;     /*选择特殊寄存器组*/
		DLLB=0x0c;     /*设置波特率为9600bps*/
		DLMB=0;   
		LCRB=0x03;
		MCRB=0x08;
		IERB=0x01;
		FCRB=0xc7; 
		temp = (RHRB) & BYTE0;
		
		break;
	case 2:
		LCRC=0x80;     /*选择特殊寄存器组*/
		DLLC=0x0c;     /*设置波特率为9600bps*/
		DLMC=0;   
		LCRC=0x03;
		//MCRC=0x02;
		IERC=0x01;
		FCRC=0xc7;
		temp = (RHRC) & BYTE0;
		
		break;
	case 3:
		LCRD=0x80;     /*选择特殊寄存器组*/
		DLLD=0x0c;     /*设置波特率为9600kbps*/
		DLMD=0;   
		LCRD=0x03;
		MCRD=0x08;
		IERD=0x01;
		FCRD=0xc7;
		temp = (RHRD) & BYTE0;
	
		break;
	default:
		break;
		
    }
	
}


uint	xp_COM_Flag(void)/*有字符到了的串口标志*/
{
	uint	comFlag = 0;
	comFlag = R_UART & 0xf;
	return comFlag;
}
void	xp_COM_ClearFlag(void)/*清串口标志*/
{
	int clearFlag;
	clearFlag = R_CLRUARTINT;
}

char	xp_COM_ReadChar(int channel)/*从串口读取一个字节*/
{
	unsigned char data;

	switch(channel)
	{                       
	case 0:
		MCRA=0;
		while(((LSRA) & 0x01)==1) /*等待数据到*/
			data=(RHRA) & BYTE0;
		break;
	case 1:
		MCRB=0;
		while(((LSRB) & 0x01)==1)
			data=(RHRB) & BYTE0;
		break;
	case 2:
		//MCRC=0;
		while(((LSRC) & 0x01)==1)
			data=(RHRC) & BYTE0;
		break;
	case 3:
		MCRD=0;
		while(((LSRD) & 0x01)==1)
			data=(RHRD) & BYTE0;
		break;
	default:      
		return -1;
		
	}
	/*接收数据*/ 
	
	return data;  /*接收成功*/
}
void	xp_COM_WriteChar(int channel,char data)//向串口写一个字节
{

	/*发送数据*/
	switch(channel)
	{
	case 0:
		MCRA=0x03;
		while(((LSRA) & 0x20)==0);
		THRA=data;
		while(((LSRA) & 0x20)!=0);
		MCRA=0x0;
		break;
	case 1:
		MCRB=0x03;
		while(((LSRB) & 0x20)==0);
		THRB=data;
		while(((LSRB) & 0x20)!=0);
		MCRB=0x0;
		break;
	case 2:
		//MCRC=0x03;
		while(((LSRC) & 0x20)==0);
		THRC=data;
		while(((LSRC) & 0x20)!=0);
		//MCRC=0x0;
		break;
	case 3:
		MCRD=0x03;
		while(((LSRD) & 0x20)==0);
		THRD=data;
		while(((LSRD) & 0x20)!=0);
		MCRD=0x0;
		break;
	default:      
		break;
	}                

	
}

bool	xp_COM_SendString(int channel,char*	szStr,uint length)
{
	uint	i = 0;
	if(length <= 0)
		return false;
	switch(channel) {
	case UARTA:
		for(i = 0; i < length; i++)
			xp_COM_WriteChar(UARTA,szStr[i]);
		break;
	case UARTB:
		for(i = 0; i < length; i++)
			xp_COM_WriteChar(UARTB,szStr[i]);
		break;
	case UARTC:
		for(i = 0; i < length; i++)
			xp_COM_WriteChar(UARTC,szStr[i]);
		break;
	case UARTD:
		for(i = 0; i < length; i++)
			xp_COM_WriteChar(UARTD,szStr[i]);
		break;
	default:
		break;
	}
	return true;
}

void	clear_string(char* buffer,int len)
{
	int i;
	for(i = 0; i < len; i++)
	{
		*(buffer+i) = 0;
	}
}

bool	region_ok(unsigned int ustart,unsigned int uend)
{
	bool	beprom,bsram,bio,buarta,buartb,buartc,buartd,bnvram,bclock_can,bresult = false;

	beprom = (ustart >= 0x400000) && (uend <= 0x47ffff);
	bsram = (ustart >= 0xf80000) && (uend <= 0xfc0000);
	bio = (ustart >= 0x100000) && (uend <= 0x10000f);
	buarta = (ustart >= 0x700008) && (uend <= 0x70000f);
	buartb = (ustart >= 0x740008) && (uend <= 0x74000f);
	buartc = (ustart >= 0x780008) && (uend <= 0x78000f);
	buartd = (ustart >= 0x7c0008) && (uend <= 0x7c000f);
	bnvram = (ustart >= 0x600000) && (uend <= 0x61ffff);
	bclock_can = (ustart >= 0xc00001) && (uend <= 0xc00003);

	bresult = beprom || bsram || bio || buarta || buartb || buartc || buartd || bnvram || bclock_can;

	return bresult;

}




/************************************************************************/
/*                         CAN 通信                                     */
/************************************************************************/
void	xp_CAN_Init(void)//初始化CAN
{
	unsigned char can_ctrl;

	CAN_ADDRESS = CAN_CTRL;
	can_ctrl = CAN_DATA & BYTE0; 

	while (!can_ctrl & RESREQ)
	{
		CAN_ADDRESS = CAN_CTRL;
		CAN_DATA = RESREQ;
	}
	CAN_ADDRESS = CAN_AC;     CAN_DATA = OWN_ID;
	CAN_ADDRESS = CAN_AM;     CAN_DATA = ACCEPTMASK;
	CAN_ADDRESS = CAN_TMG_0;  CAN_DATA = 0x03;
	CAN_ADDRESS = CAN_TMG_1;  CAN_DATA = 0x1c;
	CAN_ADDRESS = CAN_OCR;    CAN_DATA = 0xde;
	CAN_ADDRESS = CAN_CLKDIV; CAN_DATA = 0x07;
	CAN_ADDRESS = CAN_CTRL;   CAN_DATA = 0x5e;
	CAN_ADDRESS = CAN_CMD ;   CAN_DATA = 0x0c;
}
void	xp_CAN_DumpReg(void)//
{
	unsigned char tmp_read;
	printf("SJA1000 Registers:\n\n");
	CAN_ADDRESS = CAN_CTRL; tmp_read = CAN_DATA & BYTE0;
	printf("CTRL   = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_CTRL; tmp_read = CAN_DATA & BYTE0;
	printf("CMD    = 0x%X\n", CAN_CMD);

	CAN_ADDRESS = CAN_STATUS; tmp_read = CAN_DATA & BYTE0;
	printf("STATUS = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_INT; tmp_read = CAN_DATA & BYTE0;
	printf("INT    = 0x%X\n",tmp_read);

	CAN_ADDRESS = CAN_AC; tmp_read = CAN_DATA & BYTE0;
	printf("AC     = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_AM; tmp_read = CAN_DATA & BYTE0;
	printf("AM     = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_TMG_0; tmp_read = CAN_DATA & BYTE0;
	printf("TMG_0  = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_TMG_1; tmp_read = CAN_DATA & BYTE0;
	printf("TMG_1  = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_OCR; tmp_read = CAN_DATA & BYTE0;
	printf("OCR    = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_TEST; tmp_read = CAN_DATA & BYTE0;
	printf("TEST   = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_TX_ID; tmp_read = CAN_DATA & BYTE0;
	printf("TX_ID  = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_TX_LEN; tmp_read = CAN_DATA & BYTE0;
	printf("TX_LEN = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF0; tmp_read = CAN_DATA & BYTE0;
	printf("TX_BUF = 0x%X", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF1; tmp_read = CAN_DATA & BYTE0;	
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF2; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF3; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF4; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF5; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF6; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_TX_BUF7; tmp_read = CAN_DATA & BYTE0;
	printf(" %X\n", tmp_read);

	CAN_ADDRESS = CAN_RX_ID; tmp_read = CAN_DATA & BYTE0;
	printf("RX_ID  = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_RX_LEN; tmp_read = CAN_DATA & BYTE0;
	printf("RX_LEN = 0x%X\n", tmp_read);

	CAN_ADDRESS = CAN_RX_BUF0; tmp_read = CAN_DATA & BYTE0;
	printf("RX_BUF = 0x%X",tmp_read );

	CAN_ADDRESS = CAN_RX_BUF1; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_RX_BUF2; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_RX_BUF3; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_RX_BUF4; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_RX_BUF5; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_RX_BUF6; tmp_read = CAN_DATA & BYTE0;
	printf(" %X", tmp_read);

	CAN_ADDRESS = CAN_RX_BUF7; tmp_read = CAN_DATA & BYTE0;
	printf(" %X\n", tmp_read);

	CAN_ADDRESS = CAN_CLKDIV; tmp_read = CAN_DATA & BYTE0;
	printf("CLKDIV = 0x%X\n\n", tmp_read);
}

XP_CAN_FRAME	xp_CAN_ReadFrame(void)//从CAN读取一帧数据
{
	XP_CAN_FRAME canframe;
	unsigned int  id;
	unsigned char len;
	unsigned char ustatus,urxid,urxlen,urxb0,urxb1,urxb2,urxb3,urxb4,urxb5,urxb6,urxb7,ucmd;

	CAN_ADDRESS = CAN_STATUS; ustatus = CAN_DATA & BYTE0;

	if (CAN_STATUS & RBS) {
		CAN_ADDRESS = CAN_RX_ID;	urxid = CAN_DATA & BYTE0;
		CAN_ADDRESS = CAN_RX_LEN; urxlen	= CAN_DATA & BYTE0;
		id = ((unsigned int)CAN_RX_ID << 3) + ((CAN_RX_LEN >> 5) & 0x07);
		CAN_ADDRESS = CAN_RX_LEN; urxlen	= CAN_DATA & BYTE0;
		len = urxlen;
		printf("RX_ID  = 0x%X, ", id);
		printf("RX_LEN = 0x%X, ", len);

		CAN_ADDRESS = CAN_RX_BUF0; urxb0	= CAN_DATA & BYTE0; canframe.frame[0] = urxb0;
		CAN_ADDRESS = CAN_RX_BUF1; urxb1	= CAN_DATA & BYTE0; canframe.frame[1] = urxb1;
		CAN_ADDRESS = CAN_RX_BUF2; urxb2	= CAN_DATA & BYTE0; canframe.frame[2] = urxb2;
		CAN_ADDRESS = CAN_RX_BUF3; urxb3	= CAN_DATA & BYTE0; canframe.frame[3] = urxb3;
		printf("RX_BUF = 0x%X %X %X %X",urxb0, urxb1 , urxb2,urxb3);

		CAN_ADDRESS = CAN_RX_BUF4; urxb4	= CAN_DATA & BYTE0; canframe.frame[4] = urxb4;
		CAN_ADDRESS = CAN_RX_BUF5; urxb5	= CAN_DATA & BYTE0; canframe.frame[5] = urxb5;
		CAN_ADDRESS = CAN_RX_BUF6; urxb6	= CAN_DATA & BYTE0; canframe.frame[6] = urxb6;
		CAN_ADDRESS = CAN_RX_BUF7; urxb7	= CAN_DATA & BYTE0; canframe.frame[7] = urxb7;
		
		printf(" %X %X %X %X\n",urxb4 ,urxb5 , urxb6,urxb7);

		CAN_ADDRESS = CAN_CMD; CAN_DATA  = RRB;
	}

	return canframe;
}
void	xp_CAN_WriteFrame(XP_CAN_FRAME canframe)//向CAN写一帧数据
{
	unsigned int  id;
	unsigned char len;

	id  = 0x500;
	len = 8;

	CAN_ADDRESS = CAN_TX_ID; CAN_DATA = id >> 3;
	CAN_ADDRESS = CAN_TX_LEN; CAN_DATA = ((id & 0x07) << 5) | len;
	CAN_ADDRESS = CAN_TX_BUF0; CAN_DATA = canframe.frame[0];
	CAN_ADDRESS = CAN_TX_BUF1; CAN_DATA = canframe.frame[1];
	CAN_ADDRESS = CAN_TX_BUF2; CAN_DATA = canframe.frame[2];
	CAN_ADDRESS = CAN_TX_BUF3; CAN_DATA = canframe.frame[3];
	CAN_ADDRESS = CAN_TX_BUF4; CAN_DATA = canframe.frame[4];
	CAN_ADDRESS = CAN_TX_BUF5; CAN_DATA = canframe.frame[5];
	CAN_ADDRESS = CAN_TX_BUF6; CAN_DATA = canframe.frame[6];
	CAN_ADDRESS = CAN_TX_BUF7; CAN_DATA = canframe.frame[7];
	CAN_ADDRESS = CAN_CMD; CAN_DATA = TXREQ;
}

⌨️ 快捷键说明

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