41 changed files with 964 additions and 790 deletions
@ -1,130 +1,131 @@ |
|||||
#include "app_task_speech.h" |
#include "app_task_speech.h" |
||||
#include "app_task_tcp.h" |
#include "app_task_tcp.h" |
||||
#include "../msp/msp_uart3.h" |
#include "../msp/uart3.h" |
||||
#include "../msp/msp_uart0.h" |
#include "../msp/uart2.h" |
||||
|
#include "../msp/uart0.h" |
||||
|
|
||||
|
|
||||
#define START_CODE 0x7E |
|
||||
#define END_CODE 0xEF |
#define START_CODE 0x7E |
||||
|
#define END_CODE 0xEF |
||||
|
|
||||
TS_TASK_SPEECH ts_speech; |
|
||||
|
TS_TASK_SPEECH ts_speech; |
||||
|
|
||||
void L3_task_speech_init(void) |
|
||||
{ |
void L3_task_speech_init(void) |
||||
//U8 music[6] = {0x7E,0x04,0xAE,0x1E,0x30,0xEF};
|
|
||||
//L0_uart0_sendArray((U8 *)&open,9);
|
|
||||
//U8 code open[9] = {0x7E,0x07,0xA3,0x43,0x30,0x30,0x39,0x86,0xEF};
|
|
||||
//L0_uart3_sendArray((U8 *)&open , 9);
|
|
||||
L1_task_init(&ts_speech.task); |
|
||||
L3_task_s_go(ts_speech,D_task_init); |
|
||||
} |
|
||||
|
|
||||
#define D_task_wait_tcp_order 0x61 |
|
||||
#define D_task_speech_send 0x62 |
|
||||
|
|
||||
void L3_task_speech_handle(TS_TASK_SPEECH *s) |
|
||||
{ |
|
||||
TTSS_Task_init() |
|
||||
L2_task_go(D_task_wait_tcp_order); |
|
||||
TTSS_Task_step(D_task_wait_tcp_order) |
|
||||
if(s_uart2_tcp_rec.ok && (ts_tcp.slaverIndex != 0)) |
|
||||
//if(s_uart2_tcp_rec.ok)
|
|
||||
{ |
|
||||
s_uart2_tcp_rec.ok = 0; |
|
||||
s->pkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); |
|
||||
if(s->pkg->slaver == SERVER_ID) |
|
||||
{ |
|
||||
L3_ccmodbus_slaver_ack(s->pkg,s->ack); |
|
||||
s->ccmd_speech_info[0].start = START_CODE; |
|
||||
s->ccmd_speech_info[0].num = 0x07; |
|
||||
s->ccmd_speech_info[0].oper = SPEECH_NAME_PLAY; |
|
||||
s->ccmd_speech_info[0].title = 0x43; |
|
||||
//ts_speech.ccmd_speech_info[0].buf = (U8*)&R.spee_order;
|
|
||||
s->ccmd_speech_info[0].end = END_CODE; |
|
||||
//Lc_buf_copy_uc((U8 *)&s->ccmd_speech_info[0].buf,(U8 *)&R.spee_order,(U16)2);
|
|
||||
//L0_uart0_sendArray((U8 *)&R.spee_order,2); //00 04
|
|
||||
s->slaverIndex = 0; |
|
||||
s->pkglen = L3_pack_speech(&s->speech_pkg , &s->ccmd_speech_info + s->slaverIndex); |
|
||||
L2_task_go(D_task_speech_send); |
|
||||
} |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
L2_task_go(D_task_wait_tcp_order); |
|
||||
} |
|
||||
TTSS_Task_step(D_task_speech_send) |
|
||||
{ |
|
||||
L0_uart3_sendArray((U8 *)&s->speech_pkg, s->pkglen); |
|
||||
//L0_uart0_sendArray((U8*)&s->speech_pkg,s->pkglen);
|
|
||||
} |
|
||||
L2_task_go(D_task_wait_tcp_order); |
|
||||
TTSS_Task_end(); |
|
||||
} |
|
||||
|
|
||||
U8 ascTable[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; |
|
||||
|
|
||||
U8 *hexBytes2AsciiBytes(U8 asciiBytes[],U8 hexBytes[],U8 hexBytesLen) |
|
||||
{ |
|
||||
U8 i = 0; |
|
||||
for(i=0;i<hexBytesLen;i++) |
|
||||
{ |
|
||||
asciiBytes[i*2] = ascTable[hexBytes[i] >> 4 & 0x0F]; |
|
||||
asciiBytes[i*2 + 1] = ascTable[hexBytes[i] >> 0 & 0x0F]; |
|
||||
|
|
||||
} |
|
||||
return asciiBytes; |
|
||||
} |
|
||||
|
|
||||
U8 Fun_SC_Check(U8 *p1, unsigned short int len) |
|
||||
{ |
|
||||
U8 sum = 0; |
|
||||
for(;len > 0; len--) |
|
||||
{ |
|
||||
sum += *p1++; |
|
||||
} |
|
||||
|
|
||||
return sum; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
|
|
||||
U8 L3_pack_speech_A3(TS_SPEECH *pspeech , U8 start ,U8 num ,U8 title ,U8 end)//tcp传来的buf
|
|
||||
{ |
|
||||
int name; |
|
||||
U8 tcp_buf[6]; |
|
||||
U8 str_buf[6]; |
|
||||
U8 bufsize = 9; |
|
||||
pspeech->start = start; |
|
||||
pspeech->num = num; |
|
||||
pspeech->oper = SPEECH_NAME_PLAY; |
|
||||
pspeech->title = title; |
|
||||
Lc_buf_copy_uc((U8 *)&tcp_buf,(U8 *)&R.spee_order,(U16)2); |
|
||||
hexBytes2AsciiBytes(str_buf,tcp_buf,2); |
|
||||
name = getIndexOfSigns(str_buf[2])*16+getIndexOfSigns(str_buf[3])*1; |
|
||||
pspeech->buf[0] = (U8)(name/100) ; |
|
||||
pspeech->buf[1] = (U8)((name%100)/10); |
|
||||
pspeech->buf[2] = (U8)(name%10); |
|
||||
//L0_uart0_sendArray((U8*)&tcp_buf,3);
|
|
||||
Lc_hex2ascii((U8 *)&pspeech->buf,(U8 *)&pspeech->buf,3); |
|
||||
pspeech->crc = Fun_SC_Check(&pspeech->num,6); //累加和校验
|
|
||||
pspeech->end = end; |
|
||||
return bufsize; |
|
||||
} |
|
||||
|
|
||||
U8 L3_pack_speech(TS_SPEECH *pspeech, CCMD_SPEECH_INFO
*speech_info) |
|
||||
{ |
{ |
||||
U16 pkglen = 0; |
//U8 music[6] = {0x7E,0x04,0xAE,0x1E,0x30,0xEF};
|
||||
switch(speech_info->oper) |
//L0_uart0_sendArray((U8 *)&open,9);
|
||||
|
//U8 code open[9] = {0x7E,0x07,0xA3,0x43,0x30,0x30,0x39,0x86,0xEF};
|
||||
|
//L0_uart3_sendArray((U8 *)&open , 9);
|
||||
|
L1_task_init(&ts_speech.task); |
||||
|
L3_task_s_go(ts_speech,D_task_init); |
||||
|
} |
||||
|
|
||||
|
#define D_task_wait_tcp_order 0x61 |
||||
|
#define D_task_speech_send 0x62 |
||||
|
|
||||
|
void L3_task_speech_handle(TS_TASK_SPEECH *s) |
||||
|
{ |
||||
|
TTSS_Task_init() |
||||
|
L2_task_go(D_task_wait_tcp_order); |
||||
|
TTSS_Task_step(D_task_wait_tcp_order) |
||||
|
// if(s_uart2_tcp_rec.ok && (ts_tcp.slaverIndex != 0))
|
||||
|
//if(s_uart2_tcp_rec.ok)
|
||||
|
{ |
||||
|
// s_uart2_tcp_rec.ok = 0;
|
||||
|
// s->pkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp);
|
||||
|
if(s->pkg->slaver == SERVER_ID) |
||||
|
{ |
||||
|
L3_ccmodbus_slaver_ack(s->pkg,s->ack); |
||||
|
s->ccmd_speech_info[0].start = START_CODE; |
||||
|
s->ccmd_speech_info[0].num = 0x07; |
||||
|
s->ccmd_speech_info[0].oper = SPEECH_NAME_PLAY; |
||||
|
s->ccmd_speech_info[0].title = 0x43; |
||||
|
//ts_speech.ccmd_speech_info[0].buf = (U8*)&R.spee_order;
|
||||
|
s->ccmd_speech_info[0].end = END_CODE; |
||||
|
//Lc_buf_copy_uc((U8 *)&s->ccmd_speech_info[0].buf,(U8 *)&R.spee_order,(U16)2);
|
||||
|
//L0_uart0_sendArray((U8 *)&R.spee_order,2); //00 04
|
||||
|
s->slaverIndex = 0; |
||||
|
s->pkglen = L3_pack_speech(&s->speech_pkg , &s->ccmd_speech_info + s->slaverIndex); |
||||
|
L2_task_go(D_task_speech_send); |
||||
|
} |
||||
|
} |
||||
|
{ |
||||
|
L2_task_go(D_task_wait_tcp_order); |
||||
|
} |
||||
|
TTSS_Task_step(D_task_speech_send) |
||||
|
{ |
||||
|
L0_uart3_sendArray((U8 *)&s->speech_pkg, s->pkglen); |
||||
|
//L0_uart0_sendArray((U8*)&s->speech_pkg,s->pkglen);
|
||||
|
} |
||||
|
L2_task_go(D_task_wait_tcp_order); |
||||
|
TTSS_Task_end(); |
||||
|
} |
||||
|
|
||||
|
U8 ascTable[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; |
||||
|
|
||||
|
U8 *hexBytes2AsciiBytes(U8 asciiBytes[],U8 hexBytes[],U8 hexBytesLen) |
||||
|
{ |
||||
|
U8 i = 0; |
||||
|
for(i=0;i<hexBytesLen;i++) |
||||
|
{ |
||||
|
asciiBytes[i*2] = ascTable[hexBytes[i] >> 4 & 0x0F]; |
||||
|
asciiBytes[i*2 + 1] = ascTable[hexBytes[i] >> 0 & 0x0F]; |
||||
|
|
||||
|
} |
||||
|
return asciiBytes; |
||||
|
} |
||||
|
|
||||
|
U8 Fun_SC_Check(U8 *p1, unsigned short int len) |
||||
|
{ |
||||
|
U8 sum = 0; |
||||
|
for(;len > 0; len--) |
||||
|
{ |
||||
|
sum += *p1++; |
||||
|
} |
||||
|
|
||||
|
return sum; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
U8 L3_pack_speech_A3(TS_SPEECH *pspeech , U8 start ,U8 num ,U8 title ,U8 end)//tcp传来的buf
|
||||
|
{ |
||||
|
int name; |
||||
|
U8 tcp_buf[6]; |
||||
|
U8 str_buf[6]; |
||||
|
U8 bufsize = 9; |
||||
|
pspeech->start = start; |
||||
|
pspeech->num = num; |
||||
|
pspeech->oper = SPEECH_NAME_PLAY; |
||||
|
pspeech->title = title; |
||||
|
Lc_buf_copy_uc((U8 *)&tcp_buf,(U8 *)&R.spee_order,(U16)2); |
||||
|
hexBytes2AsciiBytes(str_buf,tcp_buf,2); |
||||
|
name = getIndexOfSigns(str_buf[2])*16+getIndexOfSigns(str_buf[3])*1; |
||||
|
pspeech->buf[0] = (U8)(name/100) ; |
||||
|
pspeech->buf[1] = (U8)((name%100)/10); |
||||
|
pspeech->buf[2] = (U8)(name%10); |
||||
|
//L0_uart0_sendArray((U8*)&tcp_buf,3);
|
||||
|
Lc_hex2ascii((U8 *)&pspeech->buf,(U8 *)&pspeech->buf,3); |
||||
|
pspeech->crc = Fun_SC_Check(&pspeech->num,6); //累加和校验
|
||||
|
pspeech->end = end; |
||||
|
return bufsize; |
||||
|
} |
||||
|
|
||||
|
U8 L3_pack_speech(TS_SPEECH *pspeech, CCMD_SPEECH_INFO |
||||
|
*speech_info) |
||||
|
{ |
||||
|
U16 pkglen = 0; |
||||
|
switch(speech_info->oper) |
||||
{ |
{ |
||||
case SPEECH_NAME_PLAY: |
case SPEECH_NAME_PLAY: |
||||
pkglen = L3_pack_speech_A3(pspeech,speech_info->start,speech_info->num,speech_info->title,speech_info->end); |
pkglen = L3_pack_speech_A3(pspeech,speech_info->start,speech_info->num,speech_info->title,speech_info->end); |
||||
break; |
break; |
||||
default: |
default: |
||||
break; |
break; |
||||
} |
} |
||||
return pkglen; |
return pkglen; |
||||
} |
} |
||||
|
|
||||
|
@ -0,0 +1,78 @@ |
|||||
|
|
||||
|
#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();
|
||||
|
} |
@ -0,0 +1,84 @@ |
|||||
|
#include "uart2.h" |
||||
|
//#include "uartx.h"
|
||||
|
|
||||
|
//TS_Handle_PH3 s_uart2_tcp_rec;
|
||||
|
|
||||
|
void L0_uart2_init(void) |
||||
|
{ |
||||
|
#if (MainFre_11M == D_sys_MainFre) // 115200bps@11.0592MHz
|
||||
|
S2CON = 0x50; |
||||
|
AUXR |= 0x04; |
||||
|
T2L = 0xE8; |
||||
|
T2H = 0xFF; |
||||
|
AUXR |= 0x10; |
||||
|
|
||||
|
#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
|
||||
|
S2CON = 0x50; //8???,?????
|
||||
|
AUXR |= 0x04; //?????1T??
|
||||
|
T2L = 0xD0; //???????
|
||||
|
T2H = 0xFF; //???????
|
||||
|
AUXR |= 0x10; //???2????
|
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
void L0_uart2_buf_init(void) |
||||
|
{ |
||||
|
//定义发送缓冲区
|
||||
|
ts_uart[uNum2].s.buf = ts_send_buf.s2; |
||||
|
ts_uart[uNum2].s.bufmax = D_send2_max; |
||||
|
ts_uart[uNum2].s.max = ts_uart[uNum2].s.now = 0; |
||||
|
ts_uart[uNum2].s.ok = D_ready; |
||||
|
|
||||
|
//定义接收缓冲区
|
||||
|
ts_uart[uNum2].r.buf = ts_recv_buf.r2; |
||||
|
ts_uart[uNum2].r.bufmax = D_recv2_max; |
||||
|
ts_uart[uNum2].r.head = 0; |
||||
|
ts_uart[uNum2].r.ok = 0; |
||||
|
ts_uart[uNum2].r.idle = 1; |
||||
|
ts_uart[uNum2].r.overtime_t = 0; |
||||
|
|
||||
|
//定义接收处理协议
|
||||
|
ts_uart[uNum2].tp_handler = L0_uartN_overtime_callback; |
||||
|
ts_uart[uNum2].uartx = uNum2; |
||||
|
|
||||
|
//串口初始化
|
||||
|
L0_uart2_init(); |
||||
|
|
||||
|
//打开串口中断
|
||||
|
D_uart2_ES_INT(1); |
||||
|
|
||||
|
//默认处于接收状态
|
||||
|
// D_UART2_485_RX()
|
||||
|
} |
||||
|
|
||||
|
/*************************************************
|
||||
|
UART 中断 |
||||
|
*************************************************/ |
||||
|
#define D_SERVE_uart2 interrupt 8 |
||||
|
void INTERRUPT_uart2(void) D_SERVE_uart2 // using 2
|
||||
|
{ |
||||
|
NOP();NOP();NOP(); |
||||
|
if (L0_uart2_IntRI()) //如果是U2接收中断
|
||||
|
{ |
||||
|
L0_uart2_IntRIClear(); //清除接收中断标志
|
||||
|
ts_uart[uNum2].r.reg = S2BUF; //获取当前数据
|
||||
|
L0_uartN_s2b(uNum2); //接收数据至缓冲区
|
||||
|
} |
||||
|
if (L0_uart2_IntTI()) //如果是U0发送中断
|
||||
|
{ |
||||
|
L0_uart2_IntTIClear(); //清除发送中断标� ��
|
||||
|
if (ts_uart[uNum2].s.max != ts_uart[uNum2].s.now) |
||||
|
{ |
||||
|
S2BUF = ts_uart[uNum2].s.p[ts_uart[uNum2].s.now]; |
||||
|
ts_uart[uNum2].s.now++; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
ts_uart[uNum2].s.ok = D_ready; |
||||
|
ts_uart[uNum2].s.max = 0; |
||||
|
ts_uart[uNum2].s.now = 0; //可以发送下一个数据
|
||||
|
// D_UART2_485_RX() //切换到接收状态
|
||||
|
} |
||||
|
} |
||||
|
NOP();NOP();NOP(); |
||||
|
} |
@ -0,0 +1,88 @@ |
|||||
|
#include "uart3.h" |
||||
|
#include "uartx.h" |
||||
|
|
||||
|
void L0_uart3_init(void) |
||||
|
{ |
||||
|
#if (MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz
|
||||
|
S3CON = 0x10; //8位数据,可变波特率
|
||||
|
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
|
||||
|
T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
|
||||
|
T3L = 0xE8; //设定定时初值
|
||||
|
T3H = 0xFF; //设定定时初值
|
||||
|
T4T3M |= 0x08; //启动定时器3
|
||||
|
|
||||
|
#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
|
||||
|
S3CON = 0x10; //8位数据,可变波特率
|
||||
|
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
|
||||
|
T4T3M &= 0xFD; //定时器时钟12T模式
|
||||
|
T3L = 0xFC; //设置定时初始值
|
||||
|
T3H = 0xFF; //设置定时初始值
|
||||
|
T4T3M |= 0x08; //定时器3开始计时
|
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void L0_uart3_buf_init(void) |
||||
|
{ |
||||
|
//定义发送缓冲区
|
||||
|
ts_uart[uNum3].s.buf = ts_send_buf.s3; |
||||
|
ts_uart[uNum3].s.bufmax = D_send3_max; |
||||
|
ts_uart[uNum3].s.max = ts_uart[uNum3].s.now = 0; |
||||
|
ts_uart[uNum3].s.ok = D_ready; |
||||
|
|
||||
|
//定义接收缓冲区
|
||||
|
ts_uart[uNum3].r.buf = ts_recv_buf.r3; |
||||
|
ts_uart[uNum3].r.bufmax = D_recv3_max; |
||||
|
ts_uart[uNum3].r.head = 0; |
||||
|
ts_uart[uNum3].r.ok = 0; |
||||
|
ts_uart[uNum3].r.idle = 1; |
||||
|
ts_uart[uNum3].r.overtime_t = 0; |
||||
|
|
||||
|
//串口协议解析专用字段
|
||||
|
ts_uart[uNum3].tp_handler = L0_uartN_overtime_callback; |
||||
|
ts_uart[uNum3].uartx = uNum3; |
||||
|
|
||||
|
//串口初始化
|
||||
|
L0_uart3_init(); |
||||
|
|
||||
|
//打开串口中断
|
||||
|
D_uart3_ES_INT(1); |
||||
|
|
||||
|
//默认处于接收状态
|
||||
|
//D_UART3_485_RX()
|
||||
|
} |
||||
|
|
||||
|
/*************************************************
|
||||
|
UART 中断 |
||||
|
*************************************************/ |
||||
|
#define D_SERVE_UART3 interrupt 17 |
||||
|
void INTERRUPT_UART3(void) D_SERVE_UART3// using 3
|
||||
|
{ |
||||
|
NOP(); NOP(); NOP(); |
||||
|
if(L0_uart3_IntRI()) //如果是U3接收中断
|
||||
|
{ |
||||
|
L0_uart3_IntRIClear(); //清除接收中断标志
|
||||
|
ts_uart[uNum3].r.reg = S3BUF; //获取当前数据
|
||||
|
L0_uartN_s2b(uNum3); //接收数据至缓冲区
|
||||
|
} |
||||
|
if(L0_uart3_IntTI()) //如果是U0发送中断
|
||||
|
{ |
||||
|
L0_uart3_IntTIClear(); //清除发送中断标志
|
||||
|
if(ts_uart[uNum3].s.max != ts_uart[uNum3].s.now) |
||||
|
{ |
||||
|
S3BUF = ts_uart[uNum3].s.p[ts_uart[uNum3].s.now]; |
||||
|
ts_uart[uNum3].s.now ++; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
ts_uart[uNum3].s.ok = D_ready; |
||||
|
ts_uart[uNum3].s.max = 0; |
||||
|
ts_uart[uNum3].s.now = 0;//可以发送下一个数据
|
||||
|
//D_UART3_485_RX() //切换到接收状态
|
||||
|
} |
||||
|
} |
||||
|
NOP(); NOP(); NOP(); |
||||
|
} |
||||
|
|
||||
|
|
@ -0,0 +1,39 @@ |
|||||
|
#ifndef _uart3_H |
||||
|
#define _uart3_H |
||||
|
|
||||
|
#include "../bsp/bsp_config.h" |
||||
|
#include "uartx.h" |
||||
|
|
||||
|
#define uNum3 2 |
||||
|
|
||||
|
//#define S4SM0 BITN7
|
||||
|
#define D_uart3_ES_INT(x) (x) ? (BITN_1(IE2,ES3)) : (BITN_0(IE2,ES3)) |
||||
|
//#define D_uart3_ES_INT_CLOSE() BITN_0(IE2,ES3)
|
||||
|
//#define D_uart3_ES_INT_OPEN() BITN_1(IE2,ES3)
|
||||
|
#define L0_uart3_IntRI() (S3CON & S3RI)//BITN_G(SCON,U0RI)
|
||||
|
#define L0_uart3_IntTI() (S3CON & S3TI)//BITN_G(SCON,U0TI)
|
||||
|
#define L0_uart3_IntRIClear(); BITN_0(S3CON,S3RI) |
||||
|
#define L0_uart3_IntTIClear(); BITN_0(S3CON,S3TI) |
||||
|
#define L0_uart3_set(x) S3BUF = (x); |
||||
|
#define L0_uart3_get() (S3BUF) |
||||
|
|
||||
|
|
||||
|
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
|
|
||||
|
void L0_uart3_buf_init(void); |
||||
|
|
||||
|
void FOUR_G_ATEST(void); |
||||
|
|
||||
|
#define L0_uart3_uc(X) L0_uartN_uc(uNum3,X) |
||||
|
#define L0_uart3_us(X) L0_uartN_us(uNum3,X) |
||||
|
#define L0_uart3_ul(X) L0_uartN_ul(uNum3,X) |
||||
|
#define L0_uart3_0d0a() L0_uartN_0d0a(uNum3) |
||||
|
#define L0_uart3_uchex(X) L0_uartN_uchex(uNum3,X) |
||||
|
#define L0_uart3_ushex(X) L0_uartN_ushex(uNum3,X) |
||||
|
#define L0_uart3_ulhex(X) L0_uartN_ulhex(uNum3,X) |
||||
|
#define L0_uart3_sendstr(buf) L0_uartN_sendstr(uNum3,buf) |
||||
|
#define L0_uart3_sendArray(buf, n) L0_uartN_sendArray(uNum3,buf,n) |
||||
|
#define L0_uart3_sendArrayHex(buf, n) L0_uartN_sendArrayHex(uNum3,buf,n) |
||||
|
|
||||
|
#endif //#ifndef _uart3_H
|
||||
|
|
@ -0,0 +1,98 @@ |
|||||
|
|
||||
|
#include "uart4.h" |
||||
|
|
||||
|
//#define FOSC 11059200L //系统频率
|
||||
|
//#define BAUD4 115200 //串口波特率
|
||||
|
void L0_uart4_init(void)//115200bps@11.0592MHz
|
||||
|
{ |
||||
|
#if(MainFre_11M == D_sys_MainFre) |
||||
|
#if 0 |
||||
|
S4CON = 0x50; //8位可变波特率
|
||||
|
T4L = (65536 - (FOSC/4/BAUD4)); //设置波特率重装值
|
||||
|
T4H = (65536 - (FOSC/4/BAUD4))>>8; |
||||
|
T4T3M |= 0x20; //定时器4为1T模式
|
||||
|
T4T3M |= 0x80; //定时器4开始计时
|
||||
|
#else |
||||
|
S4CON = 0x10; //8位数据,可变波特率
|
||||
|
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
|
||||
|
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
|
||||
|
T4L = 0xE8; //设定定时初值
|
||||
|
T4H = 0xFF; //设定定时初值
|
||||
|
T4T3M |= 0x80; //启动定时器4
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
|
||||
|
S4CON = 0x10; //8位数据,可变波特率
|
||||
|
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
|
||||
|
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
|
||||
|
T4L = 0xD0; //设定定时初值
|
||||
|
T4H = 0xFF; //设定定时初值
|
||||
|
T4T3M |= 0x80; //启动定时器4
|
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
void L0_uart4_buf_init(void) |
||||
|
{ |
||||
|
//定义发送缓冲区
|
||||
|
ts_uart[uNum4].s.buf = ts_send_buf.s4; |
||||
|
ts_uart[uNum4].s.bufmax = D_send4_max; |
||||
|
ts_uart[uNum4].s.max = ts_uart[uNum4].s.now = 0; |
||||
|
ts_uart[uNum4].s.ok = D_ready; |
||||
|
|
||||
|
//定义接收缓冲区
|
||||
|
ts_uart[uNum4].r.buf = ts_recv_buf.r4; |
||||
|
ts_uart[uNum4].r.bufmax = D_recv4_max; |
||||
|
ts_uart[uNum4].r.head = 0; |
||||
|
ts_uart[uNum4].r.ok = 0; |
||||
|
ts_uart[uNum4].r.idle = 1; |
||||
|
ts_uart[uNum4].r.overtime_t = 0; |
||||
|
|
||||
|
//串口协议解析专用字段
|
||||
|
ts_uart[uNum4].tp_handler = L0_uartN_overtime_callback; |
||||
|
ts_uart[uNum4].uartx = uNum4; |
||||
|
|
||||
|
//串口初始化
|
||||
|
L0_uart4_init(); |
||||
|
|
||||
|
//打开串口中断
|
||||
|
D_uart4_ES_INT(1); |
||||
|
|
||||
|
//默认处于接收状态
|
||||
|
//D_UART4_485_RX()
|
||||
|
} |
||||
|
|
||||
|
/*************************************************
|
||||
|
UART 中断 |
||||
|
*************************************************/ |
||||
|
|
||||
|
// #define D_SERVE_uart4 interrupt 18
|
||||
|
// void INTERRUPT_uart4(void) D_SERVE_uart4// using 2
|
||||
|
// {
|
||||
|
// //NOP(); NOP(); NOP();
|
||||
|
// if(L0_uart4_IntRI()) //如果是U0接收中断
|
||||
|
// {
|
||||
|
// L0_uart4_IntRIClear(); //清除接收中断标志
|
||||
|
// ts_uart[uNum4].r.reg = S4BUF; //获取当前数据
|
||||
|
// L0_uartN_s2b(uNum4); //接收数据至缓冲区
|
||||
|
// }
|
||||
|
// if(L0_uart4_IntTI()) //如果是U0发送中断
|
||||
|
// {
|
||||
|
// L0_uart4_IntTIClear(); //清除发送中断标志
|
||||
|
// if(ts_uart[uNum4].s.max != ts_uart[uNum4].s.now)
|
||||
|
// {
|
||||
|
// S4BUF = ts_uart[uNum4].s.p[ts_uart[uNum4].s.now];
|
||||
|
// ts_uart[uNum4].s.now ++;
|
||||
|
// }
|
||||
|
// else
|
||||
|
// {
|
||||
|
// ts_uart[uNum4].s.ok = D_ready;
|
||||
|
// ts_uart[uNum4].s.max = 0;
|
||||
|
// ts_uart[uNum4].s.now = 0;//可以发送下一个数据
|
||||
|
// D_UART4_485_RX() //切换到接收状态
|
||||
|
// }
|
||||
|
// }
|
||||
|
// //NOP(); NOP(); NOP();
|
||||
|
// }
|
||||
|
|
||||
|
|
@ -0,0 +1,240 @@ |
|||||
|
|
||||
|
#include "uartx.h" |
||||
|
|
||||
|
TS_uart_reg ts_uart[SERIAL_MAX_NUM] = {0}; |
||||
|
TS_send_buf ts_send_buf; |
||||
|
TS_recv_buf ts_recv_buf; |
||||
|
|
||||
|
void L0_uartN_set(U8 uartx, U8 x) /*reentrant*/ |
||||
|
{ |
||||
|
switch (uartx) |
||||
|
{ |
||||
|
case 0: |
||||
|
SBUF = (x); |
||||
|
break; |
||||
|
case 1: |
||||
|
S2BUF = (x); |
||||
|
break; |
||||
|
case 2: |
||||
|
S3BUF = (x); |
||||
|
break; |
||||
|
case 3: |
||||
|
S4BUF = (x); |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
U8 L0_uartN_get(U8 uartx) |
||||
|
{ |
||||
|
U8 x = 0; |
||||
|
switch (uartx) |
||||
|
{ |
||||
|
case 0: |
||||
|
x = SBUF; |
||||
|
break; |
||||
|
case 1: |
||||
|
x = S2BUF; |
||||
|
break; |
||||
|
case 2: |
||||
|
x = S3BUF; |
||||
|
break; |
||||
|
case 3: |
||||
|
x = S4BUF; |
||||
|
break; |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
return x; |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_485(U8 uartx) |
||||
|
{ |
||||
|
switch(uartx) |
||||
|
{ |
||||
|
// case 0: D_UART0_485_TX(); break;
|
||||
|
// case 1: D_UART2_485_TX(); break;
|
||||
|
// case 2: D_UART3_485_TX(); break;
|
||||
|
// case 3: D_UART4_485_TX(); break;
|
||||
|
default: break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void L0_waitFree_uartN(U8 uartx) |
||||
|
{ |
||||
|
ts_uart[uartx].s.over = 0; |
||||
|
while (ts_uart[uartx].s.ok != D_ready) |
||||
|
{ |
||||
|
#if 1 //发送数据特别快时,某些情况下会导致数据发送出错
|
||||
|
ts_uart[uartx].s.over++; |
||||
|
if (ts_uart[uartx].s.over > 20000) |
||||
|
{ |
||||
|
ts_uart[uartx].s.max = 0; |
||||
|
ts_uart[uartx].s.now = 0; |
||||
|
ts_uart[uartx].s.ok = D_ready; |
||||
|
break; |
||||
|
} |
||||
|
#endif |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_sendArray(U8 uartx, void *buf, U16 len) |
||||
|
{ |
||||
|
U16 i; |
||||
|
if (len == 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
L0_waitFree_uartN(uartx); |
||||
|
|
||||
|
L0_uartN_485(uartx); |
||||
|
ts_uart[uartx].s.ok = D_clear; |
||||
|
ts_uart[uartx].s.over = 0; |
||||
|
ts_uart[uartx].s.max = len; |
||||
|
ts_uart[uartx].s.now = 1; |
||||
|
if (len <= ts_uart[uartx].s.bufmax) |
||||
|
{ |
||||
|
//将参数buf拷贝至内部buf
|
||||
|
for (i = 0; i < len; i++) |
||||
|
{ |
||||
|
ts_uart[uartx].s.buf[i] = ((U8 *)buf)[i]; |
||||
|
} |
||||
|
ts_uart[uartx].s.p = ts_uart[uartx].s.buf; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
//不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错
|
||||
|
ts_uart[uartx].s.p = (U8 *)buf; |
||||
|
} |
||||
|
L0_uartN_set(uartx, ts_uart[uartx].s.p[0]); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_uc(U8 uartx, U8 ww) |
||||
|
{ |
||||
|
L0_uartN_sendArray(uartx, &ww, 1); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_us(U8 uartx, vU16 ww) |
||||
|
{ |
||||
|
U_U16 uStemp; |
||||
|
uStemp.word = ww; |
||||
|
ts_uart[uartx].s.buf3[0] = uStemp.BYTE2.h; |
||||
|
ts_uart[uartx].s.buf3[1] = uStemp.BYTE2.l; |
||||
|
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_ul(U8 uartx, vU32 ww) |
||||
|
{ |
||||
|
U_U32 uStemp; |
||||
|
L0_waitFree_uartN(uartx); |
||||
|
uStemp.dWord = ww; |
||||
|
ts_uart[uartx].s.buf3[0] = uStemp.BYTE4.byte0; |
||||
|
ts_uart[uartx].s.buf3[1] = uStemp.BYTE4.byte1; |
||||
|
ts_uart[uartx].s.buf3[2] = uStemp.BYTE4.byte2; |
||||
|
ts_uart[uartx].s.buf3[3] = uStemp.BYTE4.byte3; |
||||
|
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 4); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_0d0a(U8 uartx) |
||||
|
{ |
||||
|
L0_waitFree_uartN(uartx); |
||||
|
ts_uart[uartx].s.buf3[0] = 0x0d; |
||||
|
ts_uart[uartx].s.buf3[1] = 0x0a; |
||||
|
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_uchex(U8 uartx, U8 ww) |
||||
|
{ |
||||
|
L0_waitFree_uartN(uartx); |
||||
|
ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(ww)][1]; |
||||
|
ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(ww)][1]; |
||||
|
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 2); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_ushex(U8 uartx, vU16 ww) |
||||
|
{ |
||||
|
U_F16 k; |
||||
|
L0_waitFree_uartN(uartx); |
||||
|
k.us = ww; |
||||
|
ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; |
||||
|
ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(k.BYTE2.H)][1]; |
||||
|
ts_uart[uartx].s.buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; |
||||
|
ts_uart[uartx].s.buf3[3] = cguHex2Char[D_uc_low(k.BYTE2.L)][1]; |
||||
|
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 4); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_ulhex(U8 uartx, U32 ww) |
||||
|
{ |
||||
|
U_U32 k; |
||||
|
L0_waitFree_uartN(uartx); |
||||
|
k.dWord = ww; |
||||
|
ts_uart[uartx].s.buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; |
||||
|
ts_uart[uartx].s.buf3[1] = cguHex2Char[D_uc_low(k.BYTE4.byte0)][1]; |
||||
|
ts_uart[uartx].s.buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; |
||||
|
ts_uart[uartx].s.buf3[3] = cguHex2Char[D_uc_low(k.BYTE4.byte1)][1]; |
||||
|
ts_uart[uartx].s.buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; |
||||
|
ts_uart[uartx].s.buf3[5] = cguHex2Char[D_uc_low(k.BYTE4.byte2)][1]; |
||||
|
ts_uart[uartx].s.buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; |
||||
|
ts_uart[uartx].s.buf3[7] = cguHex2Char[D_uc_low(k.BYTE4.byte3)][1]; |
||||
|
L0_uartN_sendArray(uartx, ts_uart[uartx].s.buf3, 8); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_sendstr(U8 uartx, U8 *str) |
||||
|
{ |
||||
|
L0_uartN_sendArray(uartx, str, Lc_strlen(str)); |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_sendArrayHex(U8 uartx, vU8 *buf, U16 n) |
||||
|
{ |
||||
|
U16 i; |
||||
|
for (i = 0; i < n; i++) |
||||
|
{ |
||||
|
L0_uartN_uchex(uartx, buf[i]); |
||||
|
L0_uartN_uc(uartx, ' '); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_s2b(U8 uartx) |
||||
|
{ |
||||
|
if(ts_uart[uartx].r.head == 0) |
||||
|
{ |
||||
|
ts_uart[uartx].r.head = 1; |
||||
|
ts_uart[uartx].r.ok = 0; |
||||
|
ts_uart[uartx].r.num = 0; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
if(ts_uart[uartx].r.num >= ts_uart[uartx].r.bufmax) |
||||
|
{ |
||||
|
ts_uart[uartx].r.num = 0; |
||||
|
} |
||||
|
} |
||||
|
ts_uart[uartx].r.buf[ ts_uart[uartx].r.num ] = ts_uart[uartx].r.reg; |
||||
|
ts_uart[uartx].r.num++; |
||||
|
ts_uart[uartx].r.idle = 0; |
||||
|
ts_uart[uartx].r.overtime_t = 0; |
||||
|
} |
||||
|
|
||||
|
void L0_uartN_overtime_callback(U8 uartx) |
||||
|
{ |
||||
|
if(0 == ts_uart[uartx].r.idle) |
||||
|
{ |
||||
|
if(ts_uart[uartx].r.overtime_t >= 2) |
||||
|
{ |
||||
|
//设置总线空闲
|
||||
|
ts_uart[uartx].r.idle = 1; |
||||
|
ts_uart[uartx].r.head = 0; |
||||
|
ts_uart[uartx].r.overtime_t = 0; |
||||
|
|
||||
|
//数据不为空
|
||||
|
if(ts_uart[uartx].r.num > 0) |
||||
|
{ |
||||
|
/// 接收到的数据结束: 总线空闲+buf非空
|
||||
|
// ts_uart[uartx].r.num = 0;
|
||||
|
ts_uart[uartx].r.ok = 1; |
||||
|
} |
||||
|
} |
||||
|
ts_uart[uartx].r.overtime_t ++; |
||||
|
} |
||||
|
} |
@ -0,0 +1,97 @@ |
|||||
|
|
||||
|
#ifndef _uartN_H |
||||
|
#define _uartN_H |
||||
|
#include "../clib/clib.h" |
||||
|
#include "../tpc/tpc_x.h" |
||||
|
#include "../bsp/bsp_config.h" |
||||
|
|
||||
|
#define SERIAL_MAX_NUM 4 |
||||
|
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
|
||||
|
|
||||
|
#define D_uartN_free() (0 == ts_uart_send_buf[uartx].max) |
||||
|
#define D_uartN_busy() (0 != ts_uart_send_buf[uartx].max) |
||||
|
#define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t))) |
||||
|
|
||||
|
/////可以依据实际使用独立定制
|
||||
|
#define D_send1_max 64 |
||||
|
#define D_send2_max 64 |
||||
|
#define D_send3_max 128 |
||||
|
#define D_send4_max 64 |
||||
|
|
||||
|
/////可以依据实际使用独立定制
|
||||
|
#define D_recv1_max 64 |
||||
|
#define D_recv2_max 64 |
||||
|
#define D_recv3_max 128 |
||||
|
#define D_recv4_max 64 |
||||
|
|
||||
|
typedef struct |
||||
|
{ |
||||
|
U8 r1[D_recv1_max]; |
||||
|
U8 r2[D_recv2_max]; |
||||
|
U8 r3[D_recv3_max]; |
||||
|
U8 r4[D_recv4_max]; |
||||
|
}TS_recv_buf; |
||||
|
|
||||
|
typedef struct |
||||
|
{ |
||||
|
U8 s1[D_send1_max]; |
||||
|
U8 s2[D_send2_max]; |
||||
|
U8 s3[D_send3_max]; |
||||
|
U8 s4[D_send4_max]; |
||||
|
}TS_send_buf; |
||||
|
|
||||
|
typedef struct _TS_uart_reg |
||||
|
{ |
||||
|
struct |
||||
|
{ |
||||
|
vU8 num; //接收到的数目注意数据长度的范围
|
||||
|
vU8 *p; |
||||
|
vU16 now; /// 当前buf所在的位置 0------(max-1)
|
||||
|
vU16 max; /// 当前buf中数据长度,也就是需要发送的长度
|
||||
|
vU32 over; /// 结束等待标志,over累加到某个值时,结束等待
|
||||
|
vU8 ok; /// 发送完成标志
|
||||
|
vU8 *buf; |
||||
|
vU8 buf3[D_UART_send_buf2_max]; |
||||
|
U16 bufmax; ///buf的最大长度
|
||||
|
}s; |
||||
|
|
||||
|
struct |
||||
|
{ |
||||
|
vU8 reg; |
||||
|
vU8 ok; //接收协议ok标志,串口初始化设置为0
|
||||
|
vU8 idle; //空闲标志
|
||||
|
vU8 overtime_t; //超时溢出的计数器
|
||||
|
vU8 head; //接收标志头标志,串口初始化设置0
|
||||
|
vU8 num; //协议实际长度
|
||||
|
vU8 *buf; ////协议缓冲,由每个串口根据需要的缓冲区大小自己定义
|
||||
|
U16 bufmax; ///buf的最大长度
|
||||
|
}r; |
||||
|
|
||||
|
void (*tp_handler)(U8 uartx); |
||||
|
U8 uartx; |
||||
|
|
||||
|
}TS_uart_reg; |
||||
|
|
||||
|
extern TS_uart_reg ts_uart[SERIAL_MAX_NUM]; |
||||
|
extern TS_send_buf ts_send_buf; |
||||
|
extern TS_recv_buf ts_recv_buf; |
||||
|
|
||||
|
extern void L0_uartN_init(U8 uartx); |
||||
|
extern void L0_uartN_set(U8 uartx,U8 x); |
||||
|
extern U8 L0_uartN_get(U8 uartx); |
||||
|
extern void L0_uartN_sendArray(U8 uartx,void *buf,U16 len); |
||||
|
extern void L0_uartN_uc(U8 uartx,U8 ww); |
||||
|
extern void L0_uartN_us(U8 uartx,vU16 ww); |
||||
|
extern void L0_uartN_ul(U8 uartx,vU32 ww); |
||||
|
extern void L0_uartN_0d0a(U8 uartx); |
||||
|
extern void L0_uartN_uchex(U8 uartx, U8 ww); |
||||
|
extern void L0_uartN_ushex(U8 uartx, U16 ww); |
||||
|
extern void L0_uartN_ulhex(U8 uartx, U32 ww); |
||||
|
extern void L0_uartN_sendstr(U8 uartx,U8 *buf); |
||||
|
extern void L0_uartN_sendArrayHex(U8 uartx,vU8 *buf,U16 n); |
||||
|
extern void L0_uartN_s2b(U8 uartx); |
||||
|
extern void L0_uartN_overtime_callback(U8 uartx); |
||||
|
|
||||
|
|
||||
|
#endif //#ifndef _uartN_H
|
||||
|
|
@ -1,180 +0,0 @@ |
|||||
//////////////////////////////////////////////////////////////////////////
|
|
||||
/// COPYRIGHT NOTICE
|
|
||||
/// Copyright (c) 2015, 传控科技
|
|
||||
/// All rights reserved.
|
|
||||
///
|
|
||||
/// @file main.c
|
|
||||
/// @brief main app
|
|
||||
///
|
|
||||
///(本文件实现的功能的详述)
|
|
||||
///
|
|
||||
/// @version 1.1 CCsens technology
|
|
||||
/// @author CC
|
|
||||
/// @date 20150102
|
|
||||
///
|
|
||||
///
|
|
||||
/// 修订说明:最初版本
|
|
||||
/// Modified by:
|
|
||||
/// Modified date:
|
|
||||
/// Version:
|
|
||||
/// Descriptions:
|
|
||||
// 20160413 CC-ACC-VH02
|
|
||||
// 连接至 J22 RXD0 TXD0
|
|
||||
//P5_DIR &= ~BITN1; //p5.1输出TXD
|
|
||||
//P5_DIR |= BITN0; //p5.0输入RXD
|
|
||||
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
|
|
||||
//P5_SEL1 |= BITN0 +BITN1;
|
|
||||
|
|
||||
/*****************************************************************************
|
|
||||
update by cc @201700110 |
|
||||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|
||||
个需要平衡的事情. |
|
||||
|
|
||||
clib/clib.c: |
|
||||
公用的函数 和硬件无关 |
|
||||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|
||||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|
||||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
uartcom/Uprotocol2app |
|
||||
协议到应用 |
|
||||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|
||||
|
|
||||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|
||||
L3_UARTcom0_exp_protocol 解析应用协议 |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|
||||
公用的串口通讯定义 |
|
||||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|
||||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|
||||
-------------------------------------------------------------------------------------------- |
|
||||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|
||||
L0_UART0_Init |
|
||||
UART0_IRQHandler |
|
||||
L0_Usend_uc------UserDef |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
********************************************************************************/ |
|
||||
#include "msp_uart0.h" |
|
||||
#include "../msp/time.h" |
|
||||
//#define _USE_485
|
|
||||
|
|
||||
static volatile Ts_uart_send_buf idata ts_uart_send_shop; |
|
||||
|
|
||||
TP_Handler_X s_uart0_rec; |
|
||||
TS_PH4_modbus s_uart0_ack; |
|
||||
|
|
||||
void L0_uart0_init(void) |
|
||||
{ |
|
||||
// U16 val1= D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT);
|
|
||||
// SCON = 0x50; //8位数据,可变波特率
|
|
||||
// AUXR |= 0x01; //串口1选择定时器2为波特率发生器
|
|
||||
// AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T
|
|
||||
// T2L = val1;
|
|
||||
// T2H = val1 >> 8;
|
|
||||
// AUXR |= 0x10; //启动定时器2
|
|
||||
SCON = 0x50; //8位数据,可变波特率
|
|
||||
AUXR &= 0xBF; //定时器时钟12T模式
|
|
||||
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
|
|
||||
TMOD &= 0x0F; //设置定时器模式
|
|
||||
TL1 = 0xFC; //设置定时初始值
|
|
||||
TH1 = 0xFF; //设置定时初始值
|
|
||||
//// TL1 = val1; //设置定时初始值
|
|
||||
//// TH1 = val1 >> 8; //设置定时初始值
|
|
||||
ET1 = 0; //禁止定时器%d中断
|
|
||||
TR1 = 1; //定时器1开始计时
|
|
||||
// SCON = 0x50; //8位数据,可变波特率
|
|
||||
// AUXR |= 0x01; //串口1选择定时器2为波特率发生器
|
|
||||
// AUXR &= 0xFB; //定时器时钟12T模式
|
|
||||
// T2L = 0xE8; //设置定时初始值
|
|
||||
// T2H = 0xFF; //设置定时初始值
|
|
||||
// AUXR |= 0x10; //定时器2开始计时
|
|
||||
} |
|
||||
|
|
||||
void L0_uart0_buf_init(void) |
|
||||
{ |
|
||||
ts_uart[uNum0].p = &ts_uart_send_shop; |
|
||||
ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0; |
|
||||
ts_uart[uNum0].p->ok = D_ready; |
|
||||
ts_uart[uNum0].t = &s_uart0_rec; |
|
||||
ts_uart[uNum0].t->head = 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; |
|
||||
L0_uart0_init(); |
|
||||
D_uart0_ES_INT(1); //打开串口中断
|
|
||||
|
|
||||
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|
||||
D_UART0_485_RX() //默认处于接收状态
|
|
||||
#endif |
|
||||
} |
|
||||
|
|
||||
void L0_uart0_sendArray(U8 * buf, U16 len) |
|
||||
{ |
|
||||
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|
||||
D_UART0_485_TX() //切换到输出状态
|
|
||||
#endif |
|
||||
L0_uartN_sendArray(uNum0,buf,len); |
|
||||
} |
|
||||
|
|
||||
/*************************************************
|
|
||||
UART 中断 |
|
||||
*************************************************/ |
|
||||
void INTERRUPT_UART(void) D_SERVE_UART |
|
||||
{ |
|
||||
//NOP(); NOP(); NOP();
|
|
||||
if(L0_uart0_IntRI()) //如果是U0接收中断
|
|
||||
{ |
|
||||
// LED0 ^= 1;
|
|
||||
L0_uart0_IntRIClear(); //清除接收中断标志
|
|
||||
ts_uart[uNum0].t->reg = SBUF; |
|
||||
//ts_uart[uNum0].tp_handler(ts_uart[uNum0].t);
|
|
||||
L1_s2b_PH4(ts_uart[uNum0].t); |
|
||||
L0_timer3_restart(); |
|
||||
} |
|
||||
if(L0_uart0_IntTI()) //如果是U0发送中断
|
|
||||
{ |
|
||||
//LED0 ^= 1;
|
|
||||
L0_uart0_IntTIClear(); //清除发送中断标志
|
|
||||
if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now) |
|
||||
{ |
|
||||
SBUF = ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]; |
|
||||
//L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]);
|
|
||||
ts_uart[uNum0].p->now ++; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
ts_uart[uNum0].p->ok = D_ready; |
|
||||
ts_uart[uNum0].p->max = 0; |
|
||||
ts_uart[uNum0].p->now = 0;//可以发送下一个数据
|
|
||||
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|
||||
D_UART0_485_RX() //切换到接收状态
|
|
||||
#endif |
|
||||
} |
|
||||
} |
|
||||
//NOP(); NOP(); NOP();
|
|
||||
} |
|
||||
#if 0 |
|
||||
void timer3_isrHanddle(void) D_SERVE_TIMER3 |
|
||||
{ |
|
||||
struct _tp_handler_x *p1 = &s_uart0_rec; |
|
||||
if((p1->head == 1) && (p1->num >= D_s_modbus_min)) |
|
||||
{ |
|
||||
p1->head = 0; |
|
||||
crc16_irq(p1->crc,p1->buf,p1->num - 2); //校验CRC
|
|
||||
if(p1->crc[0] == p1->buf[p1->num-2] && p1->crc[1] == p1->buf[p1->num-1]) |
|
||||
{ |
|
||||
p1->ok = 1; |
|
||||
// LED0 ^= 1;
|
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
p1->yes = 1; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
L0_timer3_stop(); |
|
||||
} |
|
||||
#endif |
|
||||
|
|
||||
|
|
@ -1,211 +0,0 @@ |
|||||
//////////////////////////////////////////////////////////////////////////
|
|
||||
/// COPYRIGHT NOTICE
|
|
||||
/// Copyright (c) 2015, 传控科技
|
|
||||
/// All rights reserved.
|
|
||||
///
|
|
||||
/// @file main.c
|
|
||||
/// @brief main app
|
|
||||
///
|
|
||||
///(本文件实现的功能的详述)
|
|
||||
///
|
|
||||
/// @version 1.1 CCsens technology
|
|
||||
/// @author CC
|
|
||||
/// @date 20150102
|
|
||||
///
|
|
||||
///
|
|
||||
/// 修订说明:最初版本
|
|
||||
/// Modified by:
|
|
||||
/// Modified date:
|
|
||||
/// Version:
|
|
||||
/// Descriptions:
|
|
||||
// 20160413 CC-ACC-VH02
|
|
||||
// 连接至 J22 RXD0 TXD0
|
|
||||
//P5_DIR &= ~BITN1; //p5.1输出TXD
|
|
||||
//P5_DIR |= BITN0; //p5.0输入RXD
|
|
||||
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
|
|
||||
//P5_SEL1 |= BITN0 +BITN1;
|
|
||||
|
|
||||
/*****************************************************************************
|
|
||||
update by cc @201700110 |
|
||||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|
||||
个需要平衡的事情. |
|
||||
|
|
||||
clib/clib.c: |
|
||||
公用的函数 和硬件无关 |
|
||||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|
||||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|
||||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
uartcom/Uprotocol2app |
|
||||
协议到应用 |
|
||||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|
||||
|
|
||||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|
||||
L3_UARTcom0_exp_protocol 解析应用协议 |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|
||||
公用的串口通讯定义 |
|
||||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|
||||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|
||||
-------------------------------------------------------------------------------------------- |
|
||||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|
||||
L0_UART0_Init |
|
||||
UART0_IRQHandler |
|
||||
L0_Usend_uc------UserDef |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
********************************************************************************/ |
|
||||
#include "msp_uart_x.h" |
|
||||
|
|
||||
TS_uart_reg idata ts_uart[SERIAL_MAX_NUM] = {0}; |
|
||||
|
|
||||
void L0_uartN_set(U8 uartx,U8 x) |
|
||||
{ |
|
||||
switch(uartx) |
|
||||
{ |
|
||||
case 0:SBUF = (x);break; |
|
||||
case 1:S2BUF = (x);break; |
|
||||
case 2:S3BUF = (x);break; |
|
||||
case 3:S4BUF = (x);break; |
|
||||
default:break; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
U8 L0_uartN_get(U8 uartx) |
|
||||
{ |
|
||||
U8 x = 0; |
|
||||
switch(uartx) |
|
||||
{ |
|
||||
case 0:x = SBUF; break; |
|
||||
case 1:x = S2BUF;break; |
|
||||
case 2:x = S3BUF;break; |
|
||||
case 3:x = S4BUF;break; |
|
||||
default:break; |
|
||||
} |
|
||||
return x; |
|
||||
} |
|
||||
|
|
||||
void L0_waitFree_uartN(U8 uartx) |
|
||||
{ |
|
||||
ts_uart[uartx].p->over = 0; |
|
||||
while(ts_uart[uartx].p->ok != D_ready) |
|
||||
{ |
|
||||
#if 0 //发送数据特别快时,某些情况下会导致数据发送出错
|
|
||||
if(ts_uart[uartx].p->over ++ > 600000) |
|
||||
{ |
|
||||
break; |
|
||||
} |
|
||||
#endif |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_sendArray(U8 uartx,void *buf,U16 len) |
|
||||
{ |
|
||||
L0_waitFree_uartN(uartx); |
|
||||
ts_uart[uartx].p->ok = D_clear; |
|
||||
ts_uart[uartx].p->over = 0; |
|
||||
ts_uart[uartx].p->max = len; |
|
||||
ts_uart[uartx].p->now = 1; |
|
||||
if(len <= D_UART_send_buf_max) |
|
||||
{ |
|
||||
//将参数buf拷贝至内部buf
|
|
||||
for(ts_uart[uartx].p->num = 0;ts_uart[uartx].p->num < len;ts_uart[uartx].p->num ++) |
|
||||
{ |
|
||||
ts_uart[uartx].p->buf[ts_uart[uartx].p->num] = ((U8*)buf)[ts_uart[uartx].p->num]; |
|
||||
} |
|
||||
ts_uart[uartx].p->p = ts_uart[uartx].p->buf; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
//不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错
|
|
||||
ts_uart[uartx].p->p = (U8 *)buf; |
|
||||
} |
|
||||
L0_uartN_set(uartx,ts_uart[uartx].p->p[0]); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_uc(U8 uartx,U8 ww) |
|
||||
{ |
|
||||
L0_uartN_sendArray(uartx,&ww,1); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_us(U8 uartx,vU16 ww) |
|
||||
{ |
|
||||
U_U16 uStemp; |
|
||||
uStemp.word = ww; |
|
||||
ts_uart[uartx].p->buf3[0] = uStemp.BYTE2.h; |
|
||||
ts_uart[uartx].p->buf3[1] = uStemp.BYTE2.l; |
|
||||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_ul(U8 uartx,vU32 ww) |
|
||||
{ |
|
||||
U_U32 uStemp; |
|
||||
L0_waitFree_uartN(uartx); |
|
||||
uStemp.dWord = ww; |
|
||||
ts_uart[uartx].p->buf3[0] = uStemp.BYTE4.byte0; |
|
||||
ts_uart[uartx].p->buf3[1] = uStemp.BYTE4.byte1; |
|
||||
ts_uart[uartx].p->buf3[2] = uStemp.BYTE4.byte2; |
|
||||
ts_uart[uartx].p->buf3[3] = uStemp.BYTE4.byte3; |
|
||||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_0d0a(U8 uartx) |
|
||||
{ |
|
||||
L0_waitFree_uartN(uartx); |
|
||||
ts_uart[uartx].p->buf3[0] = 0x0d; |
|
||||
ts_uart[uartx].p->buf3[1] = 0x0a; |
|
||||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_uchex(U8 uartx,U8 ww) |
|
||||
{ |
|
||||
L0_waitFree_uartN(uartx); |
|
||||
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(ww)][1]; |
|
||||
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (ww)][1]; |
|
||||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_ushex(U8 uartx,vU16 ww) |
|
||||
{ |
|
||||
U_F16 k; |
|
||||
L0_waitFree_uartN(uartx); |
|
||||
k.us = ww; |
|
||||
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; |
|
||||
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1]; |
|
||||
ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; |
|
||||
ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1]; |
|
||||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_ulhex(U8 uartx,U32 ww) |
|
||||
{ |
|
||||
U_U32 k; |
|
||||
L0_waitFree_uartN(uartx); |
|
||||
k.dWord = ww; |
|
||||
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; |
|
||||
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1]; |
|
||||
ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; |
|
||||
ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1]; |
|
||||
ts_uart[uartx].p->buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; |
|
||||
ts_uart[uartx].p->buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1]; |
|
||||
ts_uart[uartx].p->buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; |
|
||||
ts_uart[uartx].p->buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1]; |
|
||||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,8); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_sendstr(U8 uartx,U8 *str) |
|
||||
{ |
|
||||
L0_uartN_sendArray(uartx,str,Lc_strlen(str)); |
|
||||
} |
|
||||
|
|
||||
void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) |
|
||||
{ |
|
||||
int i; |
|
||||
for(i=0;i<n;i++) |
|
||||
{ |
|
||||
L0_uartN_uchex(uartx,buf[i]); |
|
||||
L0_uartN_uc(uartx,' '); |
|
||||
} |
|
||||
L0_uartN_0d0a(uartx); |
|
||||
} |
|
||||
|
|
||||
|
|
@ -1,169 +0,0 @@ |
|||||
//////////////////////////////////////////////////////////////////////////
|
|
||||
/// COPYRIGHT NOTICE
|
|
||||
/// Copyright (c) 2015, 传控科技
|
|
||||
/// All rights reserved.
|
|
||||
///
|
|
||||
/// @file main.c
|
|
||||
/// @brief main app
|
|
||||
///
|
|
||||
///(本文件实现的功能的详述)
|
|
||||
///
|
|
||||
/// @version 1.1 CCsens technology
|
|
||||
/// @author CC
|
|
||||
/// @date 20150102
|
|
||||
///
|
|
||||
///
|
|
||||
/// 修订说明:最初版本
|
|
||||
/// Modified by:
|
|
||||
/// Modified date:
|
|
||||
/// Version:
|
|
||||
/// Descriptions:
|
|
||||
// 20160413 CC-ACC-VH02
|
|
||||
// 连接至 J22 RXD0 TXD0
|
|
||||
//P5_DIR &= ~BITN1; //p5.1输出TXD
|
|
||||
//P5_DIR |= BITN0; //p5.0输入RXD
|
|
||||
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为uart4 RXD TXD
|
|
||||
//P5_SEL1 |= BITN0 +BITN1;
|
|
||||
|
|
||||
/*****************************************************************************
|
|
||||
update by cc @201700110 |
|
||||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|
||||
个需要平衡的事情. |
|
||||
|
|
||||
clib/clib.c: |
|
||||
公用的函数 和硬件无关 |
|
||||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|
||||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|
||||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
uartcom/Uprotocol2app |
|
||||
协议到应用 |
|
||||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|
||||
|
|
||||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|
||||
L3_UARTcom0_exp_protocol 解析应用协议 |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|
||||
公用的串口通讯定义 |
|
||||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|
||||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|
||||
-------------------------------------------------------------------------------------------- |
|
||||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|
||||
L0_uart4_Init |
|
||||
uart4_IRQHandler |
|
||||
L0_Usend_uc------UserDef |
|
||||
----------------------------------------------------------------------------------------- |
|
||||
********************************************************************************/ |
|
||||
#include "uart4.h" |
|
||||
|
|
||||
//#define _USE_485
|
|
||||
|
|
||||
static volatile Ts_uart_send_buf idata ts_uart_send_shop; |
|
||||
//TP_Handler_X s_uart4_at_rec;
|
|
||||
//TP_Handler_X s_uart4_tcp_rec;
|
|
||||
TP_Handler_X s_uart4_rec; |
|
||||
TS_PH3_ccmodbus s_uart4_ack; |
|
||||
|
|
||||
//#define FOSC 11059200L //系统频率
|
|
||||
//#define BAUD4 115200 //串口波特率
|
|
||||
void L0_uart4_init(void)//115200bps@11.0592MHz
|
|
||||
{ |
|
||||
#if(MainFre_11M == D_sys_MainFre) |
|
||||
#if 0 |
|
||||
S4CON = 0x50; //8位可变波特率
|
|
||||
T4L = (65536 - (FOSC/4/BAUD4)); //设置波特率重装值
|
|
||||
T4H = (65536 - (FOSC/4/BAUD4))>>8; |
|
||||
T4T3M |= 0x20; //定时器4为1T模式
|
|
||||
T4T3M |= 0x80; //定时器4开始计时
|
|
||||
#else |
|
||||
S4CON = 0x10; //8位数据,可变波特率
|
|
||||
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
|
|
||||
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
|
|
||||
T4L = 0xE8; //设定定时初值
|
|
||||
T4H = 0xFF; //设定定时初值
|
|
||||
T4T3M |= 0x80; //启动定时器4
|
|
||||
#endif |
|
||||
|
|
||||
|
|
||||
#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
|
|
||||
S4CON = 0x10; //8位数据,可变波特率
|
|
||||
S4CON |= 0x40; //串口4选择定时器4为波特率发生器
|
|
||||
T4T3M |= 0x20; //定时器4时钟为Fosc,即1T
|
|
||||
T4L = 0xD0; //设定定时初值
|
|
||||
T4H = 0xFF; //设定定时初值
|
|
||||
T4T3M |= 0x80; //启动定时器4
|
|
||||
#endif |
|
||||
} |
|
||||
|
|
||||
void L0_uart4_buf_init(void) |
|
||||
{ |
|
||||
ts_uart[uNum4].p = &ts_uart_send_shop; |
|
||||
ts_uart[uNum4].p->now = 0; |
|
||||
ts_uart[uNum4].p->ok = D_ready; |
|
||||
ts_uart[uNum4].t = &s_uart4_rec; |
|
||||
ts_uart[uNum4].t->head_0 = D_CMD_Filter1_ff; |
|
||||
ts_uart[uNum4].t->head_1 = D_CMD_Filter2_fe; |
|
||||
ts_uart[uNum4].t->head = 0; |
|
||||
ts_uart[uNum4].t->ok = 0; |
|
||||
ts_uart[uNum4].tp_handler = L1_s2b_PH3; |
|
||||
ts_uart[uNum4].ack = (U8*)&s_uart4_ack; |
|
||||
|
|
||||
//s_uart4_tcp_rec.head_0 = D_CMD_Filter1_ff;
|
|
||||
//s_uart4_tcp_rec.head_1 = D_CMD_Filter2_fe;
|
|
||||
//s_uart4_tcp_rec.head = 0;
|
|
||||
//s_uart4_tcp_rec.ok = 0;
|
|
||||
L0_uart4_init(); |
|
||||
D_uart4_ES_INT(1); //打开串口中断
|
|
||||
|
|
||||
#if (D_UART4_485_TYPE != TYPE_485_NONE) |
|
||||
D_UART4_485_RX() //默认处于接收状态
|
|
||||
#endif |
|
||||
} |
|
||||
|
|
||||
void L0_uart4_sendArray(U8 * buf, U16 len) |
|
||||
{ |
|
||||
#if (D_UART4_485_TYPE != TYPE_485_NONE) |
|
||||
D_UART4_485_TX() //切换到输出状态
|
|
||||
#endif |
|
||||
L0_uartN_sendArray(uNum4,buf,len); |
|
||||
} |
|
||||
|
|
||||
/*************************************************
|
|
||||
UART 中断 |
|
||||
*************************************************/ |
|
||||
|
|
||||
#define D_SERVE_uart4 interrupt 18 |
|
||||
void INTERRUPT_uart4(void) D_SERVE_uart4// using 2
|
|
||||
{ |
|
||||
#if 1 |
|
||||
//NOP(); NOP(); NOP();
|
|
||||
if(L0_uart4_IntRI()) //如果是U0接收中断
|
|
||||
{ |
|
||||
L0_uart4_IntRIClear(); //清除接收中断标志
|
|
||||
ts_uart[uNum4].t->reg = L0_uartN_get(uNum4); |
|
||||
ts_uart[uNum4].tp_handler(ts_uart[uNum4].t); |
|
||||
} |
|
||||
if(L0_uart4_IntTI()) //如果是U0发送中断
|
|
||||
{ |
|
||||
L0_uart4_IntTIClear(); //清除发送中断标志
|
|
||||
if(ts_uart[uNum4].p->max != ts_uart[uNum4].p->now) |
|
||||
{ |
|
||||
L0_uartN_set(uNum4,ts_uart[uNum4].p->p[ts_uart[uNum4].p->now]); |
|
||||
ts_uart[uNum4].p->now ++; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
ts_uart[uNum4].p->ok = D_ready; |
|
||||
ts_uart[uNum4].p->max = 0; |
|
||||
ts_uart[uNum4].p->now = 0;//可以发送下一个数据
|
|
||||
#if (D_UART4_485_TYPE != TYPE_485_NONE) |
|
||||
D_UART4_485_RX() //切换到接收状态
|
|
||||
#endif |
|
||||
|
|
||||
} |
|
||||
} |
|
||||
//NOP(); NOP(); NOP();
|
|
||||
#endif |
|
||||
} |
|
||||
|
|
||||
|
|
Loading…
Reference in new issue