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

📄 xr16l784.c

📁 c6713的源代码
💻 C
字号:
#include "IMU_GW.h"

/***************************************
函数:	Initialize_XR16LChip
功能:	初始化串口芯片
***************************************/
void Initialize_XR16LChip()
{
	unsigned char i;               
	*(unsigned char *)(XR16L_BASE_ADDR + XR16L_RESET_REG_OFFSET) = 0x00;
	for(i=200;i<=0;i--);
	*(unsigned char *)(XR16L_BASE_ADDR + XR16L_RESET_REG_OFFSET) = 0x01;/*复位芯片*/
	for(i=100;i<=0;i--);
	*(unsigned char *)(XR16L_BASE_ADDR + XR16L_X8MODE_REG_OFFSET)= 0x00;/*使用默认的X16*/
	IRQ_enable(IRQ_EVT_EXTINT4);	                            /*启动XR16L784中断4*/	
	IRQ_hook(IRQ_EVT_EXTINT4,ext4_isr); 	
    init_timer1
}

/***************************************
函数:	Initialize_XR16L_Chan
功能:	初始化串口芯片中的一个通道
输入:	chan	一个芯片上的串口通道号,为0,1,2,3
***************************************/
void Initialize_XR16L_Chan(unsigned char chan)
{
	volatile unsigned char * pChan;
			
	pChan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH0_REG_ADDR_OFFSET + chan * XR16L_CH_LENGTH); 
	/*通道的MCR[7]使用默认值(0),设定DLM和DLL,选定38400作为波特率*/
	*(unsigned char *)(pChan + XR16L_CH_EFR_OFFSET) |= 0x10;
	*(unsigned char *)(pChan + XR16L_CH_MCR_OFFSET) |= 0x00; /*460800波特率,0x00, MCR[7] = 1*/
	*(unsigned char *)(pChan + XR16L_CH_LCR_OFFSET) |= 0x80; /*LCR[7] = 1*/
	*(unsigned char *)(pChan + XR16L_CH_DLL_OFFSET)  = 0x01; /*460800波特率,0x0C */
	*(unsigned char *)(pChan + XR16L_CH_DLM_OFFSET)  = 0x00;
	*(unsigned char *)(pChan + XR16L_CH_LCR_OFFSET) &= 0x7F; /*LCR[7] = 0*/
	*(unsigned char *)(pChan + XR16L_CH_LCR_OFFSET) |= 0x03;/*发送数据字长为8位*/
	*(unsigned char *)(pChan + XR16L_CH_FCTR_OFFSET) = 0xC0;/*设置FCTR[7,6]为11,选定Table D*/
	*(unsigned char *)(pChan + XR16L_CH_FCR_OFFSET)  = 0x57;/*启动接收与发送FIFO,复位FIFO,不设定DMA*/
	*(unsigned char *)(pChan + XR16L_CH_TXTRG_OFFSET)= 58;  /*设定接收,发送FIFO的触发点*/
	*(unsigned char *)(pChan + XR16L_CH_RXTRG_OFFSET)= 50;
	*(unsigned char *)(pChan + XR16L_CH_IER_OFFSET) = 0x01;	/*启动接收中断*/
}

/***************************************
函数:	ext4_isr
功能:	串口芯片的中断服务程序
***************************************/
interrupt void ext4_isr()
{
	unsigned char intChanNum;
	volatile unsigned char intReason;
	unsigned char data,dataNum,i;
	volatile unsigned char * pchan;

	intChanNum = *((unsigned char *)(XR16L_BASE_ADDR + XR16L_INT0_REG_OFFSET));
	while(intChanNum)
	{
		if((intChanNum & 0x01) !=0)
		{
			pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH0_REG_ADDR_OFFSET);
			intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));			
			if((intReason & 0x04) !=0)     /*接收到数据,超时或者正常*/
			{
				dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
				for(i = 0; i < dataNum; i++)
				{
					data = 	*((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
					printf("XR16L784 channel 0 receive data %x !\n", data);
				}
			}
		}
		
		if((intChanNum & 0x02) !=0)
		{
			pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH1_REG_ADDR_OFFSET);
			intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));			
			if((intReason & 0x04) !=0)/*接收到数据,超时或者正常*/
			{
				dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
				for(i = 0; i < dataNum; i++)
				{
					data = 	*((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
					//printf("XR16L784 channel 1 receive data %x !\n", data);
				}
			}
		}
		
		if((intChanNum & 0x04) !=0)
		{
			pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH2_REG_ADDR_OFFSET);
			intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));			
			if((intReason & 0x04) !=0)/*接收到数据,超时或者正常*/
			{
				dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
				for(i = 0; i < dataNum; i++)
				{
					data = 	*((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
					//printf("XR16L784 channel 2 receive data %x !\n", data);
				}
			}
		}

		if((intChanNum & 0x08) !=0)
		{
			pchan = (unsigned char *)(XR16L_BASE_ADDR + XR16L_CH3_REG_ADDR_OFFSET);
			intReason = *((unsigned char *)(pchan + XR16L_CH_ISR_OFFSET));			
			if((intReason & 0x04) !=0)/*接收到数据,超时或者正常*/
			{
				dataNum = *((unsigned char *)(pchan + XR16L_CH_RXCNT_OFFSET));
				for(i = 0; i < dataNum; i++)
				{
					data = 	*((unsigned char *)(pchan + XR16L_CH_RHR_OFFSET));
					//printf("XR16L784 channel 3 receive data %x !\n", data);
				}
			}
		}
		intChanNum = *((unsigned char *)(XR16L_BASE_ADDR + XR16L_INT0_REG_OFFSET));
	}
}


/***************************************
函数:	XR16L_SendData
功能:	通过串口发送数据
输入:	chan		一个芯片上的串口通道号,为0,1,2,3
		pdata		发送数据区的首地址(字节地址)
		datanum		发送数据量(按字节来算)
输出:	无
***************************************/
void XR16L_SendData( Uint8 chan, Uint8* pdata, Uint32 datanum)
{
	unsigned short i;
	unsigned char temp,j;
	volatile unsigned char * pChan;

	pChan = (unsigned char *)(XR16L_BASE_ADDR + chan * XR16L_CH_LENGTH);
	for(i = 0; i < datanum; i++)
	{
		temp = *(unsigned char*)(pChan + XR16L_CH_LSR_OFFSET);
		while((temp & 0x20) == 0x00)/*检测发送缓冲区是否可用*/
		{
			temp = *(unsigned char *)(pChan + XR16L_CH_LSR_OFFSET);
		}
		j = *(pdata+i);
		*(unsigned char *)(pChan + XR16L_CH_THR_OFFSET) = j;
	}
}

⌨️ 快捷键说明

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