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

📄 main.c

📁 LPC2103的ARM芯片的串口通信功能
💻 C
📖 第 1 页 / 共 2 页
字号:
	VICVectAddr = 0;  // Acknowledge Interrupt 
}
/*************************串口0发送单个字节******************************************
名称:串口0发送单个字节
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节
输出参数:无
功能:串口0发送单个字节
******************************************************************************/
void UART0_SendByte (unsigned char m)
{
  U0THR = m;		            // 发送数据
  while((U0LSR&0x40)==0 );	    // 等待数据发送完毕
}

/*************************串口0发送字符串******************************************
名称:串口0发送字符串
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:串口0发送字符串
******************************************************************************/
void  UART0_SendString(unsigned char *buf, unsigned short Len)
{
  	unsigned short i;
	IO0SET = SP485_EN0;
	for(i = 0; i < Len; i++) 
  	{
  		UART0_SendByte(buf[i]);
	}
	IO0CLR = SP485_EN0; 
}

/*************************测试串口0发送******************************************
名称:测试串口0发送
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:无
功能:测试串口0发送
******************************************************************************/
void  UART0_SendTest(void)
{
	unsigned char  MESSAGE[6];
	MESSAGE[0] = 0xaa;
	MESSAGE[1] = 0xaa;
	MESSAGE[2] = 0xaa;
	MESSAGE[3] = 0xaa;
	MESSAGE[4] = 0xaa;
	MESSAGE[5] = 0xaa;
	UART0_SendString(MESSAGE, 6);		// 发送数据
}


/*************************串口0数据处理******************************************
名称:串口0初始化
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:无
功能:串口0初始化。包括波特,中断使能,FIFO中断设置
******************************************************************************/
void UART1_Deal(void)
{
	UART0_SendString(UART1_Rcvbuf, UART1_RcvLen);
	UART1_SendString(UART1_Rcvbuf, UART1_RcvLen);
	UART1_RcvLen = 0;
}


/*************************串口1初始化******************************************
作者: 邱志城
日期:2007.09.17
输入参数:串口工作的波特率
输出参数:无
功能:串口1初始化。包括波特,中断使能,FIFO中断设置
******************************************************************************/
void UART1_Init(void)
{
	unsigned int Fdiv;
	U1LCR = 0x83;                   // DLAB = 1,可设置波特率
	Fdiv =(Fpclk/16)/BAUD_RATE;
	U1DLL = Fdiv%256;
	U1DLM = Fdiv/256;
	U1LCR = 0x03;
	U1IER = 0X01;					//设置串口0的中断使能
	U1FCR = 0x01; 	            //使能FIFO,串口接收到4个字节才产生中断	
}
/*************************串口1接收中断*****************************************
名称:串口1接收中断
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:串口1所接收的数据
功能:串口1中断接收, 接收上位机的电总协议
******************************************************************************/
/*
void __irq UART1_IRQ(void)
{
	unsigned char Rcv_data, m;
	if((U1IIR & 0x0f) && 0x04)			 //因为设置FIFO的字节长度为4
	{
		for(m = 0; m < 4; m++)
		{
			Rcv_data = U1RBR;
			TIMER0_count[1] = 0;		//清除计数器
			TIMER0_Flag[1] = TRUE;
			UART1_Rcv_buf[UART1_RcvCount] = Rcv_data;
			UART1_RcvCount++;
		}
//		UART1_LED();
	}
	VICVectAddr = 0;  // Acknowledge Interrupt 
}
*/


void __irq UART1_IRQ(void)
{
	unsigned char  IIRValue, LSRValue, UART1Status;
	unsigned char Rcv_data;

	
	IIRValue = U1IIR;				  //读取中断标识寄存器
	Rcv_data = U1RBR;   			   // Dummy read on RX to clear  
	TIMER0_count[1] = 0;		//清除计数器
	TIMER0_Flag[1] = TRUE;

	IIRValue >>= 1;   // skip pending bit in IIR 
	IIRValue &= 0x07;   // check bit 1~3, interrupt identification 
	
	if (IIRValue == IIR_RLS )  // Receive Line Status 
	{
		LSRValue = U1LSR; 			  //读取线状态寄存器
		if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )			  //判断线状态标志 Receive Line Status 
		{
			UART1Status =  LSRValue;
			VICVectAddr = 0;  // Acknowledge Interrupt 
			return;
		}
		if (LSRValue & LSR_RDR ) // Receive Data Ready    
		{
			UART1_RcvTempbuf[UART1_RcvCount] = Rcv_data;
			UART1_RcvCount++;
		}
	}
	else if (IIRValue == IIR_RDA ) // Receive Data Available 
	{
		// Receive Data Available 
		UART1_RcvTempbuf[UART1_RcvCount] = Rcv_data;
		UART1_RcvCount++;
	}
	else if (IIRValue == IIR_CTI ) // Character timeout indicator 
	{
		// Character Time-out indicator 
		UART1Status |= 0x100;  // Bit 9 as the CTI error 接收超时置位 
	}
	UART1_LED();
	VICVectAddr = 0;  // Acknowledge Interrupt 
}

/*************************串口1发送单个字节******************************************
名称:串口1发送单个字节
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节
输出参数:无
功能:串口1发送单个字节
******************************************************************************/
void UART1_SendByte(unsigned char m)
{
  U1THR = m;		            // 发送数据
  while((U1LSR&0x40)==0 );	    // 等待数据发送完毕
}

/*************************串口1发送字符串******************************************
名称:串口1发送字符串
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:串口1发送字符串
******************************************************************************/
void  UART1_SendString(unsigned char *buf, unsigned short Len)
{
  	unsigned short i;
	IO0SET = SP485_EN1; 
	for(i = 0; i < Len; i++) 
  	{
  		UART1_SendByte(buf[i]);
	}
	IO0CLR = SP485_EN1; 
}


/*************************串口1发送测试数据******************************************
名称:串口1发送测试数据
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:串口1发送测试数据
******************************************************************************/
void  UART1_SendTest(void)
{
	unsigned char  MESSAGE[6];
	MESSAGE[0] = 0xaa;
	MESSAGE[1] = 0xaa;
	MESSAGE[2] = 0xaa;
	MESSAGE[3] = 0xaa;
	MESSAGE[4] = 0xaa;
	MESSAGE[5] = 0xaa;
 	UART1_SendString(MESSAGE, 6);
}
/****************************************************************************
名称:SPI_Init()
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:看门狗初始化
****************************************************************************/
void Spi_Init(void)
{
	SPI_SPCCR = 0x52;			// 设置SPI时钟分频
   	SPI_SPCR = 0xa0;			//SPI中断使能有并行,SPI数据传输高位在先,主模式,时钟极性,高电平有效
}

/****************************************************************************
* 名称:SpiSendByte(unsigned char Sdata)()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  SpiSendByte(unsigned char Sdata)
{
	SPI_SPDR = Sdata;			//发送数据
	while((SPI_SPSR & 0X80) == 0);	   //等待SPIF置位,即等待数据发送完毕
}

/****************************************************************************
* 名称:SpiSendByte(unsigned char Sdata)()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  SpiSendString(unsigned char Scmd, unsigned int Saddr, unsigned char *Sdata, unsigned short SLen)
{
	unsigned short m, i;
	unsigned char tempAddr[4];
	tempAddr[0] = Saddr & 0x000000ff;
	tempAddr[1] = (Saddr >> 8) & 0x0000ff;
	tempAddr[1] = (Saddr >> 16) & 0x00ff;
	tempAddr[3] = (Saddr >> 24);
	
	IO0CLR = CE;					//片选
	SpiSendByte(Scmd);
	for(i = 0; i < 4; i++)
	{
		SpiSendByte(tempAddr[i]);
	}
    for ( i = 0; i < SPI_DelayNum; i++ );	/* delay minimum 250ns */

	for(m = 0; m < SLen; m++)
	{
		SpiSendByte(*Sdata);
		Sdata++;
	}
	IO0SET = CE;}

unsigned char SpiReceiveByte(void)
{
    unsigned char  Sdata;
    while((SPI_SPSR & 0X80) == 0x80);
	Sdata = SPI_SPDR;
    return (Sdata ); 
}
void  SpiReceive(unsigned char Scmd, unsigned short Saddr, unsigned char *Sdata, unsigned short SLen)
{
	unsigned short m, i;
	unsigned char tempAddr[4];
	tempAddr[0] = Saddr & 0x000000ff;
	tempAddr[1] = (Saddr >> 8) & 0x0000ff;
	tempAddr[1] = (Saddr >> 16) & 0x00ff;
	tempAddr[3] = (Saddr >> 24);
	
	IO0CLR = CE;					//片选
	SpiSendByte(Scmd);
	for(i = 0; i < 4; i++)
	{
		SpiSendByte(tempAddr[i]);
	}
    for ( i = 0; i < SPI_DelayNum; i++ );	//也许延进要放在前面 delay minimum 250ns */

	for(m = 0; m < SLen; m++)
	{
		*Sdata = SpiReceiveByte();
		Sdata++;
	}
	IO0SET = CE;
}
	
/*************************看门狗初始化******************************************
名称:WDTINIT()
作者: 邱志城
日期:2007.09.17
输入参数:要发送的字节数组,*buf, 及数组的长度Len
输出参数:无
功能:看门狗初始化
******************************************************************************/
void WDT_Init(unsigned int m)
{
    WDTC = (Fpclk*4)/m;//Fpclk是11059200Hz,
    WDMOD = 0x03;
    WDFEED = 0xAA;
    WDFEED = 0x55;
}

/*************************看门狗初始化******************************************
名称:FEEDWDT()
作者: 邱志城
日期:2007.09.17
输入参数:无
输出参数:无
功能:看门狗喂狗
******************************************************************************/
void WDTFEED(void)
{
	WDFEED = 0xAA;
    WDFEED = 0x55;
} 

/****************************************************************************
**主函数:读取实时时钟的值,并从串口发送出去。
****************************************************************************/
int main(void)
{
	SYSTEM_Init();					  //系统初始化
	PLL_Init();						  //IC工作时钟初始化

	UART0_Init();					  //串口0初始化
	UART1_Init();					  	//UART1_BPS = 57600 串口1初始化

	TIMER0_Init();					  //定时器0初始化
	TIMER1_Init();					  //定时器1初始化

	INTERRUPT_Init();							//中断初始化

	UART0_SendTest();		
	UART1_SendTest();                  // 读取时钟值,并向UART0发送

    Spi_Init();	

//	WDT_Init(8);
	while (1)	
	{
		if(UART0_RcvOk == TRUE)
		{
			UART0_RcvOk = FALSE;
			UART0_Deal();
		}
		if(UART1_RcvOk == TRUE)
		{
			UART1_RcvOk = FALSE;
			UART1_Deal();
		}	
	}
}

⌨️ 快捷键说明

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