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

📄 rs485.c

📁 LPC2103的绝大部分驱动
💻 C
字号:
/*************************************** Copyright (c) *************************************************
*
*										UESTC
*								电子科技大学自动化工程学院
*
*	文 件 名: RS485.C
*	文件描述:实现门禁控制器与上位机的通讯。
*
*	说    明:使用UART1,RS485协议
*
********************************************************************************************************/


#include	"config.h"
#include	"RS485.h"
#include	"RS232.h"
#include	"RTC.h"
#include	"PinSet.h"

//定义全局变量

//串口1,用于RS485
#define 	UART1_BPS					9600
#define 	UART1_DATA_BIT				8
#define 	UART1_STOP_BIT				1
#define 	UART1_PARITY				0


/********************************************************************************************************
*
* 函数名称:IRQ_UART1()
*
* 功能描述:串口1中断服务程序。
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/
void __irq IRQ_UART1(void)
{
	char thisChar;
	unit8 IIR;
	
//	while(((IIR = U1IIR) & 0x01) == 0)
	if(((IIR = U1IIR) & 0x01) == 0)    //最后一位为0表示至少有一个中断被挂起
	{
		switch(IIR & 0x0e)				//判断中断的种类:接收线状态,接收数据可用,字符超时标志,THRE中断
		{
			case 0x02:					//THRE中断		
				break;
				
			case 0x04:					//接收到数据
			
				//读出数据
				thisChar = U1RBR;
				
				break;
				
			default:
				break;
		}
	}
	
	VICVectAddr = 0x00;				//中断服务程序就要这么写的,中断执行完了就要写成这样
	return;
}

/********************************************************************************************************
*
* 函数名称:RS485Initial()
*
* 功能描述:初始化485通讯。
*
* 入口参数:无
* 出口参数:无
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

void RS485Initial(void)
{
	unit32	bak;
	UARTMODE set;
	unit32 baud = UART1_BPS;

	//PINSEL0 = (PINSEL0&(~0x0000000F))|0x00000005;		//设置I/O连接到UART1
	PinFuncSelct(PIN_TXD1, PIN_FUNCTION2);
	PinFuncSelct(PIN_RXD1, PIN_FUNCTION2);
	PinFuncSelct(PIN_485send_EN,PIN_FUNCTION1);
	GPIODirSet(PIN_485send_EN,TRUE);				//引脚PIN_485send_EN即P0.26设置为输入方向
		
	set.datab	= UART1_DATA_BIT;								//8位字符长度
	set.stopb	= UART1_STOP_BIT;								//两位停止位
	set.parity	= UART1_PARITY;								//禁止奇偶产生和校验
	
	//参数过滤
	if((baud == 0)||(baud > 115200)) return;
	if((set.datab < 5)||(set.datab > 8)) return;
	if((set.stopb == 0)||(set.stopb > 2)) return;
	if(set.parity > 4) return;
	
	//设置串口波特率
	U1LCR = 0x80;						// DLAB = 1
	bak = (Fpclk >> 4)/baud;
	U1DLM = bak>>8;
	U1DLL = bak & 0xFF;
	
	//设置串口模式
	bak = set.datab - 5;				// 设置字长
	if(set.stopb == 2) bak|=0x04;		// 判断是否为2位停止位
	
	if(set.parity != 0)
	{	
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U1LCR = bak;
	
	U1FCR = 0x01;						//使能FIFO,并设置触发点为1字节
	U1IER = 0x01;						//允许RBR中断,即接收中断

//	IRQEnable();						//使能IRQ中断
	
	//使能UART0中断
//	VICIntSelect = 0x00000000;			//设置所有的通道为IRQ中断,
	VICVectCntl1 = 0x20 | 0x07;			//UART1分配到IRQ slot1
	VICVectAddr1 = (unit32)IRQ_UART1;	//设置UART1向量地址
	VICIntEnable = 1 << 0x07;			//使能UART1中断
}

/********************************************************************************************************
*
* 函数名称:RS485SendChar(char)
*
* 功能描述:通过RS485向上位机发送一个字节数据。
*
* 入口参数:Data--待发送的字节
* 出口参数:
*
* 全局变量: 无
* 调用模块: 无
*
********************************************************************************************************/

void RS485SendChar(char Data)
{
    IOSET = 0x04000000;
	U1THR = Data;
	while( (U1LSR&0x40)==0 );	    // 等待数据发送完毕
 	IOCLR = 0x04000000;
	
	return;
}



⌨️ 快捷键说明

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