You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.0 KiB

#include "uart0.h"
#include "uartx.h"
void L0_uart0_init(void)
{
U16 val = D_BRT_COUNT(12, D_sys_MainFre, D_uart0_BRT);
SCON = 0x50; // 8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = val; //设置定时初始值
TH1 = val >> 8; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
void L0_uart0_buf_init(void)
{
//定义发送缓冲区
ts_uart[uNum0].s.buf = ts_send_buf.s1;
ts_uart[uNum0].s.bufmax = D_send1_max;
ts_uart[uNum0].s.max = ts_uart[uNum0].s.now = 0;
ts_uart[uNum0].s.ok = D_ready;
//定义接收缓冲区
ts_uart[uNum0].r.buf = ts_recv_buf.r1;
ts_uart[uNum0].r.bufmax = D_recv1_max;
ts_uart[uNum0].r.head = 0;
ts_uart[uNum0].r.ok = 0;
ts_uart[uNum0].r.idle = 1;
ts_uart[uNum0].r.overtime_t = 0;
//定义接收处理协议
ts_uart[uNum0].tp_handler = L0_uartN_overtime_callback;
ts_uart[uNum0].uartx = uNum0;
//串口初始化
L0_uart0_init();
//打开串口中断
D_uart0_ES_INT(1);
//默认处于接收状态
D_UART0_485_RX()
}
/*************************************************
UART
*************************************************/
void INTERRUPT_UART(void) D_SERVE_UART
{
// NOP(); NOP(); NOP();
if (L0_uart0_IntRI()) //如果是U0接收中断
{
L0_uart0_IntRIClear(); //清除接收中断标志
ts_uart[uNum0].r.reg = SBUF; //获取当前数据
L0_uartN_s2b(uNum0); //接收数据至缓冲区
}
if (L0_uart0_IntTI()) //如果是U0发送中断
{
L0_uart0_IntTIClear(); //清除发送中断标志
if (ts_uart[uNum0].s.max > ts_uart[uNum0].s.now)
{
SBUF = ts_uart[uNum0].s.p[ts_uart[uNum0].s.now];
ts_uart[uNum0].s.now++;
}
else
{
ts_uart[uNum0].s.ok = D_ready;
ts_uart[uNum0].s.max = 0;
ts_uart[uNum0].s.now = 0; //可以发送下一个数据
// D_UART0_485_RX() //切换到接收状态
}
}
// NOP(); NOP(); NOP();
}