|
@ -56,39 +56,48 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|
|
********************************************************************************/ |
|
|
********************************************************************************/ |
|
|
#include "uart0.h" |
|
|
#include "uart0.h" |
|
|
#include "../msp/time.h" |
|
|
#include "../msp/time.h" |
|
|
//#define _USE_485
|
|
|
#include "../tpc/debug.h" |
|
|
|
|
|
|
|
|
static volatile Ts_uart_send_buf idata ts_uart_send_shop; |
|
|
int g_uart0_recv_num = 0; |
|
|
|
|
|
|
|
|
TP_Handler_X s_uart0_rec; |
|
|
//发送缓冲区
|
|
|
TS_PH4_modbus s_uart0_ack; |
|
|
static volatile Ts_uart_send_buf idata ts_uart_send_buf; |
|
|
|
|
|
//接收缓冲区最多存放16个字符,这个值尽量小,但要大于实际处理协议的缓冲区大小
|
|
|
|
|
|
U8 uart0_recv_buf[16]; |
|
|
|
|
|
Ts_uart_recv_buf ts_uart0_recv_buf; |
|
|
|
|
|
|
|
|
void L0_uart0_init(void) |
|
|
void L0_uart0_init(void) |
|
|
{ |
|
|
{ |
|
|
U16 val = D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT); |
|
|
U16 val = D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT); |
|
|
SCON = 0x50; //8位数据,可变波特率
|
|
|
SCON = 0x50; //8位数据,可变波特率
|
|
|
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
|
|
|
AUXR &= 0xBF; //定时器时钟12T模式
|
|
|
AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T
|
|
|
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
|
|
|
//T2L = 0xFE; //设定定时初值
|
|
|
TMOD &= 0x0F; //设置定时器模式
|
|
|
//T2H = 0xFF; //设定定时初值
|
|
|
TL1 = val; //设置定时初始值
|
|
|
T2L = val; |
|
|
TH1 = val >> 8; //设置定时初始值
|
|
|
T2H = val >> 8; |
|
|
ET1 = 0; //禁止定时器中断
|
|
|
AUXR |= 0x10; //启动定时器2
|
|
|
TR1 = 1; //定时器1开始计时
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void L0_uart0_buf_init(void) |
|
|
void L0_uart0_buf_init(void) |
|
|
{ |
|
|
{ |
|
|
ts_uart[uNum0].p = &ts_uart_send_shop; |
|
|
//定义发送缓冲区
|
|
|
|
|
|
ts_uart[uNum0].p = &ts_uart_send_buf; |
|
|
ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0; |
|
|
ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0; |
|
|
ts_uart[uNum0].p->ok = D_ready; |
|
|
ts_uart[uNum0].p->ok = D_ready; |
|
|
ts_uart[uNum0].t = &s_uart0_rec; |
|
|
|
|
|
|
|
|
//定义接收缓冲区
|
|
|
|
|
|
ts_uart[uNum0].t = &ts_uart0_recv_buf; |
|
|
|
|
|
ts_uart[uNum0].t->buf = uart0_recv_buf; |
|
|
ts_uart[uNum0].t->head = 0; |
|
|
ts_uart[uNum0].t->head = 0; |
|
|
ts_uart[uNum0].t->ok = 0; |
|
|
ts_uart[uNum0].t->ok = 0; |
|
|
//ts_uart[uNum0].tp_handler = L1_s2b_PH4;
|
|
|
|
|
|
ts_uart[uNum0].tp_handler = NULL; //使用函数指针导致错误
|
|
|
//定义接收处理协议
|
|
|
ts_uart[uNum0].ack = (U8*)&s_uart0_ack; |
|
|
ts_uart[uNum0].tp_handler = L1_s2b_debug; //使用函数指针导致错误
|
|
|
|
|
|
|
|
|
|
|
|
//串口定时器及中断初始化
|
|
|
L0_uart0_init(); |
|
|
L0_uart0_init(); |
|
|
D_uart0_ES_INT(1); //打开串口中断
|
|
|
D_uart0_ES_INT(1); |
|
|
|
|
|
|
|
|
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|
|
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|
|
D_UART0_485_RX() //默认处于接收状态
|
|
|
D_UART0_485_RX() //默认处于接收状态
|
|
@ -113,9 +122,10 @@ void INTERRUPT_UART(void) D_SERVE_UART |
|
|
{ |
|
|
{ |
|
|
L0_uart0_IntRIClear(); //清除接收中断标志
|
|
|
L0_uart0_IntRIClear(); //清除接收中断标志
|
|
|
ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); |
|
|
ts_uart[uNum0].t->reg = L0_uartN_get(uNum0); |
|
|
//ts_uart[uNum0].tp_handler(ts_uart[uNum0].t);
|
|
|
if(ts_uart[uNum0].tp_handler != NULL){ |
|
|
L1_s2b_PH4(ts_uart[uNum0].t); |
|
|
g_uart0_recv_num++; |
|
|
//L0_timer1_restart();
|
|
|
ts_uart[uNum0].tp_handler(ts_uart[uNum0].t); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if(L0_uart0_IntTI()) //如果是U0发送中断
|
|
|
if(L0_uart0_IntTI()) //如果是U0发送中断
|
|
|
{ |
|
|
{ |
|
@ -138,23 +148,5 @@ void INTERRUPT_UART(void) D_SERVE_UART |
|
|
//NOP(); NOP(); NOP();
|
|
|
//NOP(); NOP(); NOP();
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void timer1_isrHanddle(void) D_SERVE_TIMER1 |
|
|
|
|
|
{ |
|
|
|
|
|
struct _tp_handler_x *p = &s_uart0_rec; |
|
|
|
|
|
|
|
|
|
|
|
if((p->head == 1) && (p->num >= D_s_modbus_min)) |
|
|
|
|
|
{ |
|
|
|
|
|
//LED1 ^= 1;
|
|
|
|
|
|
p->head = 0; |
|
|
|
|
|
crc16(p->crc,p->buf,p->num - 2); //校验CRC
|
|
|
|
|
|
if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) |
|
|
|
|
|
{ |
|
|
|
|
|
p->ok = 1; |
|
|
|
|
|
//LED0 ^= 1;
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
L0_timer1_stop(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|