📄 rs485.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 + -