diff --git a/keilp/cc_as_stc02_ps5ws.uvprojx b/keilp/cc_as_stc02_ps5ws.uvprojx index b131346..69341ff 100644 --- a/keilp/cc_as_stc02_ps5ws.uvprojx +++ b/keilp/cc_as_stc02_ps5ws.uvprojx @@ -387,6 +387,11 @@ 1 ..\source\bsp\w600.c + + bsp_oid.c + 1 + ..\source\bsp\bsp_oid.c + @@ -403,19 +408,24 @@ ..\source\msp\eeprom.c - uart_x.c + msp_uart2.C 1 - ..\source\msp\uart_x.c + ..\source\msp\msp_uart2.C - uart0.c + msp_uart0.C 1 - ..\source\msp\uart0.c + ..\source\msp\msp_uart0.C - uart2.c + msp_uart_x.c 1 - ..\source\msp\uart2.c + ..\source\msp\msp_uart_x.c + + + msp_uart3.c + 1 + ..\source\msp\nouse\msp_uart3.c @@ -474,6 +484,16 @@ + + asp + + + asp_oid.c + 1 + ..\source\asp\asp_oid.c + + + diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_sym b/si4/ps5ws.si4project/soft_ps5ws.sip_sym index bd5b0ed..606a81c 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_sym and b/si4/ps5ws.si4project/soft_ps5ws.sip_sym differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xab b/si4/ps5ws.si4project/soft_ps5ws.sip_xab index 7f04d0b..cf2857c 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xab and b/si4/ps5ws.si4project/soft_ps5ws.sip_xab differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xad b/si4/ps5ws.si4project/soft_ps5ws.sip_xad index 7b602f6..b7cef3c 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xad and b/si4/ps5ws.si4project/soft_ps5ws.sip_xad differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xc b/si4/ps5ws.si4project/soft_ps5ws.sip_xc index b9d5911..763fdeb 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xc and b/si4/ps5ws.si4project/soft_ps5ws.sip_xc differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xf b/si4/ps5ws.si4project/soft_ps5ws.sip_xf index 5139dad..c8f5940 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xf and b/si4/ps5ws.si4project/soft_ps5ws.sip_xf differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xm b/si4/ps5ws.si4project/soft_ps5ws.sip_xm index 53c354e..87a6aa3 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xm and b/si4/ps5ws.si4project/soft_ps5ws.sip_xm differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xr b/si4/ps5ws.si4project/soft_ps5ws.sip_xr index fecb06f..37940e2 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xr and b/si4/ps5ws.si4project/soft_ps5ws.sip_xr differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsb b/si4/ps5ws.si4project/soft_ps5ws.sip_xsb index e7394d4..8e6dd37 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xsb and b/si4/ps5ws.si4project/soft_ps5ws.sip_xsb differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.sip_xsd b/si4/ps5ws.si4project/soft_ps5ws.sip_xsd index bef1f5c..2dd9b56 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.sip_xsd and b/si4/ps5ws.si4project/soft_ps5ws.sip_xsd differ diff --git a/si4/ps5ws.si4project/soft_ps5ws.siproj b/si4/ps5ws.si4project/soft_ps5ws.siproj index 5d040f0..4878576 100644 Binary files a/si4/ps5ws.si4project/soft_ps5ws.siproj and b/si4/ps5ws.si4project/soft_ps5ws.siproj differ diff --git a/source/app/app_config.c b/source/app/app_config.c index b7c64be..d6264ec 100644 --- a/source/app/app_config.c +++ b/source/app/app_config.c @@ -1,5 +1,5 @@ #include "app_config.h" -#include "../bsp/cs1232.h" +///#include "../bsp/cs1232.h" #include "../bsp/chipid.h" #include "../msp/eeprom.h" #include "../clib/clib.h" @@ -12,7 +12,7 @@ WR_Buf wr_buf; void L3_param_init(void) { - U8 i; + //U8 i; G.debug = 1; //station模式状态 G.st_status = 0; //0:none 1:wifi_ok 2:tcp_connect_ok @@ -26,13 +26,15 @@ void L3_param_init(void) Lc_strcpy(G.ap_sid,"cc_pen_ap"); //ap模式pwd Lc_strcpy(G.ap_pwd,"ccsens123"); - - wr_buf.wIndex = wr_buf.rIndex = 0; + + #if 0 + wr_buf.wIndex = wr_buf.rIndex = 0; wr_buf.maxsize = sizeof(wr_buf.buf)/sizeof(PenPoint); for(i=0;irIndex+1)%(p->maxsize) == p->wIndex) @@ -183,6 +195,7 @@ U16 Lc_write_cyc_buf(PenPoint *wbuf ,WR_Buf *wp ,U16 wlen) else { //L0_uart0_sendstr("X"); + wp->full = 1; return 0; } @@ -208,7 +221,8 @@ U16 Lc_read_cyc_buf(PenPoint *rbuf ,WR_Buf *rp ,U16 rlen) } else { + rp->null = 1; return 0; } } - +#endif diff --git a/source/app/app_config.h b/source/app/app_config.h index beb6e7a..a667af1 100644 --- a/source/app/app_config.h +++ b/source/app/app_config.h @@ -5,6 +5,7 @@ #include "../bsp/bsp_config.h" #include "../tpc/ccmodbus.h" #include "../tpc/modbus.h" +//#include "../asp/asp_oid.h" #define APP_VERSION 0x10 @@ -13,7 +14,7 @@ #define D_COUNT_WEIGHT(adc) (U32)((adc) / D_ADS1213_GAIN_VAL / R.p.lmd * R.p.weight_max * 1000 / (2 * 0x7FFFFF / 1000 )) #define D_COUNT_ADC(wInG) (U32)((wInG) * D_ADS1213_GAIN_VAL * R.p.lmd * (2 * 0x7FFFFF / 1000) / R.p.weight_max / 1000) -#define POINT_LEN 48 + //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Register CONFIG @@ -22,12 +23,13 @@ //#define D_blur_threshold_2_1(threshold) (U32) ( 1.0 * threshold *(2 * 0x7FFFFF / 1000 * D_ADS1213_GAIN_VAL * R.p.lmd) / (1000.0 * R.p.weight_max )) -#define CCMD_SLAVER_INFO_MAX 3 +#define CCMD_SLAVER_INFO_MAX 2 typedef struct pen_point { U16 x_axis;//横坐标 U16 y_axis;//纵坐标 U32 time;//时间 + U16 angle;//角度 }PenPoint; typedef struct global_register { @@ -41,10 +43,10 @@ typedef struct global_register U16 null[25]; - U16 pack_order;//包序号 - U16 frame_order;//帧序号 - U16 pack_mask;//包标志 - PenPoint points[POINT_LEN]; + //U16 pack_order;//包序号 + //U16 frame_order;//帧序号 + //U16 pack_mask;//包标志 + //Ts_OID_frame_xy_ points[POINT_LEN]; }GlobalRegister; extern GlobalRegister R; @@ -86,12 +88,17 @@ typedef struct global_param vU32 modbusstmp; U16 authed; U16 flowStartVal; - U16 datapack; U8 mcu_id[7]; U8 pen_up; - - CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX]; + U8 pen_down; + U8 pen_hold; + U8 pen_end; + U8 pen_t; + U8 oid_p; + U8 oid_x; + U8 datapkg; + CCMD_SLAVER_INFO ccmd_slaver_info[CCMD_SLAVER_INFO_MAX];///16*3 }GlobalParam; extern GlobalParam G; @@ -99,12 +106,14 @@ extern GlobalParam G; typedef struct { vU8 rIndex;//读标志 + vU8 Index;//读标志 vU8 wIndex;//写标志 vU8 full;//缓冲区满标志位 + vU8 null;//缓冲区空标志位 vU8 maxsize;//数组最大长度 vU8 readdr;//缓冲区读写结束新地址 vU8 relen;//从缓冲区头开始的新长度 - PenPoint buf[POINT_LEN * 2]; + //PenPoint buf[POINT_LEN+6];//8*48*2 }WR_Buf; extern WR_Buf wr_buf; extern void L3_param_init(void); diff --git a/source/app/app_task_speech.c b/source/app/app_task_speech.c new file mode 100644 index 0000000..04c4b18 --- /dev/null +++ b/source/app/app_task_speech.c @@ -0,0 +1,55 @@ +#include "app_task_speech.h" +#define START_CODE 0x7E +#define END_CODE 0xEF +TS_TASK_SPEECH ts_speech; + +void L3_task_speech_init(void) +{ + U8 i; + L1_task_init(&ts_speech.task); + L3_task_s_go(ts_speech,D_task_init); + for(i=0;istart = START_CODE; + pspeech->num = 0x07; + pspeech->oper = SPEECH_NAME_PLAY; + pspeech->title = 0x43; + name = hexToDec(&tcp_buf); + tcp_buf[0] = (int)(name/100); + tcp_buf[1] = (int)((name%100)/10); + tcp_buf[2] = (int)(name%10); + Lc_hex2ascii(&tcp_buf,&pspeech->buf,3); + pspeech->crc = (pspeech->num + pspeech->oper + pspeech->buf[0] + pspeech->buf[1] + pspeech->buf[2] + pspeech->buf[3])>> 0 & 0xFF//累加和校验 + pspeech->end = END_CODE; + + return bufsize; +} +U8 L3_pack_ccmodbus(TS_SPEECH *pspeech , CC_SPEECH_INFO *speech_info) +{ + U16 pkglen = 0; + switch(speech_info->oper) + { + case SPEECH_NAME_PLAY: + pkglen = L3_pack_ccmodbus_03(pspeech,tcp_buf,speech_info->buf); + break; + default: + break; + } + pccmodbus->num = pkglen; + return pkglen + 3; +} + diff --git a/source/app/app_task_speech.h b/source/app/app_task_speech.h new file mode 100644 index 0000000..db8dab6 --- /dev/null +++ b/source/app/app_task_speech.h @@ -0,0 +1,47 @@ +#ifndef _APP_TASK_SPEECH_H +#define _APP_TASK_SPEECH_H +#define CC_SPEECH_INFO_MAX 1 +#define D_s_TS_speech_max 32 + +enum SPEECH_OPER +{ + SPEECH_NAME_PLAY 0xA3; +}; + +typedef struct +{ + vU8 start; + vU8 num; + vU8 oper; + vU8 title; + vU8 buf[D_s_TS_speech_max - 3]; + vU8 crc; + vU8 end; +}TS_SPEECH; + +typedef struct +{ + U16 slaver; + U16 oper; + U16 reg; + U16 regnum; + U16 bytes; + U8 *buf; + U16 mask; +}CC_SPEECH_INFO; + +typedef struct +{ + TS_task task; + U16 slaverIndex; + U16 pkglen; + CC_SPEECH_INFO cc_speech_info[CC_SPEECH_INFO_MAX]; +}TS_TASK_SPEECH; + +extern TS_TASK_SPEECH ts_speech; + + + + +#endif + diff --git a/source/app/app_task_tcp.c b/source/app/app_task_tcp.c index 9e8c5db..183420c 100644 --- a/source/app/app_task_tcp.c +++ b/source/app/app_task_tcp.c @@ -1,12 +1,10 @@ #include "app_task_tcp.h" -#include "../msp/uart0.h" -#include "../msp/uart2.h" +#include "../msp/msp_uart0.h" +#include "../msp/msp_uart2.h" #include "../app/task_w600.h" #include "../app/app_config.h" -#define MODBUS_SLAVER_DW20_REG_START 0x02 -#define MODBUS_SLAVER_DW20_REG_NUM 0x02 -#define MODBUS_SLAVER_RETRY_MAX_TIME 1 + TS_tcp ts_tcp; @@ -28,8 +26,7 @@ void L3_task_tcp_init(void) void L3_task_tcp_handle(TS_tcp *s) { TTSS_Task_init() - L2_task_go(D_task_tcp_constructor_modbus_pkg); - + L2_task_go(D_task_tcp_constructor_modbus_pkg); TTSS_Task_step(D_task_tcp_constructor_modbus_pkg) //构造包 if(G.ccmd_slaver_info[s->slaverIndex].mask > 0) { @@ -44,74 +41,68 @@ void L3_task_tcp_handle(TS_tcp *s) } TTSS_Task_step(D_task_tcp_send_modbus_pkg) //发送包 - L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); - s->sendStamp = s_nos_tick.t_1s; if(G.ccmd_slaver_info[s->slaverIndex].mask == 1) { G.ccmd_slaver_info[s->slaverIndex].mask = 0; + L3_gm35_send_data((U8*)&s->loopPkg,s->pkglen); + //L0_uart2_sendArray((U8*)&s->loopPkg,s->pkglen); + //L0_uart2_sendArray((U8 *)&points,ts_task_oid.extra); + s->sendStamp = s_nos_tick.t_1s; + L2_task_go(D_task_tcp_wait_modbus_ack); } - L2_task_go(D_task_tcp_wait_modbus_ack); + TTSS_Task_step(D_task_tcp_wait_modbus_ack) //等待ack - //L0_uart0_uc(s_uart2_tcp_rec.ok + '0'); - if(s_uart2_tcp_rec.ok) + if((s->slaverIndex) == 0) { - s_uart2_tcp_rec.ok = 0; - s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; - s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); - L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num); - if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver) + if(s_uart2_tcp_rec.ok) { - s->ackFlag = 1; - - switch(s->slaverIndex) + s_uart2_tcp_rec.ok = 0; + s_task_gm35_flow.tcp_last_recv_stmp = s_nos_tick.t_1s; + s->pAckPkg = (TS_PH3_ccmodbus*)(s_uart2_tcp_rec.sp); + //L3_gm35_rcv_data((U8*)s->pAckPkg,s->pAckPkg->num); + if(s->pAckPkg->slaver == G.ccmd_slaver_info[s->slaverIndex].slaver) { - case 0://如果oper == 90:成功,91 == 不成功 - switch(G.ccmd_slaver_info[s->slaverIndex].oper) - { - case 0x90: - //L0_uart0_sendstr("11111"); - G.authed = 1; - break; - case 0x91: - G.authed = 0; - break; - } - #if 0 - if(G.ccmd_slaver_info[s->slaverIndex].oper == 0x90) + s->ackFlag = 1; + + switch(s->slaverIndex) { - L0_uart0_sendstr("111"); - G.authed = 1; - G.au_succ = 1; - } - else - { - L0_uart0_sendstr("222"); - G.authed = 0; - G.au_fail = 1; + case 0://如果oper == 90:成功,91 == 不成功 + switch(G.ccmd_slaver_info[s->slaverIndex].oper) + { + case 0x90: + //L0_uart0_sendstr("11111"); + G.authed = 1; + break; + case 0x91: + G.authed = 0; + break; + } + break; + case 1: + break; + default: + break; } - #endif - break; - case 2: - break; - default: - break; } - } - - L2_task_go(D_task_tcp_switch_next_slaver); - } - else if(s_nos_tick.t_1s - s->sendStamp >= 5) //重发 - { - if(++s->retryTimes < 3) - { - L2_task_go(D_task_tcp_send_modbus_pkg); - } - else - { L2_task_go(D_task_tcp_switch_next_slaver); } + else if(s_nos_tick.t_1s - s->sendStamp >= 5) //重发 + { + if(++s->retryTimes < 3) + { + L2_task_go(D_task_tcp_send_modbus_pkg); + } + else + { + L2_task_go(D_task_tcp_switch_next_slaver); + } + } } + else + { + L2_task_go(D_task_tcp_switch_next_slaver); + } //L0_uart0_uc(s->ackFlag); TTSS_Task_step(D_task_tcp_switch_next_slaver) //切换下一个 diff --git a/source/app/app_task_tcp.h b/source/app/app_task_tcp.h index 429e097..3471da4 100644 --- a/source/app/app_task_tcp.h +++ b/source/app/app_task_tcp.h @@ -4,6 +4,8 @@ #include "../ctask/task.h" #include "../tpc/ccmodbus.h" #include "../app/app_config.h" +#include "../asp/asp_oid.h" + #define U485_TIMEOUT 3 //3 x 100ms = 300ms typedef struct @@ -11,8 +13,8 @@ typedef struct TS_task task; TS_PH3_ccmodbus loopPkg; TS_PH3_ccmodbus *pAckPkg; - U8 slaverIndex; - U8 pkglen; + U16 slaverIndex; + U16 pkglen; U32 sendStamp; U8 retryTimes; U8 ackFlag; diff --git a/source/app/app_task_tcp_control.c b/source/app/app_task_tcp_control.c index 59437ba..6b66ab9 100644 --- a/source/app/app_task_tcp_control.c +++ b/source/app/app_task_tcp_control.c @@ -1,7 +1,8 @@ #include "app_task_tcp_control.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart0.h" #include "../app/task_w600.h" #include "../app/app_task_tcp.h" +#include "../asp/asp_oid.h" TS_tcp_control ts_tcp_control; @@ -15,7 +16,6 @@ void L3_task_tcp_control_init(void) #define D_task_tcp_control_01 0x51 #define D_task_tcp_control_02 0x52 -#define D_task_tcp_control_03 0x53 void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区满,调用读函数读取一段,从G->R, R.extra num 动态修改数量 @@ -33,45 +33,22 @@ void L3_task_tcp_control_handle(TS_tcp_control *s)//判定是否抬笔/缓冲区 TTSS_Task_step(D_task_tcp_control_02)//是否发认证包 if(s_task_gm35_flow.conn_ok) { - //3s一次发送数据包 - if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 3) - { - if(!G.authed)//authed == 0 - { - //L0_uart0_sendstr("111"); - //发送认证包 - G.ccmd_slaver_info[0].mask = 1; - } - else //authed == 1 - { - G.ccmd_slaver_info[2].mask = 1; - } - ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; - } - else if(s_nos_tick.t_1s - ts_tcp_control.tcp_send_stmp >= 60) + if(!G.authed)//authed == 0 { + //发送认证包 + G.ccmd_slaver_info[0].mask = 1; + } + else if(ts_task_oid.can_send) + { + ts_task_oid.can_send = 0; + G.ccmd_slaver_info[1].buf = (U8*)&points; + G.ccmd_slaver_info[1].extra_num = (ts_task_oid.extra)*5; + //L0_uart2_sendArray((U8 *)&points,ts_task_oid.extra*10); + ts_task_oid.extra = 0; G.ccmd_slaver_info[1].mask = 1; - ts_tcp_control.tcp_send_stmp = s_nos_tick.t_1s; } - } L2_task_go(D_task_tcp_control_01); - #if 0 - TTSS_Task_step(D_task_tcp_control_03) - if(wr_buf.full == 1) - { - wr_buf.full = 0; - Lc_read_cyc_buf(&R.points ,&wr_buf ,POINT_LEN); - G.ccmd_slaver_info[2].mask = 1; - L2_task_go(D_task_tcp_control_01); - } - else if(G.pen_up == 1) - { - Lc_read_cyc_buf(&R.points ,&wr_buf ,sizeof(wr_buf.buf)/2); - G.ccmd_slaver_info[2].mask = 1; - L2_task_go(D_task_tcp_control_01); - } - #endif TTSS_Task_end(); } diff --git a/source/app/main.c b/source/app/main.c index ff8cd22..99a5313 100644 --- a/source/app/main.c +++ b/source/app/main.c @@ -22,7 +22,7 @@ // //20170608 cc_as_stc01_main // -//20180903 cc_gsm_PD03SM_vh03_m10_debug01 +//20180903 cc_gsm_PD03SM_vh03_m10_debug01 // // /// @version 1.3 CCsens technology @@ -85,8 +85,15 @@ void L0_main_init(void) //开启全局中断 EA = 1; + L0_uart0_sendstr("\r\nasV1.a"); + #if 0 + L1_oid_init(); + printf(" ok\r\n"); + while(9) + {L1_Oid_readoid();} + #endif //系统时钟初始化 - L0_timer0_Init(); + L0_timer0_Init(); //L0_key_init(); //G初始化 L3_param_init(); @@ -96,13 +103,14 @@ void L0_main_init(void) L2_485_init(); //寄存器监听任务初始化 - L3_task_reglisten_init(); + //L3_task_reglisten_init(); //w600任务初始化 L3_task_gm35_flow_init(W600_ST); + //按键任务初始化 + //L0_key_init(); //笔头任务初始化 - L3_task_pen_head_write_init(); - L3_task_pen_head_read_init(); + L1_oid_init(); //tcp轮询任务初始化 L3_task_tcp_init(); @@ -123,34 +131,82 @@ void main(void) while(1) { - if(1 == s_nos_tick.t1s_heatbeart) + + L1_Oid_readoid(); + + if(1 == s_nos_tick.t1s_heartbeat)//1s + { + s_nos_tick.t1s_heartbeat = 0;//置0清空 + + D_print_heartbeat() + {///这个地方可以放置心跳的打印信息 + ///如果其他的打印存在,并且关闭了这个打印的话,这个打印会临时被关闭,下一次打开 + + L0_uart0_uc('.'); + + } + } + + if(L3_tick_interval(100L))/////10ms + {L2_tick_stamp(); + D_print_heartbeat_close(); + + /// L1_as_readA(0);//读取倾角传感器数据 + /// Lc_buf_copy_uc(s_uart1_rec.buf,s_as[0].d,8); + // s_uart1_rec.buf= 传感器数据 + /// ff 08 xh xl yh yl zh zl + /// s_uart1_rec.ok =1; + } + /// L2_sd_save(); + +///////////////////////////////////////// + #if 0 + if(s_uart0_rec.ok) { - s_nos_tick.t1s_heatbeart = 0; - //LED0 ^= 1; + //// buf 0 1 2 3 4 5 6 7 + //// FA 0D 36 20 10 55 05 06 + s_uart0_rec.ok = 0; + L1_uart0_uchexArray(s_uart0_rec.buf,s_uart0_rec.num); + + switch(s_uart0_rec.buf[1]) + { + case 0x0d: + /// L1_sd_debug(&s_uart0_rec.buf[2]); + break; + case 0x00: + L1_oid_debug(&s_uart0_rec.buf[2]); + break; + default: + break; + } } - + + #endif + //WIFI - //L3_uart2_exp_protocol(&s_uart2_at); - //L2_task_gm35_flow_handle(&s_task_gm35_flow); + L3_uart2_exp_protocol(&s_uart2_at); + L2_task_gm35_flow_handle(&s_task_gm35_flow); //笔头数据采集 - L3_task_pen_head_write_handle(&s_task_pen_write); - L3_task_pen_head_read_handle(&s_task_pen_read); + L3_task_oid_handle(&ts_task_oid); //寄存器值监控 //L3_task_reglisten_handle(&s_task_reglisten); //输出,响应485协议 //L3_task_modbus_handler(&s_uart0_rec); + //语音模块 + + //按键处理 //L3_task_key_handle(&s_task_key_handle); //L3_task_modbus_handler2(&s_uart2_rec); //tcp发送 - //L3_task_tcp_handle(&ts_tcp); + L3_task_tcp_handle(&ts_tcp); //tcp master->slaver发送逻辑控制 - //L3_task_tcp_control_handle(&ts_tcp_control); + L3_task_tcp_control_handle(&ts_tcp_control); } } //end main diff --git a/source/app/main.h b/source/app/main.h index 6038f04..a4f449c 100644 --- a/source/app/main.h +++ b/source/app/main.h @@ -37,28 +37,32 @@ #ifndef _MAIN_H #define _MAIN_H -#include "../msp/uart0.h" -#include "../msp/uart2.h" +#include "../msp/msp_uart0.h" +#include "../msp/msp_uart2.h" +//#include "../msp/msp_uart3.h" #include "../msp/eeprom.h" #include "../bsp/bsp_config.h" #include "../bsp/chipid.h" -#include "../bsp/cs1232.h" +///#include "../bsp/cs1232.h" #include "../bsp/rs485.h" #include "../app/app_config.h" #include "../app/task_modbus.h" -#include "../app/task_adc.h" -#include "../app/task_debug.h" +///#include "../app/task_adc.h" +///#include "../app/task_debug.h" #include "../app/task_register.h" #include "../app/task_encrypt.h" #include "../app/task_w600.h" #include "../app/task_key.h" -#include "../app/task_pen_head.h" #include "../app/app_task_tcp.h" #include "../app/app_task_tcp_control.h" +#include "../asp/asp_oid.h" +#include "../ctask/tick.h" +#include + ////////////////////////////////////////////////////////////////// diff --git a/source/app/task_adc.c b/source/app/nouse/task_adc.c similarity index 100% rename from source/app/task_adc.c rename to source/app/nouse/task_adc.c diff --git a/source/app/task_adc.h b/source/app/nouse/task_adc.h similarity index 100% rename from source/app/task_adc.h rename to source/app/nouse/task_adc.h diff --git a/source/app/task_debug.c b/source/app/nouse/task_debug.c similarity index 100% rename from source/app/task_debug.c rename to source/app/nouse/task_debug.c diff --git a/source/app/task_debug.h b/source/app/nouse/task_debug.h similarity index 100% rename from source/app/task_debug.h rename to source/app/nouse/task_debug.h diff --git a/source/app/task_key b/source/app/nouse/task_key similarity index 100% rename from source/app/task_key rename to source/app/nouse/task_key diff --git a/source/app/task_key.c b/source/app/task_key.c index 7c97085..e6ba1e3 100644 --- a/source/app/task_key.c +++ b/source/app/task_key.c @@ -78,7 +78,17 @@ void L3_task_key_handle(struct _s_task_key_ *p) } else { - LED2 = ~LED2; + //LED2 = ~LED2; + U8 i; + U8 mu[9]; + U16 music[9] = {0x7E,0x07,0xA3,0x43,0x30,0x30,0x39,0x86,0xEF}; + //7E 07 A3 43 30 30 39 86 EF + for(i = 0;i<9;i++) + { + mu[i] = music[i]>> 0 & 0xFF; + } + L0_uart3_sendArray((U8 *)&mu, 9); + L0_uart0_sendArray((U8 *)&mu, 9); } p->key1_ok = 0; p->time1=0; diff --git a/source/app/task_key.h b/source/app/task_key.h index 7635f4e..4b14944 100644 --- a/source/app/task_key.h +++ b/source/app/task_key.h @@ -14,7 +14,9 @@ #define _app_task_key_H #include "../bsp/bsp_config.h" #include "../ctask/task.h" +#include "../msp/msp_uart0.h" +#include "../msp/msp_uart3.h" struct _s_task_key_ { diff --git a/source/app/task_pen_head.c b/source/app/task_pen_head.c index b4a287c..551706e 100644 --- a/source/app/task_pen_head.c +++ b/source/app/task_pen_head.c @@ -1,5 +1,7 @@ #include "task_pen_head.h" -#include "../msp/uart0.h" +#include "../clib/clib.h" +#include "../bsp/bsp_oid.h" +#include "../msp/msp_uart2.h" struct _s_task_pen_head_ s_task_pen_write; struct _s_task_pen_head_ s_task_pen_read; @@ -9,7 +11,6 @@ void L3_task_pen_head_write_init(void) { L1_task_init(&s_task_pen_write.task); L3_task_s_go(s_task_pen_write,D_task_init); - s_task_pen_write.full = 0; } void L3_task_pen_head_read_init(void) { @@ -17,16 +18,72 @@ void L3_task_pen_head_read_init(void) L3_task_s_go(s_task_pen_read,D_task_init); } -#define TTSS_TASK_HEAD_DATA_WRITE 0x01 -#define TTSS_TASK_HEAD_DATA 0x02 +#define TTSS_TASK_HEAD_DATA_GET 0x01 +#define TTSS_TASK_HEAD_DATA_WRITE 0x02 +#define TTSS_TASK_HEAD_DATA_END 0x03 +#define TTSS_TASK_HEAD_DATA_WRITE_TO 0x04 -U8 i = 0; + +#if 0 + +///U8 i = 0; U8 j ; void L3_task_pen_head_write_handle(struct _s_task_pen_head_ *s) { TTSS_Task_init() - L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,0); - TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE) + L2_task_go(TTSS_TASK_HEAD_DATA_GET); + TTSS_Task_step(TTSS_TASK_HEAD_DATA_GET) + if(G.oid_x) + { + G.oid_x = 0; + s->point.x_axis = (U16)(U32)ts_oid.x *10.0; + s->point.y_axis = (U16)(U32)ts_oid.y *10.0; + s->point.time = ts_oid.time; + s->point.angle = (U16)ts_oid.angle>>1; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE); + } + else + { + L2_task_go(TTSS_TASK_HEAD_DATA_END); + } + TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE)////判断 + if(G.pen_down) + { + G.pen_down= 0; + s->point.x_axis += (U16)16384; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE_TO); + } + else if(G.pen_hold) + { + G.pen_hold = 0; + s->point.x_axis += (U16)32768; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE_TO); + } + TTSS_Task_step(TTSS_TASK_HEAD_DATA_END) + if(G.pen_up && G.pen_t) + { + G.pen_up = 0; + G.pen_end = 1; + s->point.x_axis += (U16)16384; + s->point.time = D_sys_now; + ts_oid.x = 0; + ts_oid.y = 0; + ts_oid.time = 0; + ts_oid.angle = 0; + L2_task_go(TTSS_TASK_HEAD_DATA_WRITE_TO); + } + else + { + L2_task_go(TTSS_TASK_HEAD_DATA_GET); + } + TTSS_Task_step(TTSS_TASK_HEAD_DATA_WRITE_TO) + L0_uart2_ushex(s->point.x_axis); + //Lc_buf_copy_uc((U8 *)&wr_buf.buf[i],(U8 *)&s->point,(U16)10); + Lc_buf_copy_uc((U8 *)&wr_buf.buf[wr_buf.Index],(U8 *)&s->point,10); + wr_buf.Index ++; + ////L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_GET,D_Tdelay_40ms); + L2_task_go(TTSS_TASK_HEAD_DATA_GET); + #if 0 s->point.x_axis = i; s->point.y_axis = i; s->point.time = D_sys_now; @@ -55,14 +112,17 @@ void L3_task_pen_head_write_handle(struct _s_task_pen_head_ *s) L0_uart0_ushex(R.points[j].x_axis); L0_uart0_uc(' '); L0_uart0_ushex(R.points[j].y_axis); - L0_uart0_uc(' '); + L0_uart0_ulhex(R.points[j].time); L0_uart0_0d0a(); }//Lc_buf_full(&wr_buf); } #endif L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_WRITE,D_Tdelay_100ms); + #endif + TTSS_Task_end(); + } #define TTSS_TASK_HEAD_DATA_READ 0x21 @@ -70,26 +130,18 @@ void L3_task_pen_head_write_handle(struct _s_task_pen_head_ *s) void L3_task_pen_head_read_handle(struct _s_task_pen_head_ *s) { TTSS_Task_init() - L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_READ,0); + L2_task_go(TTSS_TASK_HEAD_DATA_READ); TTSS_Task_step(TTSS_TASK_HEAD_DATA_READ) - if(s_task_pen_write.full) + if(wr_buf.Index >= POINT_LEN-1) { - s_task_pen_write.full = 0; - Lc_read_cyc_buf(R.points,&wr_buf, 10); - //G.ccmd_slaver_info[2].extra_num = sizeof(R.points)/2; - for(j = 0;j<10;j++) - { - L0_uart0_ushex(R.points[j].x_axis); - L0_uart0_uc(' '); - L0_uart0_ushex(R.points[j].y_axis); - L0_uart0_uc(' '); - L0_uart0_ulhex(R.points[j].time); - L0_uart0_0d0a(); - } + wr_buf.Index = 0; + G.datapkg = 1; + Lc_buf_copy_uc((U8 *)&R.points,(U8 *)&wr_buf.buf,(U16)POINT_LEN*10); + + //G.ccmd_slaver_info[2].extra_num = POINT_LEN *5; } - - L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_READ,D_Tdelay_50ms); + L2_task_go_Tdelay(TTSS_TASK_HEAD_DATA_READ,D_Tdelay_300ms); TTSS_Task_end(); } - +#endif diff --git a/source/app/task_pen_head.h b/source/app/task_pen_head.h index dbb391b..15bf132 100644 --- a/source/app/task_pen_head.h +++ b/source/app/task_pen_head.h @@ -2,21 +2,15 @@ #define _app_task_pen_head_H #include "../bsp/bsp_config.h" -#include "../bsp/w600.h" +//#include "../bsp/w600.h" #include "../ctask/task.h" -#include "../tpc/at0d0a.h" -#include "../tpc/ccmodbus.h" #include "../app/app_config.h" struct _s_task_pen_head_ { TS_task task; - vU32 last_write_time; - vU32 now_write_time; - vU32 time_lag; - vU8 full; - vU8 null; + U8 index; PenPoint point; }; extern struct _s_task_pen_head_ s_task_pen_write; diff --git a/source/app/task_register.c b/source/app/task_register.c index 1499c64..7abb600 100644 --- a/source/app/task_register.c +++ b/source/app/task_register.c @@ -13,7 +13,7 @@ #include "task_register.h" #include "../app/app_config.h" #include "../bsp/bsp_config.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart0.h" #include "task_w600.h" //============================================= diff --git a/source/app/task_w600.c b/source/app/task_w600.c index d3871a4..05c4ea8 100644 --- a/source/app/task_w600.c +++ b/source/app/task_w600.c @@ -13,8 +13,9 @@ #include "task_w600.h" #include "app_config.h" -#include "../msp/uart2.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart2.h" +#include "../msp/msp_uart0.h" +#include "../asp/asp_oid.h" struct _s_task_gm35_gprs_ s_task_gm35_flow; //TS_tcp_control ts_tcp_control; @@ -46,7 +47,7 @@ void L3_gm35_send_str(U8 *str) } //将数据放入gm35待发送缓冲区 -void L3_gm35_send_data(U8 *buf , U8 len) +void L3_gm35_send_data(U8 *buf , U16 len) { //L3_gm35_send_str(_cipsend_hex(len)); L0_uart2_sendArray(buf,len); @@ -235,7 +236,7 @@ void L3_task_gm35_flow_init(U8 mode) void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) { TTSS_Task_init() - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_10s);//上电等待10s + L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ATEQV,D_Tdelay_3s);//上电等待10s TTSS_Task_step(TTSS_TASK_GM35_FLOW_ATEQV) if(s->send == 0) {//发送 @@ -374,7 +375,7 @@ void L2_task_gm35_flow_handle(struct _s_task_gm35_gprs_ *s) TTSS_Task_step(TTSS_TASK_GM35_FLOW_ST_DATA) //L0_uart2_sendstr("abcdefg"); s_task_gm35_flow.conn_ok = 1; - L2_task_go_Tdelay(TTSS_TASK_GM35_FLOW_ST_DATA,D_Tdelay_1s); + L2_task_go(TTSS_TASK_GM35_FLOW_ST_DATA); diff --git a/source/app/task_w600.h b/source/app/task_w600.h index 20c869d..4636483 100644 --- a/source/app/task_w600.h +++ b/source/app/task_w600.h @@ -1,4 +1,4 @@ -//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file bsp_gc6133.c.h @@ -25,7 +25,7 @@ #define AT_INS_ST "AT+CWMODE=1\r\n" //进入station模式 //#define AT_INS_ST_WIFI "AT+CWJAP_DEF=\"ccsens\",\"ccsens123\"\r\n" //网络查询指令 #define AT_INS_ST_CIPMUX0 "AT+CIPMUX=0\r\n" //GPRS操作指令 -#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.83\",4001\r\n" //连接服务器 +#define AT_INS_ST_TCP "AT+CIPSTART=\"TCP\",\"192.168.0.81\",4001\r\n" //连接服务器 #define AT_INS_ST_CIPMODE1 "AT+CIPMODE=1\r\n" //发送数据 #define AT_INS_ST_CIPSEND "AT+CIPSEND\r\n" //主动关闭连接 #define AT_INS_ST_CIPMODE0 "AT+CIPMODE=0\r\n" //查询连接状态 diff --git a/source/asp/asp readme.txt b/source/asp/asp readme.txt new file mode 100644 index 0000000..1d99412 --- /dev/null +++ b/source/asp/asp readme.txt @@ -0,0 +1,16 @@ +板级到app还有对芯片功能应用配置的一层 + +20210124 发现传统的TTSS架构中总是欠缺点 +例如一个外设芯片,因为不是mcu固有的外设,所以应该归到BSP(板级支持里面) +其读写寄存器等基本功能放在BSP中,但是其和app应用相关的模式却发现并不适合 +直接放到BSP中,也不适合放到APP中,因为实际的应用只是使用外设获得IO数据 +而已。故而修正 + +main: +app: +asp:基于mcu外设或者板级外设芯片的功能,这些功能为app服务,但是功能配置复杂,单独列出,方便移植。 +bsp:外设芯片自身功能,如果芯片为app服务的函数功能比较单一,不像无线芯片一样配置复杂的话那么也可以放在bsp中 +msp:mcu自身的外设功能,如果特别复杂,比如类似MAC驱动等,可以把一部分接近app的功能放到asp中 +clib: +ctask: +tpc:协议相关 \ No newline at end of file diff --git a/source/asp/asp_SDX1.H b/source/asp/asp_SDX1.H new file mode 100644 index 0000000..4e24cee --- /dev/null +++ b/source/asp/asp_SDX1.H @@ -0,0 +1,82 @@ +#ifndef __SDX1_H__ +#define __SDX1_H__ + +/*★★★★★★★★★★★★★★★★★★★★★★★★ + 《振南的znFAT--嵌入式FAT32文件系统设计与实现》 + 一书[上下册]已经由北航出版社正式出版发行。 + 此书是振南历经3年多时间潜心编著,是现今市面上唯 + 一一套讲述FAT32文件系统、SD卡等嵌入式存储技术的 + 专著。书中还介绍了大量的编程技巧与振南的开发经验。 + 请在各大网络销售平台搜索“znFAT”,即可购买。 + 在全国各大书店也有售。 + 振南的ZN-X开发板,支持51、AVR、STM32(M0/M3/M4)等 + CPU。此板可与书配套,板上各种精彩的实验实例请详见 + 振南网站www.znmcu.cn + ★★★★★★★★★★★★★★★★★★★★★★★★*/ + +/*************************************************************************************** + ★程序模块:【振南ZN-X开发板】上『SD卡1』驱动程序 〖STC51部分:STC15L2K60S2〗 + ★功能描述:实现了SD卡的扇区读写、多扇区读写、扇区擦除、读取总物理扇区数等功能 + 此驱动可支持几乎所有的SD卡,包括MMC/SD/SDHC + ★配套教程与参考资料: + ●《振南的znFAT--嵌入式FAT32文件系统设计与实验》一书 下册 第11章《SD卡物理驱动》 + ●《振南的单片机高级外设系列视频教程》之《SD卡专辑》 +****************************************************************************************/ + + +#include "../bsp/bsp_config.h"///#include "sd_type.h" +#include "znfat.h"///#include "sd_type.h" + +////#include + +sbit SD1_CS =P5^5; //SD卡片选 输入 + + +#define D_FILE_SECTOR 65544 + + +#define SET_SD1_CS_PIN(val) (SD1_CS =val) + +#define TRY_TIME 200 //向SD卡写入命令之后,读取SD卡的回应次数,即读TRY_TIME次,如果在TRY_TIME次中读不到回应,产生超时错误,命令写入失败 + +#define TRY_TIME2 200 //add by cc +//相关宏定义 +//------------------------------------------------------------- +#define SD_VER_ERR 0X00 +#define SD_VER_MMC 0X01 +#define SD_VER_V1 0X02 +#define SD_VER_V2 0X03 +#define SD_VER_V2HC 0X04 + +#define INIT_ERROR 0x01 //初始化错误 +#define INIT_CMD0_ERROR 0x02 //CMD0错误 +#define INIT_CMD1_ERROR 0x03 //CMD1错误 +#define INIT_SDV2_ACMD41_ERROR 0x04 //ACMD41错误 +#define INIT_SDV1_ACMD41_ERROR 0x05 //ACMD41错误 + +#define WRITE_CMD24_ERROR 0x06 //写块时产生CMD24错误 +#define WRITE_BLOCK_ERROR 0x07 //写块错误 + +#define READ_BLOCK_ERROR 0x08 //读块错误 + +#define WRITE_CMD25_ERROR 0x09 //在连续多块写时产生CMD25错误 +#define WRITE_NBLOCK_ERROR 0x0A //连续多块写失败 + +#define READ_CMD18_ERROR 0x0B //在连续多块读时产生CMD18错误 + +#define GET_CSD_ERROR 0x0C //读CSD失败 + +//------------------------------------------------------------- +UINT8 SD1_Init(); //SD卡初始化 + +UINT8 L1_SD_Wsector(UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入地址为addr的扇区中 +UINT8 L1_SD_Rsector(UINT32 addr,UINT8 *buffer); //从地址为addr的扇区中读取数据到buffer数据缓冲区中 +UINT8 SD1_Write_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入起始地址为addr的nsec个连续扇区中 +UINT8 SD1_Read_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入起始地址为addr的nsec个连续扇区中 +UINT8 SD1_Erase_nSector(UINT32 addr_sta,UINT32 addr_end); +UINT32 SD1_GetTotalSec(void); //获取SD卡的总扇区数 +UINT8 L2_SD_Rsector(UINT16 addr,UINT8 *buffer);////从 +UINT8 L2_SD_Wsector(UINT16 addr,UINT8 *buffer); +UINT8 L2_SD_Erase_nSector(UINT16 addr_sta,UINT16 addr_end); + +#endif diff --git a/source/asp/asp_oid.c b/source/asp/asp_oid.c new file mode 100644 index 0000000..cefdf51 --- /dev/null +++ b/source/asp/asp_oid.c @@ -0,0 +1,278 @@ +#include "asp_oid.h" + +TS_task_oid_ ts_task_oid; + +Ts_OID_frame_xy_ oid_buf[POINT_LEN+10]; +Ts_OID_frame_xy_ points[POINT_LEN+10]; + + + + +#define D_TASK_OID_t1 0x11 +#define D_TASK_OID_XY 0x12 +#define TTSS_TASK_OID_STA 0x13 +#define D_TASK_PEN_UP 0x14 +#define TTSS_TASK_OID_WRITE 0x15 +#define TTSS_TASK_OID_SEND 0x16 + + +void L3_task_oid_handle(TS_task_oid_ *s) +{ + + TTSS_Task_init(); + TTSS_Alarm_init(s->tts,1000); + ///(X) = s_nos_tick.t_10ms + delay; + L2_task_go(D_TASK_OID_t1); + TTSS_Task_step(D_TASK_OID_t1) + if(TTSS_Alarm_AT(s->tts)) + {///if( (X) < s_nos_tick.jiffies) + TTSS_Alarm_init(s->tts,1000); + s->p_ok = 1; + s->ts_frame.flag.sta = D_PEN_none;//超时没有数据 + s->ts_frame.cd.xy100.x100 = 0; + s->ts_frame.cd.xy100.y100 = 0; + s->ts_frame.flag.angle= 0; + s->ts_frame.time= D_sys_now; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else if(ts_oid.oid_p) + { + ts_oid.oid_p = 0; + TTSS_Alarm_init(s->tts,1000); + s->ts_frame.flag.sta = D_PEN_gcode; + s->ts_frame.cd.gcode = ts_oid.gCode; + s->ts_frame.time= D_sys_now; + //L0_uart2_sendArray((U8 *)&s->ts_frame,(U16)10); + //Lc_buf_copy_uc((U8 *)&R.points[0],(U8 *)&s->ts_frame,(U16)10); + //s->extra = 1; + //s->can_send = 1; + s->send_p = 1; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else + { + L2_task_go(D_TASK_OID_XY); + } + TTSS_Task_step(D_TASK_OID_XY) + if(ts_oid.oid_x) + { + ts_oid.oid_x = 0; + TTSS_Alarm_init(s->tts,1000); + s->ts_frame.cd.xy100.x100 = ts_oid.X100; + s->ts_frame.cd.xy100.y100 = ts_oid.Y100; + s->ts_frame.flag.packageNo = 0; + s->ts_frame.flag.angle = ts_oid.angle; + s->ts_frame.time = ts_oid.time; + L2_task_go(TTSS_TASK_OID_STA); + } + else + { + L2_task_go(D_TASK_PEN_UP); + } + TTSS_Task_step(TTSS_TASK_OID_STA) + if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0 && ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + s->ts_frame.flag.sta = D_PEN_down; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + s->ts_frame.flag.sta = D_PEN_normal; + L2_task_go(TTSS_TASK_OID_WRITE); + } + TTSS_Task_step(D_TASK_PEN_UP) + if(G.pen_up && G.pen_t) + { + G.pen_up = 0; + s->send_t =1; + TTSS_Alarm_init(s->tts,1000); + s->ts_frame.flag.sta = D_PEN_up; + s->ts_frame.time = D_sys_now; + ts_oid.X100 = 0; + ts_oid.Y100 = 0; + ts_oid.time = 0; + ts_oid.angle = 0; + L2_task_go(TTSS_TASK_OID_WRITE); + } + else + { + L2_task_go(D_TASK_OID_t1); + } + TTSS_Task_step(TTSS_TASK_OID_WRITE) + //L0_uart2_sendArray((U8 *)&s->ts_frame,(U16)10); + Lc_buf_copy_uc((U8 *)&oid_buf[s->point],(U8 *)&s->ts_frame,(U16)10); + s->point ++; + L2_task_go(TTSS_TASK_OID_SEND); + TTSS_Task_step(TTSS_TASK_OID_SEND) + if(((s->point) > (POINT_LEN - 1))|| s->send_t||s->p_ok||s->send_p) + { + U8 j; + U16 k; + s->extra = s->point; + s->point = 0; + s->p_ok = 0; + s->send_p = 0; + s->send_t = 0; + for(j = 0;jextra;j++) + { + Lc_buf_copy_uc((U8 *)&points[j],(U8 *)&oid_buf[j],(U16)10); + //L0_uart2_sendArray((U8 *)&points[j],(U16)10); + } + //G.ccmd_slaver_info[1].buf = (U8*)&points; + //G.ccmd_slaver_info[1].extra_num = (s->extra)*5; + //L0_uart2_sendArray((U8 *)&points,(s->extra)*10); + //s->extra = 0; + s->can_send = 1; + #if 0 + for(j = 0;jcmd) + { + case UDCMD_wakeup: + L0_uart0_sendstr("\r\nL1_OID_WakeUp "); + L1_OID_WakeUp(); + break; + case UDCMD_cmdsend: + ///fa 00 22 cmd 42 53 64 75 + ///fa 00 |22 cmd 42 53 64 75 + L0_uart0_sendstr("\r\ncmd:"); + L0_uart0_uchex(t->dat);L0_uart0_0d0a(); + L1_oid_TransCmd(t->dat); + break; + case UDCMD_log: + L0_uart0_sendstr("\r\nLogRegister"); + /// LogRegister(); + break; + case UDCMD_CheckVersion: + L0_uart0_sendstr("\r\n CheckVersion"); +/// L1_oid_CheckVersionAndInit(eAppDevice); + // while(1) + { + // OidTaskLoop(); + } + break; + case UDCMD_get: + L0_uart0_sendstr("\r\n UDCMD_get"); + while(9) + { + L1_Oid_readoid(); + + } + + break; + case UDCMD_readreg: + + ///fa 00 22 cmd 42 53 64 75 + ///fa 00 |22 cmd 42 53 64 75 + r = L1_oidReadRegister (t->reg); + + L0_uart0_sendstr("\r\n read reg:"); + L0_uart0_ushex(t->reg); + Lc_delay_ms(1); + L0_uart0_sendstr(" = "); + L0_uart0_ulhex(r); + + L0_uart0_uc(0x09); + break; + #if 0 + case UDCMD_testtime_us: + L0_uart0_sendstr("\r\nUDCMD_testtime_us"); + L0_uart0_uchex(t->dat);L0_uart0_0d0a(); + while(9) + { + /// delay_us(t->dat); + D_IO_LEDkey1_ON(); + // delay_us(t->dat); + D_IO_LEDkey1_OFF(); + } + break; + + case UDCMD_testtime_ms: + L0_uart0_sendstr("\r\nUDCMD_testtime_ms"); + L0_uart0_uchex(t->dat);L0_uart0_0d0a(); + + while(9) + { + /// delay_ms(t->dat); + D_IO_LEDkey1_ON(); + // delay_ms(t->dat); + D_IO_LEDkey1_OFF(); + } + break; + #endif + default: + L0_uart0_sendstr("\r\ncmd error!!"); + L0_uart0_0d0a(); + break; + } + ET0 = 1; +} + + diff --git a/source/asp/asp_oid.h b/source/asp/asp_oid.h new file mode 100644 index 0000000..54043bc --- /dev/null +++ b/source/asp/asp_oid.h @@ -0,0 +1,139 @@ +#ifndef __asp_oid_H__ +#define __asp_oid_H__ + +/************************************************************************************** + asp_oid.c +****************************************************************************************/ + +#include "../bsp/bsp_oid.h" + +#include "msp_uart0.h" + +#include "../ctask/task.h" +#include "../app/app_config.h" + +/********** + + ``````` `\___________________/` ` ` ` ` ` ` `````````\___________________/```````` + 222222 2 21000000000000000000032 2 2 2 2 2 2 222222221000000000000000000032222222 +package no 0 1 2 3 0 1 2 3 +package no 0 1 2 3 4 5 6 7 +packageNo 00000111112222233333xxxxx xxxxxxxxxxx00000111112222233333xxxxx + + 111111111 12222222 + 123456789012345678 901234567890 + +gcode收到固定码 +坐标码 + 按下开始, + 个数累计到了, + 或者抬起 +都要发送 + +寄存器模式: 一般指的是单个变量的保存,写入和读取按寄存器号读取即可 +缓存模式:数据连续放入某个缓存,然后进行批量读取,缓存号(地址)可以作为寄存器 + + +************/ +/*******************. + +write to uart -->send + +Layer3: app tcp + +s->ts_frame.cd->R.point + +----------------------------- +状态判断,数据缓存 + +Layer2: asp asp_oid + +ts.oid ->s->ts_frame.cd + +------------------------- + L1_Oid_readoid + +Layer1: bsp: bsp_oid 最底层的点的采样 + +*******************/ +#define POINT_LEN 20///cc fixme + +typedef struct +{///6Byte + U16 x100; + U16 y100; +}TS_xy100; +typedef union{ + TS_xy100 xy100; + U32 gcode; +}TU_code; + +#define D_PEN_normal 0 +#define D_PEN_down 1 +#define D_PEN_none 2 +#define D_PEN_up 3 +#define D_PEN_gcode 4 +typedef struct +{ + U16 angle:9;///360 + U16 packageNo:4; ///0-2^5 + U16 sta:3; /// =0 nomal =1 按下 =3 抬起 =2 没有按下 =4 gcode +}Oid_flag; +////一帧数据,也是一个点 +typedef struct +{ + Oid_flag flag; + TU_code cd; + TtimeStamp time; ///最好一个包一个时间戳 一个点(一帧)一个时间戳有点浪费 + /// 前提1 是采样的点是固定间隔而且连续 + ////时间戳甚至是相对的 甚至误差相对于采样而言也比较大 +}Ts_OID_frame_xy_;///8Bytes + +typedef struct _s_task_oid_ +{ + TS_task task; + + vU8 can_send;/// + U16 p_ok;/// + U16 send_t; + TtimeStamp tts; + U16 point; + U16 extra; + U16 send_p; + Ts_OID_frame_xy_ ts_frame; +/// Ts_OID_out_ out; + +}TS_task_oid_; +extern TS_task_oid_ ts_task_oid; +extern void L3_task_oid_handle(TS_task_oid_ *s); +extern Ts_OID_frame_xy_ oid_buf[POINT_LEN+10]; +extern Ts_OID_frame_xy_ points[POINT_LEN+10]; + + + +//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>for debug +typedef struct _ts_debug_oid_cmd_ +{///6bytes 去掉了filter和命令字 + U8 cmd; + /// U8 rw; /// 写还是读: =1 读,=0写 + U8 dat; ///数据 + U16 reg; /// + U16 end; /// +}TS_oid_cmd; + +#define UDCMD_wakeup 0x11 /// +#define UDCMD_cmdsend 0x22 /// +#define UDCMD_readreg 0x23 /// +#define UDCMD_log 0x33 /// +#define UDCMD_get 0x44 /// +#define UDCMD_CheckVersion 0x45 /// +#define UDCMD_testtime_us 0x55 /// +#define UDCMD_testtime_ms 0x66 /// + +///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=200) + { + L0_uart0_uc('E'); + L0_uart0_0d0a(); + SET_SD1_CS_PIN(1); + return(INIT_CMD0_ERROR);//CMD0写入失败 + } + } + //将6字节的命令序列写入SD卡 + SD1_SPI_WByte(pcmd[0]); + SD1_SPI_WByte(pcmd[1]); + SD1_SPI_WByte(pcmd[2]); + SD1_SPI_WByte(pcmd[3]); + SD1_SPI_WByte(pcmd[4]); + SD1_SPI_WByte(pcmd[5]); + + if(pcmd[0]==0X1C) SD1_SPI_RByte(); //如果是停止命令,跳过多余的字节 + + do + { + r=SD1_SPI_RByte(); + time++; + }while((r&0X80)&&(time= TRY_TIME2) + { + L0_uart0_uc(0x09); + L0_uart0_uc('R'); + L0_uart0_uc(0x09); + return(INIT_CMD0_ERROR);//CMD0写入失败 + } + }while(r!=0x01); + L0_uart0_uc(0x09); + L0_uart0_uc('6'); + L0_uart0_uc(0x09); + + if(1==SD1_Write_Cmd(pCMD8))//写入CMD8,如果返回值为1,则SD卡版本为2.0 + { + L0_uart0_sendstr("SDver:2.0\r\n");/////4g卡 + rbuf[0]=SD1_SPI_RByte(); rbuf[1]=SD1_SPI_RByte(); //读取4个字节的R7回应,通过它可知此SD卡是否支持2.7~3.6V的工作电压 + rbuf[2]=SD1_SPI_RByte(); rbuf[3]=SD1_SPI_RByte(); + + if(rbuf[2]==0X01 && rbuf[3]==0XAA)//SD卡是否支持2.7~3.6V + { + L0_uart0_sendstr("2.7~3.6V=");/////4g卡 + + time=0; + do + { + SD1_Write_Cmd(pCMD55);//写入CMD55 + r=SD1_Write_Cmd(pACMD41H);//写入ACMD41,针对SD2.0 + time++; + if(time>=TRY_TIME) + { + return(INIT_SDV2_ACMD41_ERROR);//对SD2.0使用ACMD41进行初始化时产生错误 + } + }while(r!=0); + + if(0==SD1_Write_Cmd(pCMD58)) //写入CMD58,开始鉴别SD2.0 + { + rbuf[0]=SD1_SPI_RByte(); rbuf[1]=SD1_SPI_RByte(); //读取4个字节的OCR,其中CCS指明了是SDHC还是普通的SD + rbuf[2]=SD1_SPI_RByte(); rbuf[3]=SD1_SPI_RByte(); + + if(rbuf[0]&0x40) + { + SD1_Ver=SD_VER_V2HC; //SDHC卡 + SD1_Addr_Mode=1; //SDHC卡的扇区寻址方式是扇区地址 + } + else SD1_Ver=SD_VER_V2; //普通的SD卡,2.0的卡包含SDHC和一些普通的卡 + + } + + if(!SD1_Addr_Mode) + { + //addr = addr * 512 将块地址(扇区地址)转为字节地址 + L0_uart0_uc(0x30+SD1_Addr_Mode); + L0_uart0_sendstr("<<9 \r\n");/////4g卡 + } + else + { + L0_uart0_uc(0x30+SD1_Addr_Mode); + L0_uart0_sendstr("1 mass adr \r\n");/////4g卡 + } + + } + } + else //SD V1.0或MMC + { + L0_uart0_sendstr("SD V1.0 or MMC \r\n"); + //SD卡使用ACMD41进行初始化,而MMC使用CMD1来进行初始化,依此来进一步判断是SD还是MMC + SD1_Write_Cmd(pCMD55);//写入CMD55 + r=SD1_Write_Cmd(pACMD41S);//写入ACMD41,针对SD1.0 + + if(r<=1) //检查返回值是否正确,如果正确,说明ACMD41命令被接受,即为SD卡 + { + SD1_Ver=SD_VER_V1; //普通的SD1.0卡,一般来说容量不会超过2G + + time=0; + do + { + SD1_Write_Cmd(pCMD55);//写入CMD55 + r=SD1_Write_Cmd(pACMD41S);//写入ACMD41,针对SD1.0 + time++; + if(time>=TRY_TIME) + { + return(INIT_SDV1_ACMD41_ERROR);//对SD1.0使用ACMD41进行初始化时产生错误 + } + }while(r!=0); + } + else //否则为MMC + { + SD1_Ver=SD_VER_MMC; //MMC卡,它不支持ACMD41命令,而是使用CMD1进行初始化 + + time=0; + do + { + r=SD1_Write_Cmd(pCMD1);//写入CMD1 + time++; + if(time>=TRY_TIME) + { + return(INIT_CMD1_ERROR);//MMC卡使用CMD1命令进行初始化中产生错误 + } + }while(r!=0); + } + } + + if(0!=SD1_Write_Cmd(pCMD16)) //SD卡的块大小必须为512字节 + { + SD1_Ver=SD_VER_ERR; //如果不成功,则此卡为无法识别的卡 + return INIT_ERROR; + } + + SET_SD1_CS_PIN(1); + SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟 + + SD1_SPI_SPEED_HIGH(); //SPI切到高速 + + return 0;//返回0,说明复位操作成功 +} + +/****************************************************************** + - 功能描述:对SD卡若干个扇区进行擦除,擦除后扇区中的数据大部分情况 + 下为全0(有些卡擦除后为全0XFF,如要使用此函数,请确认) + - 参数说明:addr_sta:开始扇区地址 addr_end:结束扇区地址 + - 返回说明:调用成功,返回0x00,否则返回错误码 + + add by cc 如果addr_sta=addr_end 命令无效,一次至少擦除两个扇区 + CMD32 ERASE_WR_BLK_START Mandatory + +CMD33 ERASE_WR_BLK_END Mandatory + +CMD38 ERASE Mandatory + + Class5 (擦除卡命令集): + + CMD32:设置擦除块的起始地址. + + CMD33:设置擦除块的终止地址. + + CMD38: 擦除所选择的块. + + + ******************************************************************/ + +UINT8 SD1_Erase_nSector(UINT32 addr_sta,UINT32 addr_end) +{ + UINT8 r,time; + UINT8 i=0; + UINT8 pCMD32[]={0x60,0x00,0x00,0x00,0x00,0xff}; //设置擦除的开始扇区地址 + UINT8 pCMD33[]={0x61,0x00,0x00,0x00,0x00,0xff}; //设置擦除的结束扇区地址 + UINT8 pCMD38[]={0x66,0x00,0x00,0x00,0x00,0xff}; //擦除扇区 + + if(!SD1_Addr_Mode) + { + addr_sta<<=9;addr_end<<=9; + //addr = addr * 512 将块地址(扇区地址)转为字节地址 + + } + + pCMD32[1]=addr_sta>>24; //将开始地址写入到CMD32字节序列中 + pCMD32[2]=addr_sta>>16; + pCMD32[3]=addr_sta>>8; + pCMD32[4]=addr_sta; + + pCMD33[1]=addr_end>>24; //将开始地址写入到CMD32字节序列中 + pCMD33[2]=addr_end>>16; + pCMD33[3]=addr_end>>8; + pCMD33[4]=addr_end; + + time=0; + do + { + r=SD1_Write_Cmd(pCMD32); + time++; + if(time==TRY_TIME) + { + return(r); //命令写入失败 + } + }while(r!=0); + + time=0; + do + { + r=SD1_Write_Cmd(pCMD33); + time++; + if(time==TRY_TIME) + { + return(r); //命令写入失败 + } + }while(r!=0); + + time=0; + do + { + r=SD1_Write_Cmd(pCMD38); + time++; + if(time==TRY_TIME) + { + return(r); //命令写入失败 + } + }while(r!=0); + + return 0; + +} + +/**************************************************************************** + - 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中 + - 参数说明:addr:扇区地址 + buffer:指向数据缓冲区的指针 + - 返回说明:调用成功,返回0x00,否则返回错误码 + - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 + +cc modify :tf卡的读写次数是10W次,就按1万次来算,3600s 一个小时36000十个小时 + ****************************************************************************/ + +UINT8 L1_SD_Wsector(UINT32 addr,UINT8 *buffer) //向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令) +{ + UINT8 r,time; + UINT16 i=0; + UINT8 pCMD24[]={0x58,0x00,0x00,0x00,0x00,0xff}; //向SD卡中单个块(512字节,一个扇区)写入数据,用CMD24 + + if(!SD1_Addr_Mode) + { + addr<<=9; //addr = addr * 512 将块地址(扇区地址)转为字节地址 + } + + pCMD24[1]=addr>>24; //将字节地址写入到CMD24字节序列中 + pCMD24[2]=addr>>16; + pCMD24[3]=addr>>8; + pCMD24[4]=addr; + + time=0; + do + { + r=SD1_Write_Cmd(pCMD24); + time++; + if(time==TRY_TIME) + { + + SET_SD1_CS_PIN(1); + return(r); //命令写入失败 + } + }while(r!=0); + + while(0XFF!=SD1_SPI_RByte()); //等待SD卡准备好,再向其发送命令及后续的数据 + + SD1_SPI_WByte(0xFE);//写入开始字节 0xfe,后面就是要写入的512个字节的数据 + + for(i=0;i<512;i++) //将缓冲区中要写入的512个字节写入SD1卡,减少循环次数,提高数据写入速度 + { + SD1_SPI_WByte(*(buffer++)); + + /**SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); + SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));**/ + } + + SD1_SPI_WByte(0xFF); + SD1_SPI_WByte(0xFF); //两个字节的CRC校验码,不用关心 + + r=SD1_SPI_RByte(); //读取返回值 + if((r & 0x1F)!=0x05) //如果返回值是 XXX00101 说明数据已经被SD卡接受了 + { + return(WRITE_BLOCK_ERROR); //写块数据失败 + } + + while(0xFF!=SD1_SPI_RByte());//等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间) + //忙时,读回来的值为0x00,不忙时,为0xff + + SET_SD1_CS_PIN(1); + SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟 + + return(0); //返回0,说明写扇区操作成功 +} + + +UINT8 L2_SD_Rsector(UINT16 addr,UINT8 *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令) +{ + UINT32 addr32 = D_FILE_SECTOR; + addr32 += (UINT32)addr; + return L1_SD_Rsector(addr32,buffer); +} +UINT8 L2_SD_Wsector(UINT16 addr,UINT8 *buffer) //向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令) +{ + UINT32 addr32 = D_FILE_SECTOR; + addr32 += (UINT32)addr; + return L1_SD_Wsector(addr32,buffer); + +} +UINT8 L2_SD_Erase_nSector(UINT16 addr_sta,UINT16 addr_end) +{ + UINT32 addr32= D_FILE_SECTOR,addr32end= D_FILE_SECTOR; + addr32 += (UINT32)addr_sta; + addr32end += (UINT32)addr_end; + return SD1_Erase_nSector(addr32,addr32end); + +} + + + +/**************************************************************************** + - 功能描述:读取addr扇区的512个字节到buffer指向的数据缓冲区 + - 参数说明:addr:扇区地址 + buffer:指向数据缓冲区的指针 + - 返回说明:调用成功,返回0x00,否则返回错误码 + - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 + ****************************************************************************/ + +UINT8 L1_SD_Rsector(UINT32 addr,UINT8 *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令) +{ + UINT16 i; + UINT8 time,r; + + UINT8 pCMD17[]={0x51,0x00,0x00,0x00,0x00,0x01}; //CMD17的字节序列 + + if(!SD1_Addr_Mode) + { + addr<<=9; //sector = sector * 512 将块地址(扇区地址)转为字节地址 + } + + pCMD17[1]=addr>>24; //将字节地址写入到CMD17字节序列中 + pCMD17[2]=addr>>16; + pCMD17[3]=addr>>8; + pCMD17[4]=addr; + + L0_uart0_uc('Q'); + + time=0; + do + { + r=SD1_Write_Cmd(pCMD17); //写入CMD17 + time++; + ///L0_uart0_uc(0x30+time); + if(time==TRY_TIME) + { + L0_uart0_uc('T'); + SET_SD1_CS_PIN(1); + return(READ_BLOCK_ERROR); //读块失败 + } + }while(r!=0); + + L0_uart0_uc('A'); + time = 0; + while(SD1_SPI_RByte()!= 0xFE) + { //一直读,当读到0xfe时,说明后面的是512字节的数据了 + time++; + ///L0_uart0_uc(0x30+time); + if(time==TRY_TIME) + { + L0_uart0_uc('F'); + SET_SD1_CS_PIN(1); + return(READ_BLOCK_ERROR); //读块失败 + } + } + + //L0_uart0_uc('i'); + + for(i=0;i<512;i++) //将数据写入到数据缓冲区中 + { + *(buffer++)=SD1_SPI_RByte(); + /** + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + *(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); + + + **/ + } + + SD1_SPI_RByte(); + SD1_SPI_RByte();//读取两个字节的CRC校验码,不用关心它们 + + SET_SD1_CS_PIN(1); + SD1_SPI_WByte(0xFF); //按照SD1卡的操作时序在这里补8个时钟 + + return 0; +} + + +#if 0 + +/**************************************************************************** + - 功能描述:向addr扇区开始的nsec个扇区写入数据(★硬件多扇区写入) + - 参数说明:nsec:扇区数 + addr:开始扇区地址 + buffer:指向数据缓冲区的指针 + - 返回说明:调用成功,返回0x00,否则返回错误码 + - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 + ****************************************************************************/ + +UINT8 SD1_Write_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer) +{ + UINT8 r,time; + UINT32 i=0,j=0,m=0; + + UINT8 pCMD25[6]={0x59,0x00,0x00,0x00,0x00,0x01}; //CMD25用于完成多块连续写 + UINT8 pCMD55[6]={0x77,0x00,0x00,0x00,0x00,0x01}; //CMD55,用于告知SD卡后面是ACMD,CMD55+ACMD23 + UINT8 pACMD23[6]={0x57,0x00,0x00,0x00,0x00,0x01};//CMD23,多块连续预擦除 + + if(!SD1_Addr_Mode) addr<<=9; + + pCMD25[1]=addr>>24; + pCMD25[2]=addr>>16; + pCMD25[3]=addr>>8; + pCMD25[4]=addr; + + pACMD23[1]=nsec>>24; + pACMD23[2]=nsec>>16; + pACMD23[3]=nsec>>8; + pACMD23[4]=nsec; + + if(SD1_Ver!=SD_VER_MMC) //如果不是MMC卡,则首先写入预擦除命令,CMD55+ACMD23,这样后面的连续块写的速度会更快 + { + SD1_Write_Cmd(pCMD55); + SD1_Write_Cmd(pACMD23); + } + + time=0; + do + { + r=SD1_Write_Cmd(pCMD25); + time++; + if(time==TRY_TIME) + { + return(WRITE_CMD25_ERROR); //命令写入失败 + } + }while(r!=0); + + while(0XFF!=SD1_SPI_RByte()); //等待SD卡准备好,再向其发送命令及后续的数据 + + for(j=0;j>24; //将字节地址写入到CMD17字节序列中 + pCMD18[2]=addr>>16; + pCMD18[3]=addr>>8; + pCMD18[4]=addr; + + time=0; + do + { + r=SD1_Write_Cmd(pCMD18); //写入CMD18 + time++; + if(time==TRY_TIME) + { + return(READ_CMD18_ERROR); //写入CMD18失败 + } + }while(r!=0); + + for(j=0;j>7)+((pCSD[9]&0x03)<<1)+2; + csize=(pCSD[8]>>6)+((UINT16)pCSD[7]<<2)+((UINT16)(pCSD[6]&0x03)<<0x0A)+1; + Capacity=(UINT32)csize<<(n-9);//得到扇区数 + } + return Capacity; +} + +#endif + + + diff --git a/source/asp/nouse/asp_SI24R1m.c b/source/asp/nouse/asp_SI24R1m.c new file mode 100644 index 0000000..fb4e8da --- /dev/null +++ b/source/asp/nouse/asp_SI24R1m.c @@ -0,0 +1,1041 @@ +#include "asp_SI24R1m.h" + +TS_2g4_ ts_2g4 = +{ + + 0,0,0,////ts_task_init, ///TS_task task; + + 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a, ///u8 Rbuf[32]; + 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a, + 0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a, + 0x0d,0x0a, + + 0x31,0x36,0x37,0x38,0x39,0x32,0x33,0x34,0x35,0x3a, ///u8 Rbuf[32]; + 0x46,0x47,0x48,0x49,0x41,0x42,0x43,0x44,0x45,0x4a, + 0x61,0x65,0x66,0x67,0x62,0x63,0x64,0x68,0x69,0x6a, + 0x0d,0x0a, + 0,///u8 Tbuf_change; + 0, ///U8 val; + 0, ///U8 con; ///config + 0, ///U8 sta; + 0, ///U8 sta_show; + 0, ///U8 fifo_sta; + 0, ///U8 id; + 0, ///U32 sendStamp; + 0, ///U32 over; + 0, ///U8 rx_en; + 0, ///U8 rx_ch;///有接收数据的通道号 + 0, ///U8 rx_fifo_num;////RX_PW_P0-5 接收数据管道n的数据数量 + /// + 0, ///U8 ok; + 0, ///U8 tx_en; + 0 ///U8 rs_mode;///发送或接收的模式 + /// U8 ackFlag; + + + }; + + + +#if 0 +1:前导码 +2: 地址 +3: ---------------- 包控制字---------------------- + |-数据包长度(6bit) PID(1bit) NO_ACK(1bit)-| +4: DDDDDDD负载数据(0-32Bytes)DDDD +5: CRC + + +比较别扭的地方: + + 发送的地址寄存器只有一个,但是接收的寄存器共分6个 P0实际上就是最常用的接收地址 + +总共三种模式: + +模式一 没有ACK +没有ack , 也就是NO_ACK 子字段为1, +发射方:FEATURE/EN_DYN_ACK = 1; +W_TX_PAYLOAD_NOACK--> FIFO + +模式二 单纯ack 发送 +EN_AA设置自动回复 + + W_TX_PAYLOAD命令写TX FIFO +发送: 地址等于接收的P0 +接收: ack返回给发送(发送地址等于发送端的接收地址P0) + +发送端发送数据后,没有收到对应地址返回的ACK(在ARD时间内),则重新发送上一帧数据 +ARC累加 重发次数达到最大后,产生MAX_RT 中断 (SETUP_RETR设置) + +模式三 ACK带返回数据 + +发送: +接收: W_ACK_PAYLOA命令写TX FIFO 返回的数据 + + + +发送数据长度的问题: +3.1 动态PAYLOAD长度 FEATURE.EN_DPL 1bit DYNPD.DPL_P0-5 此时包控制字段中的前六位是发送的数据长度 +R_RX_PL_WID命令读取数据长度 + +3.2 静态PAYLAOD长度 + +发送的数据长度应该一致,并且于接收方的RX_PW_PX寄存器值相同 +/******************************************************** +函数功能:L2_SI24R1_RX_Mode(PRIM_RX_SEND ); +入口参数:无 +返回 值:无 +*********************************************************/ +void L2_SI24R1_RX_Mode(U8 rev) +{ + D_SI24_CE_OFF(); + ts_2g4.con = L1_SI24R1_RReg(CONFIG); + if(PRIM_RX_SEND == rev) + { + BITN_1(ts_2g4.con,PRIM_RX); ///1:发射模式 + }else + { + BITN_0(ts_2g4.con,PRIM_RX); ///0:接收模式 + } + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + D_SI24_CE_ON(); // 拉高CE启动接收设备 +} + +#endif + +void L3_task_2g4_reg(void) +{ + + for(ts_2g4.id = 0;ts_2g4.id <= 0x1d; ts_2g4.id ++) + { + ts_2g4.tx_en = L1_SI24R1_RReg(ts_2g4.id); + L0_uart0_sendArray("reg(",4); + L0_uart0_uchex(ts_2g4.id ); + L0_uart0_sendArray(") = ",4); + L0_uart0_uchex(ts_2g4.tx_en); + L0_uart0_uc(' '); + } + + + + L1_SI24R1_RAddr(TX_ADDR,ts_2g4.Rbuf); + + L0_uart0_sendArray("\r\nTX_ADDR = ",15); + L0_uart0_uchex(ts_2g4.Rbuf[0]); + L0_uart0_uchex(ts_2g4.Rbuf[1]); + L0_uart0_uchex(ts_2g4.Rbuf[2]); + L0_uart0_uchex(ts_2g4.Rbuf[3]); + L0_uart0_uchex(ts_2g4.Rbuf[4]); + + L1_SI24R1_RAddr(RX_ADDR_P0,ts_2g4.Rbuf); + + L0_uart0_sendArray("\r\nRX_ADDR_P0 = ",15); + L0_uart0_uchex(ts_2g4.Rbuf[0]); + L0_uart0_uchex(ts_2g4.Rbuf[1]); + L0_uart0_uchex(ts_2g4.Rbuf[2]); + L0_uart0_uchex(ts_2g4.Rbuf[3]); + L0_uart0_uchex(ts_2g4.Rbuf[4]); + L1_SI24R1_RAddr(RX_ADDR_P1,ts_2g4.Rbuf); + + L0_uart0_sendArray("\r\nRX_ADDR_P1 = ",15); + L0_uart0_uchex(ts_2g4.Rbuf[0]); + L0_uart0_uchex(ts_2g4.Rbuf[1]); + L0_uart0_uchex(ts_2g4.Rbuf[2]); + L0_uart0_uchex(ts_2g4.Rbuf[3]); + L0_uart0_uchex(ts_2g4.Rbuf[4]); + + + + + L0_uart0_0d0a(); +} + + + +#if 0 + +void L2_SI24R1_RX_Mode2(U8 rev) +{ +/// D_SI24_CE_OFF(); + ts_2g4.con = L1_SI24R1_RReg(CONFIG); + + BITN_0(ts_2g4.con,PRIM_RX); ///0:接收模式 + + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + D_SI24_CE_ON(); // 拉高CE启动接收设备 +} + +TS_addr_2g4_ ts_addr_2g4={ + 0xCC,0xa2,0xB3,0xC4,D_MSC_1V6_P0,///u8 TX[5]; ///发送基地址 + 0xCC,0xa2,0xB3,0xC4,D_MSC_1V6_P0,///u8 RX_P0[5]; ///接收P0基地址 + 0xCC,0xa2,0xB3,0xC4, D_MSC_1V6_P1,///P1=P1_base[4] u8 P1_base[5]; ///P1-P5基地址 + ///P1-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分 + D_MSC_1V6_P2,///P2 //P[0] //u8 P[4]; + D_MSC_1V6_P3,///P3 //P[1] + D_MSC_1V6_P5,///P4 //P[2] + D_MSC_1V6_P5 ///P5 //P[3] +}; + +#else +TS_addr_2g4_ ts_addr_2g4={ + D_MSC_1V6_P0,0xC4,0xB3,0xa2,0xCC,///u8 TX[5]; ///发送基地址 + D_MSC_1V6_P0,0xC4,0xB3,0xa2,0xCC,///u8 RX_P0[5]; ///接收P0基地址 + D_MSC_1V6_P1,0xC4,0xB3,0xa2,0xCC, ///P1=P1_base[4] u8 P1_base[5]; ///P1-P5基地址 + ///P1-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分 + D_MSC_1V6_P2,///P2 //P[0] //u8 P[4]; + D_MSC_1V6_P3,///P3 //P[1] + D_MSC_1V6_P4,///P4 //P[2] + D_MSC_1V6_P5 ///P5 //P[3] +}; + + +#endif +#if 0 +rev +reg(00) = 0E reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 37 +reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00 +reg(0A) = 20 reg(0B) = 21 reg(0C) = 22 reg(0D) = 23 reg(0E) = 24 +reg(0F) = 25 reg(10) = 20 reg(11) = 00 reg(12) = 00 reg(13) = 00 +reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00 +reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 3F reg(1D) = 06 +TX_ADDR =\020C4B3A2CC +RX_ADDR_P1 =\021C4B3A2CC +RX_ADDR_P0 =\020C4B3A2CC + +#endif +///void *L2_SI24R1_init(TS_2g4_ *s);///() + +void (*L3_task_2g4_handle)(TS_2g4_ *s); + +void L2_SI24R1_init_config(void) +{ + L1_SI24R1_Init(); + L3_task_2g4_handle = L2_task_2g4_handle_NOACK; +} +/*********** + + +// 地址宽度 5Bytes 默认 + L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址 + + ts_2g4.Tbuf[0]=0xaa; + ts_2g4.Tbuf[1]++; + ts_2g4.Tbuf[2]++; + ts_2g4.Tbuf[3]++; + ts_2g4.Tbuf[4]++; + + + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,32);///需要发送的数据 + + **********/ + + +////L2_SI24R1_TRmode(PRIM_RX_SEND); +////L2_SI24R1_TRmode(PRIM_RX_REV); + +void L2_SI24R1_TRmode(u8 mode) +{ + if (PRIM_RX_SEND == mode) + { + BITN_0(ts_2g4.con,PRIM_RX); + }else + { + BITN_1(ts_2g4.con,PRIM_RX); + } + D_SI24_Register(); + L1_SI24R1_WReg(CONFIG,ts_2g4.con); +//// D_SI24_Work(); +} + +////////最简单的接收和发送模式 无ACK +void L2_SI24R1_init_NOACK_slave(void) +{ + L1_SI24R1_Init(); +///step 1: addr +//// L1_SI24R1_WReg(SETUP_AW, B0000_0011); // 地址宽度 5Bytes 默认 + L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址 + L1_SI24R1_WBuf(RX_ADDR_P0, ts_addr_2g4.RX_P0, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 + L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0 + +///step 3: RF config + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + + L1_SI24R1_WReg(RX_PW_P0, 32); + + L1_SI24R1_WReg(RF_SETUP, 0x08); // 数据传输率2Mbps,发射功率7dBm + L1_SI24R1_WReg(FEATURE,EN_DYN_ACK|EN_DPL); + L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。 + + ts_2g4.con = MASK_RX_DR_ON ///接收中断打开 + |MASK_TX_DS_ON ///发射中断关闭,在ack模式下 + |MASK_MAX_RT_ON + |EN_CRC_ON + |EN_CRC_2Byte + |PWR_UP_POWER_ON /// 关断/开机模式配置 0:关断模式 1:开机模式 + |PRIM_RX_REV; + + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + D_SI24_Work(); + /// L3_task_2g4_reg(); // 拉高CE启动接收设备 +} + +void L2_SI24R1_init_NOACK_master(void) +{ + D_SI24_Register(); + // 地址宽度 5Bytes 默认 + L1_SI24R1_WBuf(TX_ADDR, ts_addr_2g4.TX, TX_ADR_WIDTH); // 写入发送地址 + + L1_SI24R1_WBuf(RX_ADDR_P0, ts_addr_2g4.RX_P0, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 + L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0 + + + L1_SI24R1_WReg(FEATURE,EN_DYN_ACK|EN_DPL); ///使能动态负载长度 + L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。 + + L1_SI24R1_WReg(SETUP_AW, B0000_0011); ///5 byte addr width +///step 3: RF config + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + L1_SI24R1_WReg(RF_SETUP, 0x08); // 数据传输率2Mbps,发射功率7dBm + + ts_2g4.con = MASK_RX_DR_ON ///接收中断打开 + |MASK_TX_DS_ON ///发射中断 + |MASK_MAX_RT_ON + |EN_CRC_ON + |EN_CRC_2Byte + |PWR_UP_POWER_ON /// 关断/开机模式配置 0:关断模式 1:开机模式 + |PRIM_RX_SEND; + + L1_SI24R1_WReg(CONFIG,ts_2g4.con); + /// L3_task_2g4_reg(); +/// D_SI24_Work(); // 拉高CE启动接收设备 +} + +void L3_SI24R1_init_NOACK_master(void) +{ + L2_SI24R1_init_NOACK_master(); + L2_SI24R1_TRmode(PRIM_RX_SEND); +} + + +void L2_task_2g4_init(void) +{ + L1_task_init(&ts_2g4.task); + L3_task_s_go(ts_2g4,D_task_init); + L2_SI24R1_init_NOACK_slave(); + L2_SI24R1_init_NOACK_master(); +} + +#define L0_uart0_sendstr(x) ; +///L3_task_2g4_handle_NOACK(&ts_2g4); +////目前使用的no ack 标准应用,发送和接收 +void L2_task_2g4_handle_NOACK(TS_2g4_ *s) +{ + TTSS_Task_init(): + + L0_uart0_sendstr(" 2g4:NOACK /r/n"); + ////打印reg寄存器的信息 + L3_task_2g4_reg(); + ///D_SI24_CE_ON(); + L2_task_exit(); + TTSS_Task_step(D_task_2g4_send): + L0_uart0_sendstr("\r\n 2g4:send-"); + D_SI24_Register(); + + L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式 + ts_2g4.val = 8; + ts_2g4.Tbuf[0]='a'; + ts_2g4.Tbuf[1]='b'; + ts_2g4.Tbuf[2]='n'; + ts_2g4.Tbuf[3]='m'; + ts_2g4.Tbuf[4]='k'; + ts_2g4.Tbuf[5]='3'; + ts_2g4.Tbuf[6]='l'; + ts_2g4.Tbuf[7]='q'; + ts_2g4.Tbuf[8]='7'; + + + + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据 + TTSS_overtime_init(s->over,D_Tdelay_3s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_send_over); + TTSS_Task_step(D_task_2g4_send_over): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + ///(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,TX_DS))///发送完成 + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + ///L2_SI24R1_TRmode(PRIM_RX_REV); + L0_uart0_sendstr(" 2g4: ok\r\n"); + ///L0_uart0_uc('s'); + ts_2g4.ok = D_SI24R1_SENDOK; + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + ts_2g4.ok = D_SI24R1_MAX_RT; + }else + { + L0_uart0_uc('E'); + ts_2g4.ok = D_SI24R1_ER; + L1_SI24R1_WReg(FLUSH_TX,0xff); + } + L2_task_exit(); + }else + {///发送闹钟如果溢出,说明发送失败 因为发送是芯片内部功能,所以除非芯片有状况,不应该出现失败 + ////出现后必须进行重启等处理,由于无线芯片的特点,会出现类似的问题 + TTSS_overtime_get(s->over) + L0_uart0_uc('o'); + ts_2g4.ok = D_SI24R1_TIMEOVER; + L2_task_exit(); + TTSS_overtime_end + } +////////////////////////////////////////////////////////////////////// + TTSS_Task_step(D_task_2g4_REV): + L0_uart0_sendstr(" 2g4:rec mode\r\n"); + L2_task_go(D_task_2g4_REV_start); + + TTSS_Task_step(D_task_2g4_REV_start): + L0_uart0_sendstr("\r\n 2g4:rec S"); + //// L2_SI24R1_init_NOACK_slave(); +// D_SI24_Register(); + L2_SI24R1_TRmode(PRIM_RX_REV);////delay 130us 后进入接收模式 + ////TTSS_overtime_init(s->over,D_Tdelay_5s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_listen); + TTSS_Task_step(D_task_2g4_listen): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + ts_2g4.ok = D_SI24R1_RX_DR; + /// L2_task_go(D_task_2g4_rev_what); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_REV); + } + }else + {////侦听的过程中,每1s打印信息 + TTSS_AreUok(s->over,D_Tdelay_1s,'L'); + } + TTSS_Task_end(); +} +#undef L0_uart0_sendstr + + + + +#if 0 + + + + + ///L3_task_2g4_handle_NOACK(&ts_2g4); + ////目前使用的no ack 标准应用,发送和接收 + void L2_task_2g4_handle_NOACK3333(TS_2g4_ *s) + { + TTSS_Task_init(): + L3_SI24R1_init_NOACK_master(); + L3_task_2g4_reg(); + L2_SI24R1_TRmode(PRIM_RX_SEND); + L0_uart0_sendstr(" 2g4:NOACK /r/n"); + ////打印reg寄存器的信息 + ///D_SI24_CE_ON(); + L2_task_exit(); + TTSS_Task_step(D_task_2g4_send): + L0_uart0_sendstr("\r\n 2g4:send-"); + D_SI24_Register(); + L3_SI24R1_init_NOACK_master(); + ts_2g4.val = 5; + L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式 + ts_2g4.Tbuf[0]='a'; + ts_2g4.Tbuf[1]='b'; + ts_2g4.Tbuf[2]='n'; + ts_2g4.Tbuf[3]='m'; + ts_2g4.Tbuf[4]='k'; + ts_2g4.Tbuf[5]='3'; + ts_2g4.Tbuf[6]='l'; + ts_2g4.Tbuf[7]='q'; + ts_2g4.Tbuf[8]='7'; + + + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据 + TTSS_overtime_init(s->over,D_Tdelay_3s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_send_over); + TTSS_Task_step(D_task_2g4_send_over): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + ///(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,TX_DS))///发送完成 + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + ///L2_SI24R1_TRmode(PRIM_RX_REV); + L0_uart0_sendstr(" 2g4: ok\r\n"); + ///L0_uart0_uc('s'); + ts_2g4.ok = D_SI24R1_SENDOK; + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + ts_2g4.ok = D_SI24R1_MAX_RT; + }else + { + L0_uart0_uc('E'); + ts_2g4.ok = D_SI24R1_ER; + L1_SI24R1_WReg(FLUSH_TX,0xff); + } + L2_task_exit(); + }else + {///发送闹钟如果溢出,说明发送失败 因为发送是芯片内部功能,所以除非芯片有状况,不应该出现失败 + ////出现后必须进行重启等处理,由于无线芯片的特点,会出现类似的问题 + TTSS_overtime_get(s->over) + L0_uart0_uc('o'); + ts_2g4.ok = D_SI24R1_TIMEOVER; + L2_task_exit(); + TTSS_overtime_end + } + ////////////////////////////////////////////////////////////////////// + TTSS_Task_step(D_task_2g4_REV): + L0_uart0_sendstr(" 2g4:rec mode\r\n"); + L2_SI24R1_init_NOACK_slave(); + + L3_task_2g4_reg(); + TTSS_Task_step(D_task_2g4_REV_start): + L0_uart0_sendstr("\r\n 2g4:rec S"); + L2_SI24R1_init_NOACK_slave(); + D_SI24_Register(); + L2_SI24R1_TRmode(PRIM_RX_REV);////delay 130us 后进入接收模式 + ////TTSS_overtime_init(s->over,D_Tdelay_5s); + ts_2g4.ok = 0; + D_SI24_Work(); + L2_task_go(D_task_2g4_listen); + TTSS_Task_step(D_task_2g4_listen): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + L0_uart0_sendstr("\r\n 2g4:ok"); + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + ts_2g4.ok = D_SI24R1_RX_DR; + /// L2_task_go(D_task_2g4_rev_what); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_REV); + } + }else + {////侦听的过程中,每1s打印信息 + TTSS_AreUok(s->over,D_Tdelay_1s,'L'); + } + TTSS_Task_end(); + } + + + TTSS_Task_step(D_task_2g4_rev_what): + L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L0_uart0_0d0a(); + ts_2g4.m = (Modbus03 *)ts_2g4.Rbuf; + L0_uart0_uc(' '); + L0_uart0_uc('R'); + L0_uart0_uchex(ts_2g4.m->reg); + switch(ts_2g4.m->reg) + { + case 1: + + + break; + default: + + break; + + }; + L2_task_go(D_task_2g4_send); + TTSS_Task_step(D_task_2g4_send_next): + ////L2_SI24R1_TRmode(PRIM_RX_SEND); + L2_task_go(D_task_2g4_send); + + ///L2_task_go(D_task_2g4_send); + ///L2_task_go(D_task_2g4_send); + ///TTSS_overtime_init(s->over,D_Tdelay_100ms);///100ms闹钟 + // L2_task_exit(); + // L2_task_exit(); +else + {///没有在闹钟规定的时间收到数据 + TTSS_overtime_get(s->over) + L0_uart0_uc('e'); + L2_task_go(D_task_2g4_send); + TTSS_overtime_end + } + +///L3_task_2g4_handle(&ts_2g4); +////目前使用的no ack +void L3_task_2g4_handle_NOACK_master(TS_2g4_ *s) +{ + TTSS_Task_init(): + L2_SI24R1_init_NOACK_master(); + L0_uart0_sendArray("master /r/n",9); + ////打印reg寄存器的信息 + L3_task_2g4_reg(); + ///D_SI24_CE_ON(); + L2_task_go(D_task_2g4_send); + TTSS_Task_step(D_task_2g4_send): + if(ts_2g4.sta_show) + {ts_2g4.sta_show = 0; + L0_uart0_sendArray("send --\r\n",9); + D_SI24_Register(); + L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,ts_2g4.val);///需要发送的数据 + L2_SI24R1_TRmode(PRIM_RX_SEND);////delay 130us 后进入发送模式 + TTSS_overtime_init(s->over,D_Tdelay_5s); + L2_task_go(D_task_2g4_send_over); + } + TTSS_Task_step(D_task_2g4_send_over): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,TX_DS))///发送完成 + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L2_SI24R1_TRmode(PRIM_RX_REV); + L0_uart0_uc('s'); + TTSS_overtime_init(s->over,D_Tdelay_100ms);///100ms闹钟 + ///delay 130us + L2_task_go(D_task_2g4_ack); + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + L2_task_go(D_task_2g4_send); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_send); + } + }else + {///发送闹钟如果溢出,说明发送失败 + TTSS_overtime_get(s->over) + L0_uart0_uc('o'); + L2_task_go(D_task_2g4_send); + TTSS_overtime_end + } + TTSS_Task_step(D_task_2g4_ack): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + D_SI24_Register(); + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + L2_task_go(D_task_2g4_ack_what); + }else + { + L0_uart0_uc('E'); + L1_SI24R1_WReg(FLUSH_TX,0xff); + L2_task_go(D_task_2g4_send); + } + }else + {///没有在闹钟规定的时间收到数据 + TTSS_overtime_get(s->over) + L0_uart0_uc('e'); + L2_task_go(D_task_2g4_send); + TTSS_overtime_end + } + TTSS_Task_step(D_task_2g4_ack_what): + L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L0_uart0_0d0a(); + ts_2g4.m = (Modbus03 *)ts_2g4.Rbuf; + L0_uart0_uc(' '); + L0_uart0_uc('R'); + L0_uart0_uchex(ts_2g4.m->reg); + switch(ts_2g4.m->reg) + { + case 1: + + + break; + default: + + break; + + }; + L2_task_go(D_task_2g4_send); + TTSS_Task_step(D_task_2g4_send_next): + ////L2_SI24R1_TRmode(PRIM_RX_SEND); + L2_task_go(D_task_2g4_send); + TTSS_Task_end(); +} + +/***** + + +///L1_SI24R1_TxData(WR_TX_PLOAD,ts_2g4.Tbuf,6);///需要发送的数据 +L1_SI24R1_WBuf(W_TX_PAYLOAD_NOACK,ts_2g4.Tbuf,32);///需要发送的数据 + +///step 2: ch config + /// L1_SI24R1_WReg(FEATURE,EN_DPL| ///使能动态负载长度 +/// EN_ACK_PAYd); ///使能ACK负载(带负载数据的ACK包) + + +/// L1_SI24R1_WReg(DYNPD, B0000_0001); ///使能接收管道0-动态负载长度(需EN_DPL及ENAA_Px)。 +/// L1_SI24R1_WReg(EN_AA, B0000_0001); ///使能数据管道0自动确认 + L1_SI24R1_WReg(EN_RXADDR, B0000_0001); ///使能数据管道0 + + +//// L1_SI24R1_WReg(SETUP_RETR, B0011_0111); ///使能数据管道0-5 + +///step + *******/ + +/// L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + +///L0_uart0_uc('S'); +///L0_uart0_uchex(ts_2g4.sta); +///L0_uart0_uc(' '); +/**L0_uart0_uc('C'); +L0_uart0_uc(' '); +ts_2g4.sta = L1_SI24R1_RReg(FIFO_STATUS); +L0_uart0_uchex(ts_2g4.sta); +ts_2g4.sta = L1_SI24R1_RReg(OBSERVE_TX); +L0_uart0_uchex(ts_2g4.sta); +ts_2g4.sta = L1_SI24R1_RReg(STATUS); +L0_uart0_uchex(ts_2g4.sta); +L0_uart0_uc(' '); + +**/ + +void L3_task_2g4_handle_NOACK_slave(TS_2g4_ *s) +{ + TTSS_Task_init(): + L2_SI24R1_init_NOACK_slave(); + L2_task_go(D_task_2g4_REV); + TTSS_Task_step(D_task_2g4_REV): + ////打印reg寄存器的信息 + /// L3_task_2g4_reg(); + L0_uart0_sendArray("\r\nPRIM_RX_REV \r\n",17); + L2_task_go(D_task_2g4_ack); + TTSS_Task_step(D_task_2g4_ack): + if(0 == D_SI24_IRQ_GET())///if IRQ管脚 为低,收到中断 + { + ts_2g4.sta = L1_SI24R1_RReg(STATUS); + /// L0_uart0_uc('R'); + // L0_uart0_uchex(ts_2g4.sta); + /// L0_uart0_uc(' '); + if(BITN_G(ts_2g4.sta,RX_DR))///接收到发送端传递来的数据 + { + ///ts_2g4.rx_ch = (ts_2g4.sta&B0000_1110)>>1; + /// ts_2g4.rx_fifo_num = L1_SI24R1_RReg(RX_PW_P0);///?读出的数据一直是 + ts_2g4.rx_fifo_num = L1_SI24R1_RReg(R_RX_PL_WID); + /// L0_uart0_sendArray("\r\nR_RX_PL_WID =",15); + // L0_uart0_uchex(ts_2g4.rx_fifo_num); + /// L0_uart0_uc(' '); + L1_SI24R1_RBuf(RD_RX_PLOAD,ts_2g4.Rbuf,ts_2g4.rx_fifo_num); //读取数据 + L1_SI24R1_WReg(FLUSH_RX,0xff); + + L2_task_go(D_task_2g4_ackPayload_UPDATE); + + + }else if(BITN_G(ts_2g4.sta,MAX_RT))///重发计数溢出,说明一直没有接收到对应的ACK + { + L1_SI24R1_WReg(FLUSH_TX,0xff); //清除TX FIFO寄存器 + L0_uart0_uc('M'); + L2_task_go(D_task_2g4_ack); + }else + { + L0_uart0_uc('E'); + L2_task_go(D_task_2g4_ack); + } + + L1_SI24R1_WReg(STATUS,ts_2g4.sta);///写1 清除中断标志 + } + TTSS_Task_step(D_task_2g4_ackPayload_UPDATE): + L0_uart0_sendArrayHex(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L0_uart0_0d0a(); + TS_d32_ + ts_2g4.Rbuf + + L2_task_go(D_task_2g4_ack); + TTSS_Task_end(); +} + + +#endif + + +/******************************************************* +模式二:NOACK 通信 +发射方配置: + spi_write_buf( TX_ADDR, TX_ADDRESS, 5); // 写入发送地址 + spi_rw_reg( FEATURE, 0x01); // 使能 W_TX_PAYLOAD_NOACK 命令 + spi_write_buf(W_TX_PAYLOAD_NOACK, buf, TX_PLOAD_WIDTH); // 写 FIFO + spi_rw_reg(SETUP_AW, 0x03); // 5 byte Address width + spi_rw_reg( RF_CH, 0x40); // 选择射频通道 0x40 + spi_rw_reg(RF_SETUP, 0x08); // 数据传输率 2Mbps + spi_rw_reg( CONFIG, 0x0e); //配置为发射模式、CRC 为 2Bytes + CE = 1; +接收方配置: +spi_write_buf( RX_ADDR_P0, TX_ADDRESS, 5); // 接收地址 + spi_rw_reg( EN_RXADDR, 0x01); // 使能接收通道 0 + Preliminary Si24R1 + spi_rw_reg( RF_CH, 0x40); // 选择射频信道 + spi_rw_reg( RX_PW_P0, TX_PLOAD_WIDTH); //设置接收通道 0 负载数据宽度 + spi_rw_reg( RF_SETUP, 0x08); // 数据传输率 2Mbps,-18dbm TX power + spi_rw_reg( CONFIG, 0x0f); // 配置为接收方、CRC 为 2Bytes + CE = 1; + + +*****************************************************/ + +/******************************************************** +函数功能:读取接收数据 +入口参数:rxbuf:接收数据存放首地址 +返回 值:0:接收到数据 + 1:没有接收到数据 +07 +STATUS 状态寄存器(SPI操作开始,状态寄存器值通过 +MISO串行输出)。 + +Reserved +7 ----------------------------------------- +0 R/W 保留 + +RX_DR +6 ---------------------------------------- +0 R/W RX FIFO有值标志位,写’1’清除。 + +TX_DS +5 ---------------------------------------- +0 R/W 发射端发射完成中断位,如果是ACK模式,则收到 +ACK确认信号后TX_DS位置1,写’1’清除。 + +MAX_RT +4 ---------------------------------------- +0 R/W 达到最大重发次数中断位,写’1’清除。 + +RX_P_NO +3:1 ---------------------------------------------- +111 R 收到数据的接收管道PPP号,可以通过SPI读出。 +000-101:数据管道0-5 +110:不可用 +111:RX FIFO为空 + +TX_FULL +0 ---------------------------------------------- +0 R +TX FIFO满标志位。 + + + +*********************************************************/ + /************************* + + void main2(void) + { + KEY1 = 1; + KEY2 = 1; + L1_SI24R1_Init(); + L2_SI24R1_RX_Mode(); + while(1) + { + u8 buf[32] = {0}; + KEY1 = 1; + KEY2 = 1; + if(!KEY1 || !KEY2) + { + Lc_delay_ms(10); + if(!KEY1) + { + buf[0] = 0x55; + L2_SI24R1_TX_Mode(); + L2_SI24R1_TxPacket(buf); + Lc_delay_ms(200); + } + if(!KEY2) + { + buf[0] = 0xAA; + L2_SI24R1_TX_Mode(); + L2_SI24R1_TxPacket(buf); + Lc_delay_ms(200); + } + buf[0] = 0; + L2_SI24R1_RX_Mode(); + } + + if(!L2_SI24R1_RxPacket(buf)) + { + switch(buf[0]) + { + case 0x55: + LED3 = 0; + Lc_delay_ms(100); + LED3 = 1; + Lc_delay_ms(100); + break; + case 0xAA: + LED4 = 0; + Lc_delay_ms(100); + LED4 = 1; + Lc_delay_ms(100); + break; + default: + break; + } + buf[0] = 0; + } + + } + } + + ***************/ + + +/******** + +L0_uart0_sendArray("\r\nS = ",6); +///while(9) +{ + L0_uart0_uchex(0xaa); + L0_uart0_uchex(0x55); +} +L0_uart0_uchex(state); + Lc_delay_ms(600); +L0_uart0_0d0a(); + +第一次没有读取数据 把所有的寄存器给读取出来 然后对比 + + +reg02 使能管道 01 管道1 +reg00 b xxx10 关闭crc 1byte 开机 接收 + b 1011 开启crc 1byte 开机 发送 +rev +reg(00) = 02 reg(01) = 00 reg(02) = 01 reg(03) = 03 reg(04) = 03 +reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00 +reg(0A) = 0A reg(0B) = C2 reg(0C) = C3 reg(0D) = C4 reg(0E) = C5 +reg(0F) = C6 reg(10) = E7 reg(11) = 20 reg(12) = 00 reg(13) = 00 +reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00 +reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 00 reg(1D) = 01 +send +reg(00) = 0B reg(01) = 00 reg(02) = 03 reg(03) = 03 reg(04) = 0A +reg(05) = 28 reg(06) = 0F reg(07) = 0E reg(08) = 00 reg(09) = 00 +reg(0A) = 0A reg(0B) = C2 reg(0C) = C3 reg(0D) = C4 reg(0E) = C5 +reg(0F) = C6 reg(10) = 0A reg(11) = 00 reg(12) = 00 reg(13) = 00 +reg(14) = 00 reg(15) = 00 reg(16) = 00 reg(17) = 01 reg(18) = 00 +reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 00 reg(1D) = 01 + +.over + +0a 39:0 E7E7E 7E7E7 + E7 E7 E7 E7 E7 + 5X7 =35 + +.... +reg(17) = 11 + +reg(10) = E7 TX_ADDRESS +reg(10) = 0A TX_ADDRESS +reg(17) = 01 + +u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x0A,0x01,0x07,0x0E,0x01}; // 定义一个静态发送地址 + + +**********/ + +#if 0 +/******************************************************** +函数功能:SI24R1接收模式初始化 +入口参数:无 +返回 值:无 +*********************************************************/ +void L2_SI24R1_RX_Mode(void) +{ + CE = 0; + L1_SI24R1_WBuf(RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址 + L1_SI24R1_WReg(EN_AA, 0x01); // 使能接收通道0自动应答 + L1_SI24R1_WReg(EN_RXADDR, 0x01); // 使能接收通道0 + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + L1_SI24R1_WReg(RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 + L1_SI24R1_WReg(RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBm + L1_SI24R1_WReg(CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式 + L1_SI24R1_WReg(STATUS, 0xff); //清除所有的中断标志位 + CE = 1; // 拉高CE启动接收设备 +} + + +/******************************************************** +函数功能:SI24R1发送模式初始化 +入口参数:无 +返回 值:无 +*********************************************************/ +void L2_SI24R1_TX_Mode(void) +{ + CE = 0; + L1_SI24R1_WBuf(TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址 + L1_SI24R1_WBuf(RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 + + L1_SI24R1_WReg(EN_AA, 0x01); // 使能接收通道0自动应答 + L1_SI24R1_WReg(EN_RXADDR, 0x01); // 使能接收通道0 + L1_SI24R1_WReg(SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次 + L1_SI24R1_WReg(RF_CH, 40); // 选择射频通道0x40 + L1_SI24R1_WReg(RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBm + L1_SI24R1_WReg(CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 + //CE = 1; +} + +v3.2XF6420136C06938`- +sendmaster /r +reg(00) = 0F reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 03 reg(05) = 28 reg(06) = 0F +reg(07) = 0E reg(08) = 00 reg(09) = 00 reg(0A) = CC reg(0B) = CC reg(0C) = C2 reg(0D) = C3 +reg(0E) = C4 reg(0F) = C5 reg(10) = CC reg(11) = 00 reg(12) = 00 reg(13) = 00 reg(14) = 00 +reg(15) = 00 reg(16) = 00 reg(17) = 11 reg(18) = 00 reg(19) = 00 reg(1A) = 00 reg(1B) = 00 +reg(1C) = 3F reg(1D) = 06 + +.0F11000E .0F11000E .0F11000E .0F11000E .0F11000E .0F11000E .0F11000E abcdefg麻 over + +v3.2XF642C5E203A72A`- +rev C 0F 11 0E S +reg(00) = 0E reg(01) = 3F reg(02) = 3F reg(03) = 03 reg(04) = 03 reg(05) = 28 reg(06) = 0F +reg(07) = 1E reg(08) = 13 reg(09) = 00 reg(0A) = CC reg(0B) = CC reg(0C) = C2 reg(0D) = C3 +reg(0E) = C4 reg(0F) = C5 reg(10) = CC reg(11) = 00 reg(12) = 00 reg(13) = 00 reg(14) = 00 +reg(15) = 00 reg(16) = 00 reg(17) = 01 reg(18) = 00 reg(19) = 00 reg(1A) = 00 reg(1B) = 00 reg(1C) = 3F reg(1D) = 06 + + +PRIM_RX_REV +.0E11130E .0E11130E + + + +#endif + + + diff --git a/source/asp/nouse/asp_SI24R1m.h b/source/asp/nouse/asp_SI24R1m.h new file mode 100644 index 0000000..2bb31eb --- /dev/null +++ b/source/asp/nouse/asp_SI24R1m.h @@ -0,0 +1,113 @@ +#ifndef asp_SI24R1m_ +#define asp_SI24R1m_ + + +#include "bsp_SI24R1.h" +typedef struct +{ + u8 TX[5]; ///发送基地址 + u8 RX_P0[5]; ///接收P0基地址 + u8 P1_base[5]; ///P1地址 (前4字节)P2-P5基地址 + u8 P[4]; ///P2-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分 + ///u8 d32[] +}TS_addr_2g4_; + +///// 默认所有的地址的基地址是一样的,这样策略比较简单 +typedef struct +{ + u8 x;/// + u8 y;/// + u8 z;/// +/// U8 ackFlag; +}TS_xyz_; + +///// 默认所有的地址的基地址是一样的,这样策略比较简单 +typedef struct +{ + u8 filter0;/// + u8 filter1;/// + TS_xyz_ xyz[30];/// +/// U8 ackFlag; +}TS_d32_; + + +typedef struct +{ + TS_task task; + u8 Rbuf[32]; + u8 Tbuf[32]; + u8 Tbuf_change; + U8 val; + U8 con; ///config + U8 sta; + U8 sta_show; + U8 fifo_sta; + U8 id; + U32 sendStamp; + U32 over; + U8 rx_en; + U8 rx_ch;///有接收数据的通道号 + U8 rx_fifo_num;////RX_PW_P0-5 接收数据管道n的数据数量 + + U8 ok; + U8 tx_en; + U8 rs_mode;///发送或接收的模式 + Modbus03 *m; +/// U8 ackFlag; +}TS_2g4_; +extern TS_2g4_ ts_2g4; +void L3_task_2g4_handle_NOACK_master(TS_2g4_ *s); +///void (*L3_task_2g4_handle)(TS_2g4_ *s); +void L2_SI24R1_init_config(void); +extern void (*L3_task_2g4_handle)(TS_2g4_ *s); + + + + +#define D_MSC_1V6_P0 0x20/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P1 0x21/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P2 0x22/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P3 0x23/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P4 0x24/// master slave communication 1v6 通讯地址配置 +#define D_MSC_1V6_P5 0x25/// master slave communication 1v6 通讯地址配置 + + + +#define D_SI24_Standby(); D_SI24_CE_OFF(); +#define D_SI24_Work(); D_SI24_CE_ON(); +#define D_SI24_Register(); D_SI24_CE_OFF(); + + +#define D_task_2g4_send 0x51 +#define D_task_2g4_listen 0x61 +#define D_task_2g4_REV 0x62 +#define D_task_2g4_REV_start 0x82 + +#define D_task_2g4_rev_what 0x72 + +#define D_task_2g4_send_over 0x63 +#define D_task_2g4_send_next 0x64 + +#define D_task_2g4_rx 0x52 +#define D_task_2g4_wait 0x53 +#define D_task_2g4_ackPayload_UPDATE 0x54 + + + +#define D_SI24R1_SENDOK 1 +#define D_SI24R1_MAX_RT 2 +#define D_SI24R1_ER 3 +#define D_SI24R1_TIMEOVER 4 + +#define D_SI24R1_RX_DR 6 + + +extern void L2_task_2g4_init(void); +void L2_task_2g4_handle_NOACK(TS_2g4_ *s); + + +#endif + + + + diff --git a/source/asp/nouse/asp_task_WC.c b/source/asp/nouse/asp_task_WC.c new file mode 100644 index 0000000..d08e5db --- /dev/null +++ b/source/asp/nouse/asp_task_WC.c @@ -0,0 +1,123 @@ +#include "asp_task_WC.h" + +TS_WCapp_ ts_WCapp; + + +#define D_task_WC_send 0x51 + +#define D_task_WC_rx 0x52 +#define D_task_WC_wait 0x53 +#define D_task_WC_ack 0x54 + + +#define D_task_WC_listen 0x61 +#define D_task_WC_REV 0x62 + +#define D_task_WC_send_over 0x63 +#define D_task_WC_send_next 0x64 + +#define D_task_WC_REC_ACK 0x65 +#define D_task_WC_rev_what 0x72 + +#define D_task_WC_END 0x74 + + +void L2_task_WC_init(void) +{ + L1_task_init(&ts_WCapp.task); + L3_task_s_go(ts_WCapp,D_task_init); +} + + +////对应文字版流程图 +#ifdef doc909809 +从机流程图: 文本版,将来甚至可以直接生成流程图及代码。20210409 +step 1;进入接收模式 +step 2 判断: + 接收到数据进入解析step 3 + 未接收到一直等待 +step 3:解析 + 如果是本机需要响应的命令 进入step4 +step 4:应答发送 + 返回主机从机的信息 +step 5;显示信息 + + +测试步骤 + 1,验证流程的逻辑完整性 + 2,验证流程中每一步骤的时间合理性 + 3,验证流程中每一步骤的功能分配的合理性 + 4,验证流程和程序对应的正确性 + 5,检查handdle调用入口的有效性(是否会被执行,以及分配时间的合理性) + 6,检查任务初始化init的调用有效性,确保在handle执行前被调用 + 7,检查init的打印是否正确 + 8,分步骤检查,及打印 + 9,模拟关键 + +#endif + +///L3_task_WC_handle_NOACK(&ts_WCapp); +////目前使用的no ack 标准应用,发送和接收 +void L3_task_WC_master_handle(TS_WCapp_ *s) +{ + //---------------------------------------------------------------// + TTSS_Task_init(): + L0_uart0_sendstr("mC:init\r\n"); + L2_SI24R1_init_config(); + L2_task_2g4_init(); + L2_task_go(D_task_WC_send); + TTSS_Task_step(D_task_WC_send): + L0_uart0_sendstr("\r\nmC:send "); + L3_task_s_go(ts_2g4,D_task_2g4_send); + TTSS_overtime_init(s->over,D_Tdelay_5s); + + L2_task_go(D_task_WC_send_over); + TTSS_Task_step(D_task_WC_send_over): + if (D_SI24R1_SENDOK == ts_2g4.ok) + { + L0_uart0_sendstr("mC:ok rec ack\r\n"); + ts_2g4.ok = 0; + L3_task_s_go(ts_2g4,D_task_2g4_REV_start); + TTSS_overtime_init(s->over,D_Tdelay_10s); + L2_task_go(D_task_WC_REC_ACK); + }else + { + TTSS_overtime_get(s->over) + L0_uart0_uc('v'); + L2_task_go(D_task_WC_END); + TTSS_overtime_end + } + TTSS_Task_step(D_task_WC_REC_ACK): + if(D_SI24R1_RX_DR == ts_2g4.ok) + { + ts_2g4.ok = 0; + L0_uart0_sendstr("mC:recok \r\n"); + L0_uart0_sendArray(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); + L2_task_go(D_task_WC_END); + }else + { + TTSS_overtime_get(s->over) + ///L0_uart0_uc('r'); + L0_uart0_sendstr("\r\nmC:!overtime \r\n"); + L2_task_go(D_task_WC_END); + L3_task_s_go(ts_2g4,D_task_close); + TTSS_overtime_end + } + TTSS_Task_step(D_task_WC_END): + L2_task_go(D_task_WC_send); + L1_task_Tdelay(D_Tdelay_2s); + TTSS_Task_end(); + (*L3_task_2g4_handle)(&ts_2g4); + +} + + + + + + + + + + + diff --git a/source/asp/nouse/asp_task_WC.h b/source/asp/nouse/asp_task_WC.h new file mode 100644 index 0000000..a57b846 --- /dev/null +++ b/source/asp/nouse/asp_task_WC.h @@ -0,0 +1,39 @@ +#ifndef asp_task_WC_ +#define asp_task_WC_ + + +#define D_ID_0 0 +#define D_ID_1 1 +#define D_ID_2 2 +#define D_ID D_ID_0 + +#include "bsp_para2flash.h" +#include "../ctask/task.h" +#include "bsp_SI24R1.h" +#include "msp_UART0.h" +#include "asp_SI24R1m.h" + + + +typedef struct +{ + TS_task task; + U32 sendStamp; + U32 over; + + U8 ok; + Modbus03 *m; +/// U8 ackFlag; +}TS_WCapp_; +extern TS_WCapp_ ts_WCapp; + +///L3_task_handle_NOACK_master(&ts_WCapp); +void L2_task_WC_init(void); + +void L3_task_WC_master_handle(TS_WCapp_ *s); + +#endif + + + + diff --git a/source/bsp/bsp_config.c b/source/bsp/bsp_config.c index d6942b5..63d5f8a 100644 --- a/source/bsp/bsp_config.c +++ b/source/bsp/bsp_config.c @@ -1,5 +1,5 @@ #include "bsp_config.h" -#include "../msp/UART0.h" +#include "../msp/msp_UART0.h" #include "../msp/eeprom.h" //////////////////////////////////////////////////////////////////////////// diff --git a/source/bsp/bsp_config.h b/source/bsp/bsp_config.h index e915041..db5bade 100644 --- a/source/bsp/bsp_config.h +++ b/source/bsp/bsp_config.h @@ -51,7 +51,7 @@ //STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT -#define TYPE_UASER_BOARD TYPE_BOARD_TOUCH_PEN_0B +#define TYPE_UASER_BOARD TYPE_BOARD_TOUCH_PEN_0C //STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG -#if(TYPE_UASER_BOARD == TYPE_BOARD_TOUCH_PEN_0B) +#if(TYPE_UASER_BOARD == TYPE_BOARD_TOUCH_PEN_0C) #include - #include "../cpu/stc_stc8hxx.h" - #include "../cpu/stc_macro.h" +// #include "../cpu/stc_stc8hxx.h" +// #include "../cpu/stc_macro.h" //基本配置(工作频率、时钟、看门狗、字节序) #define TYPE_MCU TYPE_MCU_STC_8H @@ -79,6 +79,54 @@ //存储器特殊参数地址配置 #define D_MCU_SPEC_PARAM_CHIPID 0xFDF9 //...其他参数 + #if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) + + #include "../cpu/STC_stc8h3k.h" + #include "../cpu/STC_only.h" + #include "../cpu/c51_macro.h" + #endif + + //Step3: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config +#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) + + +#define D_SERVE_INT0 interrupt 0 +#define D_SERVE_TIMER0 interrupt 1 +#define D_SERVE_INT1 interrupt 2 +#define D_SERVE_TIMER1 interrupt 3 +///#define D_SERVE_UART interrupt 4 +#define D_SERVE_ADC interrupt 5 +#define D_SERVE_LVD interrupt 6 +#define D_SERVE_PCA interrupt 7 +#define D_SERVE_UART2 interrupt 8 +#define D_SERVE_SPI interrupt 9 +#define D_SERVE_INT2 interrupt 10 +#define D_SERVE_INT3 interrupt 11 +#define D_SERVE_TIMER2 interrupt 12 +#define D_SERVE_INT4 interrupt 16 +#define D_SERVE_UART3 interrupt 17 +#define D_SERVE_UART4 interrupt 18 +#define D_SERVE_TIMER3 interrupt 19 +#define D_SERVE_TIMER4 interrupt 20 +#define D_SERVE_CMP interrupt 21 +#define D_SERVE_PWM interrupt 22 +#define D_SERVE_PWMFD interrupt 23 +#define D_SERVE_I2C interrupt 24 +#endif + + + + +#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer0 1 +#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer1 3 +#define D_ISR_int2 10 /////只有下降沿 +#define D_ISR_int3 11 /////只有下降沿 +#define D_SERVE_UART interrupt 4 +#define D_SERVE_UART1 interrupt 8 +#define D_ISR_int4 16 /////只有下降沿 + //串口配置 #define D_uart0_BRT BRT_115200 @@ -136,42 +184,60 @@ #define D_EEP_ENC_IN_BLOCK 0 //eeprom加密区数据块地址,从0开始 //#define D_EEP_ENC_BLOCK_SIZE 0x20 //ENC_BLOCK_SIZE必须与加密程序中的ENC_BLOCK_SIZE匹配,此处不建议修改,如需修改,请同时修改加密程序 #endif -#elif - xxx -#endif + //STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config -#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) -#define D_SERVE_INT0 interrupt 0 -#define D_SERVE_TIMER0 interrupt 1 -#define D_SERVE_INT1 interrupt 2 -#define D_SERVE_TIMER1 interrupt 3 -#define D_SERVE_UART interrupt 4 -#define D_SERVE_ADC interrupt 5 -#define D_SERVE_LVD interrupt 6 -#define D_SERVE_PCA interrupt 7 -#define D_SERVE_UART2 interrupt 8 -#define D_SERVE_SPI interrupt 9 -#define D_SERVE_INT2 interrupt 10 -#define D_SERVE_INT3 interrupt 11 -#define D_SERVE_TIMER2 interrupt 12 -#define D_SERVE_INT4 interrupt 16 -#define D_SERVE_UART3 interrupt 17 -#define D_SERVE_UART4 interrupt 18 -#define D_SERVE_TIMER3 interrupt 19 -#define D_SERVE_TIMER4 interrupt 20 -#define D_SERVE_CMP interrupt 21 -#define D_SERVE_PWM interrupt 22 -#define D_SERVE_PWMFD interrupt 23 -#define D_SERVE_I2C interrupt 24 #endif -//STEP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>MCU TYPE #define TYPE_MCU_VENDOR_MSK 0xF0 #define TYPE_MCU_VENDOR_STC 0x10 diff --git a/source/bsp/bsp_oid.c b/source/bsp/bsp_oid.c new file mode 100644 index 0000000..65bf032 --- /dev/null +++ b/source/bsp/bsp_oid.c @@ -0,0 +1,826 @@ +#include "bsp_oid.h" +#include "intrins.h" +#include "msp_UART0.h" +#include +#include "../ctask/task.h" +#include "../ctask/tick.h" + + +/****************************************************************************************************** + 变量定义 +*******************************************************************************************************/ +AppDevice eAppDevice = ePointRead_2000A; +///volatile uint32_t RecvData[3]; +Ts_OID_ ts_oid; + +uint8_t TransCmd[7]; +///#define MAIN_Fosc 11059260L +#if 0 +#define MAIN_Fosc (12459260L/4) +#define D_DELAY_10US 10 +#define D_DELAY_ROD_80US 80 + + +#else +#define MAIN_Fosc (12459260L/2) +#define D_DELAY_10US 20 +#define D_DELAY_ROD_80US 160 + + +#endif + + +//======================================================================== +// 函数: void delay_ms(uint8_t ms) +// 描述: 延时函数。 +// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. +// 返回: none. +// 版本: VER1.0 +// 日期: 2021-3-9 +// 备注: +//======================================================================== +void delay_ms(uint8_t ms) +{ + uint16_t i; + do{ + i = MAIN_Fosc / 10000L; + while(--i); //10T per loop + }while(--ms); +} + +void delay_us(uint8_t us) +{ + uint16_t i; + do{ + // i = MAIN_Fosc / 10000000L; + // i = 1;///5 10 150u 1---50us + /// while(--i); //10T per loop + }while(--us); +} + +/****************************************************************************************************** +Function: +Input: +Output: +*******************************************************************************************************/ +void L0_oid_SendCmd(uint8_t Cmd) +{ + uint8_t i; + LD_Oid_SDIO_OUT(); + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_HIGH(); // Write control bit + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + delay_us(D_DELAY_10US); + + for(i=0;i<8;i++) + { + LD_Oid_SCK_HIGH(); + if(Cmd & 0x80) + { + LD_Oid_SDIO_HIGH(); + } + else + { + LD_Oid_SDIO_LOW(); + } + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + + #if 0 + if(i == 7) + { + LD_Oid_SDIO_IN(); + } + #endif + delay_us(D_DELAY_10US); + Cmd <<= 1; + } + delay_us(D_DELAY_ROD_80US); + LD_Oid_SDIO_IN(); +} + +uint16_t L0_oid_RecvAck16(void) +{ + uint8_t i; + uint16_t AckValue; + AckValue = 0; +/// +LD_Oid_SDIO_OUT(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_LOW(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + delay_us(D_DELAY_10US); + + for(i = 0; i < 16; i++) + { + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_IN() + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + if(OID_DET) + { + AckValue +=1; + } + + if(i < 15) + { + AckValue <<= 1; + } + + delay_us(D_DELAY_10US); + } + delay_us(D_DELAY_ROD_80US); + + return AckValue; +} + + +void L0_oid_Recv64(void) +{ + uint8_t i; + Lc_memset8bits(ts_oid.rec.d, 0, 8); + LD_Oid_SDIO_OUT(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_HIGH(); + LD_Oid_SDIO_LOW(); + + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + + delay_us(D_DELAY_10US); + LD_Oid_SDIO_IN() + + for(i = 0; i < 64; i++) + { + LD_Oid_SCK_HIGH(); + delay_us(D_DELAY_10US); + LD_Oid_SCK_LOW(); + + + #if 0 + if(OID_DET) + { + if(i < 32) + { + RecvData[0] += 1; + } + if(i>=32 && i<64) + { + RecvData[1] += 1; + } + + } + + if(i < 31) + { + RecvData[0] <<= 1; + } + if( i >31 && i < 63) + { + RecvData[1] <<= 1; + } + #endif + + ///#else + + ts_oid.rec.d[i/8] <<= 1; + + if(OID_DET) + { + ts_oid.rec.d[i/8] |= 1; + // RecvData[1] += 1; + } + else + { + ts_oid.rec.d[i/8] &= 0xfe; + } + // RecvData[1] <<= 1; + + + + delay_us(D_DELAY_10US); + } + + + ts_oid.time = D_sys_now; + delay_us(D_DELAY_ROD_80US); + + return; +} + +uint8_t L1_oid_TransCmd(uint8_t Cmd) +{ + uint8_t TxCmd;///,det_busy; + uint32_t RxAckCnt = 0; + +// L0_uart0_sendstr("\r\n w cmd="); +/// L0_uart0_uchex(Cmd); +// + while(!OID_DET) + { + L0_oid_Recv64(); + L1_print_rcv("\r\n busy: RD="); + } + TxCmd = Cmd; + L0_oid_SendCmd(TxCmd); + LD_Oid_SCK_LOW(); + delay_us(10); + #define D_oid_waitrcv_delay 100000 + while(OID_DET) + { + /// L1_oid_RecvOptData(); + RxAckCnt ++; + if(RxAckCnt > D_oid_waitrcv_delay) + { + + L0_uart0_sendstr("\r\nno rec"); + L0_uart0_uchex(Cmd); + break; + } + } + + if(RxAckCnt <= D_oid_waitrcv_delay) + { + TxCmd = (uint8_t)L0_oid_RecvAck16(); + TxCmd -= 1; + if(TxCmd == Cmd) + { + + L0_uart0_sendstr("\r\nCmd="); + L0_uart0_uchex(Cmd);L0_uart0_uc('-'); + L0_uart0_uchex(TxCmd); + return 1; + } + } +} + +uint32_t L1_oidReadRegister (uint16_t Data1) +{ + uint8_t i,Ret; + uint32_t uxReturn; + + TransCmd[0] = 0x74; + TransCmd[1] = 3; + TransCmd[2] = Data1 >> 8; + TransCmd[3] = Data1 & 0x00FF; + TransCmd[4] = (TransCmd[1] + TransCmd[2] + TransCmd[3]) & 0xFF; + + for(i=0;i<5;i++) + { + Ret = L1_oid_TransCmd(TransCmd[i]); + if(Ret == 0) + { + return 0x5FFFFFFF; + } + } + + i = 0; + while(1) + { + if(!OID_DET) + { + L0_oid_Recv64(); + + /// uxReturn = RecvData[1]; + uxReturn = ts_oid.rec.d32[1]; + uxReturn &= 0xFFFF; + return uxReturn; + } + + delay_us(100); + i += 1; + if(i >= 20) // check 100ms + { + return 0x2FFFFFFF; + } + } +} + +/****************************************************************************************************** +Function: +Input: +Output: +*******************************************************************************************************/ +uint8_t Write_Register(uint16_t Data1,uint16_t Data2) +{ + uint8_t Ret,i; + uint16_t j; + Ret = 1; + + TransCmd[0] = 0X73; + TransCmd[1] = 0x05; + j = Data1>>8; + TransCmd[2] = (uint8_t)j; + j = Data1; + TransCmd[3] = (uint8_t)j; + j = Data2>>8; + TransCmd[4] = (uint8_t)j; + j = Data2; + TransCmd[5] = (uint8_t)j; + TransCmd[6] = (TransCmd[1] + TransCmd[2] + TransCmd[3] + TransCmd[4] + TransCmd[5]); + + for(i=0;i<7;i++) + { + Ret = L1_oid_TransCmd(TransCmd[i]); + if(Ret == 0) + { + break; + } + } + return Ret; +} + +void L1_print_rcv(char *str) +{ + L0_uart0_sendstr(str); + /******** +// Lc_delay_ms(1); + L0_uart0_ulhex(RecvData[0]); +// Lc_delay_ms(1); + L0_uart0_uc(0x09); + L0_uart0_ulhex(RecvData[1]); + + L0_uart0_uc(0x09); + **********/ + +/// L0_uart0_ulhex(ts_oid.rec.d32[1]);L0_uart0_uc(0x09); + /// + +// L0_uart0_sendArrayHex(ts_oid.rec.d,8); + ///L2_oid_ParseF1(); + +} +/****************************************************************************************************** +Function: +Input: +Output: + +BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 +666655555555554444444444333333333322222222221111111111 +3210987654321098765432109876543210987654321098765432109876543210 +76543210 76543210 76543210 76543210 + 76543210 76543210 76543210 76543210 +BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 + + +U16[0] U16[1] U16[2] U16[3] +111111 111111 111111 111111 +5432109876543210543210987654321054321098765432105432109876543210 +666655555555554444444444333333333322222222221111111111 +3210987654321098765432109876543210987654321098765432109876543210 + +u32[0] u32[1] +3322222222221111111111 3322222222221111111111 +1098765432109876543210987654321010987654321098765432109876543210 +666655555555554444444444333333333322222222221111111111 +3210987654321098765432109876543210987654321098765432109876543210 + +U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45 +U8 Ydec; //小数部分43–36 1111 0010b (Y decimal) +U8 Xdec; //小数部分35–28 0111 0100b (X decimal) +U8 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer) +U8 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer) + +*******************************************************************************************************/ +vU16 Lc_dec_us100(vU16 pint,u8 pdec) +{ + pint *= 100; + if(pdec&0x80)///负数 + { + pdec &= 0x7f; + pint -= 100; + }else + { + + } + pdec *= 100; + pdec /= 128; + pint += (vU16)pdec; + return pint; + +} + +void L2_oid_ParseF1(void) +{ +/// static uint8_t ucLogNum = 0; + uint16_t u16i = 0; + uint32_t u32t[2] = 0; +/// L1_print_rcv("\r\n F1="); + ts_oid.oid_type = ts_oid.rec.d[0]; + if(ts_oid.rec.d[0] == 0x60) + {/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分 + ///组成,整数部分 14bit,小数部分 8bit + G.pen_t = 0; + ts_oid.last_time = s_nos_tick.t_1s; + ts_oid.Xint = ts_oid.rec.d16[3]&0x3fff; + if(ts_oid.Xint < 300)///取决于图片 fixme: cc + { + ts_oid.oid_x = 1; + + u32t[0] = ts_oid.rec.d32[0]; + u32t[1] = ts_oid.rec.d32[1]; + + ts_oid.angle = (vU16)(u32t[0]>>13); //45-32= 13 + ts_oid.angle &= 0x01ff; //53-45+1=8 + ///36-43 + ts_oid.Ydec = (ts_oid.rec.d[2]<<4) | (ts_oid.rec.d[3]>>4); + ///28 35 + ts_oid.Xdec = (ts_oid.rec.d[3]<<4) | (ts_oid.rec.d[4]>>4); +#ifdef docsdfads + C0EC58E5 60 4D 24 23 A0 23 80 57 (12800.4500,142.5156) 105 + C0EC58E5 60 4C E4 54 C0 23 40 5A (12800.5900,141.5391) 103 + C0EC58E5 60 4D 44 B5 A0 23 00 5D (12800.7000,140.5859) 106 + C0EC58E5 60 4D 24 AF 30 22 C0 61 (12800.9000,139.5781) 105 + C0EC58E5 60 4D 24 B1 E0 22 80 64 (12800.2300,138.5859) 105 + + A0 23 80 57 (12800.4500,142.5156) 105 + A0 23 80 57 + C0 23 40 5A + A0 23 00 5D + 30 22 C0 61 + E0 22 80 64 + 1010 0000 0010 0011 1000 0000 0101 0111 + 3322 2222 2222 1111 1111 11 + 1098 7654 3210 9876 5432 1098 7654 3210 + +#endif + u32t[1] >>= 14; + ts_oid.Yint = (vU16)u32t[1]; + ts_oid.Yint &= 0x3fff; + + + +#if 0 + if(ts_oid.Xdec&0x80) + { + ts_oid.x -= 1.0; + } + + + + ts_oid.Xdec&=0x7f; + ts_oid.x = (float)ts_oid.Xdec; + ts_oid.x /= 128.0; + if(ts_oid.Xdec&0x80) + { + ts_oid.x -= 1.0; + } + ts_oid.x += ts_oid.Xint; + + ts_oid.Ydec&=0x7f; + ts_oid.y = (float)ts_oid.Ydec; + ts_oid.y /= 128.0; + if(ts_oid.Ydec&0x80) + { + ts_oid.y -= 1.0; + } + ts_oid.y += ts_oid.Yint; + +#else + ts_oid.X100 = Lc_dec_us100(ts_oid.Xint,ts_oid.Xdec); + ts_oid.Y100 = Lc_dec_us100(ts_oid.Yint,ts_oid.Ydec); + + +#endif + + //数据存储到寄存器 + + printf(" %hd %hd %hd ", + ts_oid.X100,ts_oid.Y100, + ts_oid.angle); + } + else + { + ts_oid.oid_type = 0; + L0_uart0_uc(';'); + } + } + else if(ts_oid.rec.d[0] == 0x40)///手写 + { +//// 普通码(bit61=0) +//// Bit60:码是否有效(1:无效码;0:有效码) +//// Bit59~Bit28:保留 +/// Bit27~Bit0:有效数据 + /// G.oid_p = 1; + ts_oid.oid_p = 1; + ts_oid.gCode = ts_oid.rec.d32[1]&0x0fFFffFF; + +///R.oid3_order = (int)ts_oid.gCode *100; + + + + printf(" %ld %x ",ts_oid.gCode,(int)ts_oid.gCode); + + L0_uart0_ulhex(ts_oid.gCode); + }else + { + ts_oid.oid_type = 0; + L0_uart0_uc(','); + } +} +void L2_oid_status(void) +{ + if(G.oid_x) + { + if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + G.pen_down = 1; + //L0_uart2_sendstr("123"); + } + else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) + { + G.pen_hold = 1; + //L0_uart2_sendstr("456"); + } + } + +} + +uint8_t L1_OID_WakeUp(void) +{ + uint32_t i = 0; + LD_Oid_SCK_LOW(); + delay_ms(2); + LD_Oid_SCK_HIGH(); + delay_ms(30); + LD_Oid_SCK_LOW(); + + L0_uart0_sendstr(" 44 "); + + while(1) + { + delay_ms(10); + i += 1; + if(i >= 400) // 400*5ms = 2s + { + L0_uart0_sendstr(" !!out!! "); + return 0; + } + if(!OID_DET) + { + L0_oid_Recv64(); + L1_print_rcv("\r\n WakeUpOID get="); + if(ts_oid.rec.d[7] == 0xf8) + { + ///use + L0_uart0_sendstr(" ok\r\n"); + return 1;//ucCheckVersionAndInit(eAppDevice); + + } + else + { + L0_uart0_sendstr("\r\nno?? OIDCMD_POWER_ON \r\n"); + return 0; + } + } + } +} + + +/****************************************************************************************************** +Function: +Input: +Output: +*******************************************************************************************************/ +void L0_Oid_Init(void) +{ + LD_Oid_DIO_INIT(); + /****************************************************************************************************** + 5430C2000A/3000A点读应用初始化设置 + 顺序 命令设置 备注 + 1 single command 0x4D 关闭解码 + 2 REG(0xD40) = 0x00 设置仅读OID码,0X00仅读OID3/OID2,0X10仅读OID3S,0X20仅读OID4 + 3 single command 0x36 关闭手写码侦测 + 4 "REG(0x0DAD) = 4250 //设置AE Target + REG(0x0DB1) = 4000 //设置AE LOW + REG(0x0DAF) = 4000 //设置AE LOW + REG(0x0DB0) = 4500 //设置AE HIGH + REG(0x0DAE) = 4500 //设置AE HIGH + + REG(0x1641) = 0xA0 //设置dot filter + REG(0x0D6A) = 0x3F //此项不要改动 + REG(0x0D2C) = 0x3F //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。 + + 设置AE Range和dot filter。 + AE_LOW < AE_Target = 2)&& (G.pen_t == 0)) + { + G.pen_up = 1; + G.pen_t =1; + //L0_uart2_sendstr("789"); + } +/// delay_us(100); +} + + +#if 0 + +step1 +if(!OID_DET) +{ + L0_oid_Recv64(); + +step2 + +L2_oid_ParseF1(); +step 3 + 状态 + + + +///#ifdef doc980808 +验证算法的正确性 +unsigned char s[64]= + { + + 1 , // 0 + 1 , // 1 + 1 , // 2 + 1 , // 3 + 1 , // 4 + 1 , // 5 + 1 , // 6 + 1 , // 7 xxxx + + 1 , // 8 + 1 , // 9 + 1 , // 10 + 1 , // 11 + 1 , // 12 + 1 , // 13 + 1 , // 14 + 1 , // 15 xxxx + + 1 , // 16 + 1 , // 17 + 1 , // 18 + 1 , // 19 + 1 , // 20 + 1 , // 21 + 1 , // 22 + 1 , // 23 xxxx + + 1 , // 24 + 1 , // 25 + 1 , // 26 + 1 , // 27 + 1 , // 28 + 1 , // 29 + 1 , // 30 + 1 , // 31 xxxx + + 1 , // 32 + 1 , // 33 + 1 , // 34 + 1 , // 35 + 1 , // 36 + 1 , // 37 + 1 , // 38 + 1 , // 39 xxxx + + 1 , // 40 + 1 , // 41 + 1 , // 42 + 1 , // 43 + 1 , // 44 + 1 , // 45 + 1 , // 46 + 1 , // 47 xxxx + + 1 , // 48 + 1 , // 49 + 1 , // 50 + 1 , // 51 + 1 , // 52 + 1 , // 53 + 1 , // 54 + 1 , // 55 xxxx + + 1 , // 56 + 1 , // 57 + 1 , // 58 + 1 , // 59 + 1 , // 60 + 1 , // 61 + 1 , // 62 + 1 // 63 xxxx + + }; + int x =0; +int i; + + +void t(void) +{RecvData[0] = 0;RecvData[1] = 0; + for(i = 0; i < 64; i++) + { + + + if(s[63-i]) + { + if(i < 32) + { + RecvData[0] += 1; + } + if(i>=32 && i<64) + { + RecvData[1] += 1; + } + + } + if(i < 31) + { + RecvData[0] <<= 1; + } + if( i >31 && i < 63) + { + RecvData[1] <<= 1; + } + + + } + + for(i = 0; i < 64; i++) + { + ts_oid.d[i/8] <<= 1; + if(s[63-i]) + { + ts_oid.d[i/8] |= 1; + } + else + { + ts_oid.d[i/8] &= 0xfe; + } + } +i =5; + +} + + +#endif + diff --git a/source/bsp/bsp_oid.h b/source/bsp/bsp_oid.h new file mode 100644 index 0000000..61082f8 --- /dev/null +++ b/source/bsp/bsp_oid.h @@ -0,0 +1,183 @@ +#ifndef __OPTICALDATA__ +#define __OPTICALDATA__ + +#include "bsp_config.h" +#include "../app/app_config.h" + +/****************************************************************************************************** + 配置参数 +*******************************************************************************************************/ +#define ROM009_HANDWRITE 0 +#define DATA_FORMAT_2 0 +#define OID_4C 0 +#define DEBOUNCE_FUNC 0 +#define LOG_REGISTER 0 + +#if DEBOUNCE_FUNC +#define DEBOUNCE_TIMES 3 // 连续三笔相同,才触发,debounce时,可设置。去抖动时间 +#define DEBOUNCE_RELESE_TIME 20 //5ms * 20 = 100ms,100ms无任何码,认为抬笔。 +#endif +/****************************************************************************************************** + 2-wire GPIO + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 +*******************************************************************************************************/ +#define LD_oid_io_init() LD_Oid_SCK_INIT() +////#define LD_Oid_SCK_INIT() D_stdIO_P3(BITN4); + +#define LD_Oid_SCK_LOW() D_P34_OFF(); +#define LD_Oid_SCK_HIGH() D_P34_ON(); + +#define LD_Oid_SCK_INIT(); D_HighI_P3(BITN4);LD_Oid_SCK_LOW(); + + +#define LD_Oid_SDIO_INIT() D_HighR_P5(BITN0) +#define LD_Oid_SDIO_LOW() D_P50_OFF() +#define LD_Oid_SDIO_HIGH() D_P50_ON() +#define LD_Oid_SDIO_IN() D_HighR_P5(BITN0)//高阻输入 +#define LD_Oid_SDIO_OUT() D_HighI_P5(BITN0)//推挽输出 + +#define LD_Oid_SDIO_AT() D_P50_AT() + + +#define LD_Oid_DIO_INIT(); LD_Oid_SCK_INIT();LD_Oid_SDIO_INIT(); + + +#define OID_DET P50 + +/****************************************************************************************************** + OID命令 +*******************************************************************************************************/ + + +////20211229依据53xx和54xx系列操作 +#define USERCMD_20FPS 0x24 +#define USERCMD_30FPS 0x25 +#define USERCMD_40FPS 0x26 +#define USERCMD_50FPS 0x27 +#define USERCMD_80FPS 0x3C +#define USERCMD_80FPS_EXIT 0x3B +#define USERCMD_DECODE_SHUT 0x4D +#define USERCMD_LIANCHUAN 0x40 +#define USERCMD_SUSPEND 0x57 +#define USERCMD_EN_ANGLE 0x10 +#define USERCMD_EN_POSITION 0x35 +#define USERCMD_SW_POSITION 0x43 +#define USERCMD_DATA_FORMAT_2 0x2C +#define USERCMD_LOU_GUANG 0xD7 +#define USERCMD_POWER_DOWN 0x56 + + + +#define OIDCMD_POWER_ON 0x0000FFF8 +#define OIDCMD_POWER_OFF 0x0000FFF7 +/****************************************************************************************************** + OID版本 +*******************************************************************************************************/ +#define OID_VER_D 0x1169 +#define OID_VER_REG 0x1670 +#define OID_VER_F 0x1168 +#define REG_READOID_SET 0xD40 +#define REG_EN_DECODE 0xD63 +#define REG_ROM008 0xDA5 +#define REG_ROM009 0xDA6 +#define ROM_009 0x09 +#define ROM_008 0x00 +/****************************************************************************************************** + Dataformat 2定义 +*******************************************************************************************************/ +#define CHECK_INVALID_DF2 0x40000000 +#define CHECK_OID_VERSION_DF2 0xFC000000 +#define OID_2_GENERAL_DF2 0x00000000 +#define OID_3_GENERAL_DF2 0x08000000 +#define OID_3_POSITION_DF2 0x04000000 +#define OID_3S_GENERAL_DF2 0x10000000 +#define OID_3S_POSITION_DF2 0x0C000000 +#define OID_35_GENERAL_DF2 0x14000000 +#define OID_4_GENERAL_DF2 0x1C000000 +#define OID_4_POSITION_DF2 0x18000000 +#define OID_4C_POSITION_DF2 0x20000000 +/****************************************************************************************************** + 函数声明 +*******************************************************************************************************/ +typedef enum +{ + eHandWrite = 0, + ePointRead_2000A = 1, + ePointRead_3000A = 2, + ePointRead_LightGuide = 3, + eCar_LightGuide = 4, +}AppDevice; +extern AppDevice eAppDevice; +/***************** + +void OidTaskLoop(void); +uint8_t L1_oid_TransCmd(uint8_t Cmd); +uint8_t WakeUpOID(void); + + +void L1_oid_RecvOptData(void); + +void LogRegister(void); +uint8_t L1_oid_CheckVersionAndInit(AppDevice eAppDevice); + +/*****************************/ +/********************************************************** + Bit Indication +63–60 0110b +59–54 Reserved +53–45 Angle +44 Reserved +43–36 1111 0010b (Y decimal) +35–28 0111 0100b (X decimal) +27–14 00 0000 0000 0100b (Y integer) +13–0 00 0000 0000 0100b (X integer) 变量定义 +******************************************************/ + + + +typedef struct _ts_OID +{//8byte +/// u8 d[8]; + U_U64 rec; + U8 oid_type; //类型63–60 0110b + U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45 + U8 Ydec; //小数部分43–36 1111 0010b (Y decimal) + U8 Xdec; //小数部分35–28 0111 0100b (X decimal) + vU16 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer) + vU16 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer) + + vU16 Y100,X100;///放大100倍的输出 + vU32 gCode; // + + vU32 time; + vU32 last_time; + + vU32 overtime; + + + float x,y;//cut + vU16 pre_x,pre_y;//cut + U8 oid_x; + U8 oid_p; + + +}Ts_OID_; +extern Ts_OID_ ts_oid; +///extern volatile uint32_t RecvData[3]; + +void L0_Oid_Init(void); + +uint8_t L1_oid_TransCmd(uint8_t Cmd); +void L1_print_rcv(char *str); +uint32_t L1_oidReadRegister (uint16_t Data1); +void L1_Oid_readoid(void); +uint8_t L1_OID_WakeUp(void); +void L2_oid_ParseF1(void); +void L0_oid_Recv64(void); + +#endif // __OPTICALDATA__ + diff --git a/source/bsp/chipid.h b/source/bsp/chipid.h index ba48a30..ca448c3 100644 --- a/source/bsp/chipid.h +++ b/source/bsp/chipid.h @@ -26,7 +26,7 @@ ///>>>端口位定义,可修改!!!!!!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #include "../bsp/bsp_config.h" -#include "../msp/uart0.h" +#include "../msp/msp_uart0.h" extern void L0_id_get(U8 *id); extern void L0_id_get_rom(U8 *id); diff --git a/source/bsp/868.c b/source/bsp/nouse/868.c similarity index 100% rename from source/bsp/868.c rename to source/bsp/nouse/868.c diff --git a/source/bsp/868.h b/source/bsp/nouse/868.h similarity index 100% rename from source/bsp/868.h rename to source/bsp/nouse/868.h diff --git a/source/bsp/nouse/bsp_config.h.bak b/source/bsp/nouse/bsp_config.h.bak new file mode 100644 index 0000000..e915041 --- /dev/null +++ b/source/bsp/nouse/bsp_config.h.bak @@ -0,0 +1,240 @@ +//////////////////////////////////////////////////////////////////////////// +///@copyright Copyright (c) 2017, 传控科技 All rights reserved. +///------------------------------------------------------------------------- +/// @file bsp_config.h +/// @brief hard config include +/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE +/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED +/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序 +/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx +///------------------------------------------------------------------------- +/// @version 1.1 +/// @author CC +/// @date 20180308 +/// @note +////////////////////////////////////////////////////////////////////////////// +/// @version 5.1 +/// @author CC +/// @date 20200301 +/// @note +////////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +///存储器中的特殊参数 +///全球唯一ID号 7FF9H~7FFFH BFF9H~BFFFH EFF9H~EFFFH FDF9H~FDFFH 7字节 +///内部1.19V参考信号源 7FF7H~7FF8H BFF7H~BFF8H EFF7H~EFF8H FDF7H~FDF8H 毫伏(高字节在前) +///32K掉电唤醒定时器的频率 7FF5H~7FF6H BFF5H~BFF6H EFF5H~EFF6H FDF5H~FDF6H Hz (高字节在前) +///22.1184MHz的IRC参数(20M频段) 7FF4H BFF4H EFF4H FDF4H - +///24MHz的IRC参数(20M频段) 7FF3H BFF3H EFF3H FDF3H - +///20MHz的IRC参数(20M频段) 7FF2H BFF2H EFF2H FDF2H +///固件版本为7.3.12U +///以及后续版本有效 +///27MHz的IRC参数(35M频段) 7FF1H BFF1H EFF1H FDF1H +///30MHz的IRC参数(35M频段) 7FF0H BFF0H EFF0H FDF0H +///33.1776MHz的IRC参数(35M频段) 7FEFH BFEFH EFEFH FDEFH +///35MHz的IRC参数(35M频段) 7FEEH BFEEH EFEEH FDEEH +///36.864MHz的IRC参数(35M频段) 7FEDH BFEDH EFEDH FDEDH +///保留 7FECH BFECH EFECH FDECH +///保留 7FEBH BFEBH EFEBH FDEBH +///20M频段的VRTRIM参数 7FEAH BFEAH EFEAH FDEAH +///35M频段的VRTRIM参数 7FE9H BFE9H EFE9H FDE9H +////////////////////////////////////////////////////////////////////////// + +#ifndef _BSP_CONFIG_H +#define _BSP_CONFIG_H + +#include +#include "../bsp/bsp_config_const.h" +#include "../clib/type.h" +#include "../clib/bit.h" + + +//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT +#define TYPE_UASER_BOARD TYPE_BOARD_TOUCH_PEN_0B +//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG +#if(TYPE_UASER_BOARD == TYPE_BOARD_TOUCH_PEN_0B) + #include + #include "../cpu/stc_stc8hxx.h" + #include "../cpu/stc_macro.h" + + //基本配置(工作频率、时钟、看门狗、字节序) + #define TYPE_MCU TYPE_MCU_STC_8H + #define TYPE_IDE TYPE_IDE_KEIL + #define D_CPUfamily_type D_CPUfamily_8bits + #define D_sys_MainFre MainFre_22M + #define D_sys_Jiffies TYPE_JIFFIES_10MS + #define D_WDT_STATUS TYPE_WDT_DISABLE //如果配置为enable,请在bsp_config.c中设置wdt溢出时间 + #define D_MCU_ENDIAN TYPE_MCU_BIGENDIAN + #define D_CODE_ENCRYPTION_TYPE TYPE_ENCRYPTION_ENABLE //是否代码加密 + + + #define D_MCU_NAME "STC8H3K64S4" + //存储器特殊参数地址配置 + #define D_MCU_SPEC_PARAM_CHIPID 0xFDF9 + //...其他参数 + + //串口配置 + #define D_uart0_BRT BRT_115200 + #define D_uart0_SBIT SBIT_1 + #define D_PIN_UART0 PIN_UART0_Rxd_30_Txd_31 + #define D_uart2_BRT BRT_115200 + #define D_uart2_SBIT SBIT_1 + #define D_PIN_UART2 PIN_UART2_Rxd_10_Txd_11 //wifi模块 + #define D_uart3_BRT BRT_115200 + #define D_PIN_UART3 PIN_UART3_Rxd_43_Txd_44 //声音模块 + #define D_uart4_BRT BRT_115200 + + //485配置 + #define D_UART0_485_TYPE TYPE_485_NONE //UART0启用485 + #define D_UART0_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息 + #define D_UART0_485_SLAVER_ID 0x01 //板卡作为485从机 slaverId + #define D_UART0_485_TX() P32 = 1; + #define D_UART0_485_RX() P32 = 0; + #define D_UART2_485_TYPE TYPE_485_NONE //UART2不启用485 + #define D_UART3_485_TYPE TYPE_485_NONE //UART2不启用485 + #define D_UART4_485_TYPE TYPE_485_NONE //UART2不启用485 + + //MODBUS协议配置 + #define D_MODBUS_ENABLE //MODBS启用开关,如果不使用modbus,可以注释掉本行 + #define D_MODBUS_SPLIT_ENTRY L1_modbus_split //modbus切割函数,在tpc_modbus.c中实现,依据实际情况修改 + #define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应 + + //外设定义 + + #define LED1 P27 //D4 + #define LED2 P26 //D4 + #define LED3 P2 //D4 + #define LED4 P55 //D4 + //笔头 + #define SCK P34 + #define SDIO P50 + //按键 + #define key1 P32 + #define key2 P33 + #define key3 P40 + //EEP存储地址定义 + #define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes + #define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等 + #define D_EEP_SECTOR_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + #define D_EEP_BLOCK_FILTER0 0xAA //扇区中每个数据块的Filter字段值 + #define D_EEP_BLOCK_FILTER1 0x55 + //EEP User Defined 参数区存储配置 + #define D_EEP_PARAM_IN_SECTOR 1 //eeprom参数区扇区地址,从0开始 + #define D_EEP_PARAM_IN_BLOCK 0 //eeprom参数区数据块地址,从0开始 + //#define D_EEP_PARAM_BLOCK_SIZE (D_EEP_SECTOR_BLOCK_SIZE) //参数区每个块大小,必须:D_EEP_PARAM_BLOCK_SIZE<=D_EEP_SECTOR_BLOCK_SIZE!!!,因为eeprom.h中是按照D_EEP_SECTOR_BLOCK_SIZE分配的buf + //#define D_EEP_PARAM_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量 + //EEP 加密区存储配置 + #if(D_CODE_ENCRYPTION_TYPE == TYPE_ENCRYPTION_ENABLE) + #define D_EEP_ENC_IN_SECTOR 0 //eeprom加密区扇区地址,从0开始 + #define D_EEP_ENC_IN_BLOCK 0 //eeprom加密区数据块地址,从0开始 + //#define D_EEP_ENC_BLOCK_SIZE 0x20 //ENC_BLOCK_SIZE必须与加密程序中的ENC_BLOCK_SIZE匹配,此处不建议修改,如需修改,请同时修改加密程序 + #endif +#elif + xxx +#endif +//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config +#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) +#define D_SERVE_INT0 interrupt 0 +#define D_SERVE_TIMER0 interrupt 1 +#define D_SERVE_INT1 interrupt 2 +#define D_SERVE_TIMER1 interrupt 3 +#define D_SERVE_UART interrupt 4 +#define D_SERVE_ADC interrupt 5 +#define D_SERVE_LVD interrupt 6 +#define D_SERVE_PCA interrupt 7 +#define D_SERVE_UART2 interrupt 8 +#define D_SERVE_SPI interrupt 9 +#define D_SERVE_INT2 interrupt 10 +#define D_SERVE_INT3 interrupt 11 +#define D_SERVE_TIMER2 interrupt 12 +#define D_SERVE_INT4 interrupt 16 +#define D_SERVE_UART3 interrupt 17 +#define D_SERVE_UART4 interrupt 18 +#define D_SERVE_TIMER3 interrupt 19 +#define D_SERVE_TIMER4 interrupt 20 +#define D_SERVE_CMP interrupt 21 +#define D_SERVE_PWM interrupt 22 +#define D_SERVE_PWMFD interrupt 23 +#define D_SERVE_I2C interrupt 24 +#endif +//STEP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cdelay CONFIG +#if(MainFre_5M == D_sys_MainFre) +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#elif(MainFre_22M == D_sys_MainFre) +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#elif(MainFre_27M == D_sys_MainFre) +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#else ///MainFre_11M +#define D_Cdelay_200us 20 +#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令 +#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us +#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us + //xx +#endif//D_sys_MainFre) +//STEP 4 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +#include "../clib/type.h" +#include "../clib/bit.h" + +//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE +#define TYPE_BOARD_hhnew 1 +#define TYPE_BOARD_st_sleep04_01 4 +#define TYPE_BOARD_st_sleep03 5 +#define TYPE_BOARD_SMMM_MB_VH032_0E 6 +#define TYPE_BOARD_LPC17xx_ 8 +#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036 +#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551 +#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7 +#define TYPE_BOARD_TI26_MT01_M178 0x178 //会议计时器版v TI26_MT01-M178 +#define TYPE_BOARD_stc5as32_WIFIBV01 532 +#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32 +#define TYPE_BOARD_PAPER6133_M0A6 0xa6 //打印机纸张传感 +#define TYPE_BOARD_GSM_MAIN_V07 0xa7 //打印机运维板 +#define TYPE_BOARD_ADDA_MAIN_V02 0xa8 //ADDA +#define TYPE_BOARD_433_0A 0xa9 //433 +#define TYPE_BOARD_WEIGH_0B 0xaa //称重 +#define TYPE_BOARD_TOUCH_PEN_0B 0xab //点读笔 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>MCU TYPE +#define TYPE_MCU_VENDOR_MSK 0xF0 +#define TYPE_MCU_VENDOR_STC 0x10 +#define TYPE_MCU_STC_8A 0x11 +#define TYPE_MCU_STC_8F 0x12 +#define TYPE_MCU_STC_8G 0x13 +#define TYPE_MCU_STC_8H 0x14 + +#define TYPE_MCU_VENDOR_TI 0x60 +#define TYPE_MCU_SHC6601 0x66 +#define TYPE_MCU_LPC17xx 0x67 +#define TYPE_MCU_STM32 0x68 + +#define D_CPUfamily_8bits 8 +#define D_CPUfamily_16bits 16 +#define D_CPUfamily_32bits 32 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>IDE TYPE +#define TYPE_IDE_KEIL 1 +#define TYPE_IDE_MDK 2 +#define TYPE_IDE_IAR 3 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>SysTimer TYPE +#define TYPE_JIFFIES_5MS 5 +#define TYPE_JIFFIES_10MS 10 +#define TYPE_JIFFIES_25MS 25 +//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>.WDT TYPE +#define TYPE_WDT_DISABLE 1 +#define TYPE_WDT_ENABLE 2 +//#define WDT_FEED() WDT_CONTR |= 0x10 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.SysTimer TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>.ByteOrder TYPE +#define TYPE_MCU_BIGENDIAN 1 //大端字节序 +#define TYPE_MCU_LITENDIAN 2 //小端字节序 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>.代码加密 TYPE +#define TYPE_ENCRYPTION_ENABLE 1 //代码加密 +#define TYPE_ENCRYPTION_DISABLE 2 //代码不加密 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end + +//>>>>>>>>>>>>>>>>>>>>>>BUADRATE & StopBit +#define SBIT_1 1 //1 stop bit +#define SBIT_2 2 //2 stop bit +#define BRT_115200 115200 +#define BRT_19200 19200 +#define BRT_9600 9600 +#define BRT_4800 4800 +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>MainFre +#define MainFre_5M 5529600L +#define MainFre_11M 11059200L +#define MainFre_22M 22118400L +#define MainFre_24M 24000000L +#define MainFre_27M 27000000L +//<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>UART0 PIN +#define PIN_UART0_Rxd_30_Txd_31 1 +#define PIN_UART0_Rxd_36_Txd_37 2 +#define PIN_UART0_Rxd_16_Txd_17 3 +#define PIN_UART0_Rxd_43_Txd_44 4 +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART0 PIN +//>>>>>>>>>>>>>>>>>>>>>>UART2 PIN +#define PIN_UART2_Rxd_10_Txd_11 5 + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART2 PIN + +//>>>>>>>>>>>>>>>>>>>>>>485 Type +#define TYPE_485_NONE 0 +#define TYPE_485_MASTER 1 +#define TYPE_485_SLAVER 2 +//<<<<<<<<<<<<<<<<<<<<<<485 Type end + +//>>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE +#define TYPE_ASENSOR_ADXL362 362 +#define TYPE_ASENSOR_MSA300 300 +#define TYPE_ASENSOR TYPE_ASENSOR_MSA300 +//<<<<<<<<<<<<<<<<<<<<<=0; i--) + { + sum += t * getIndexOfSigns(*(source + i)); + t *= 16; + } + + return sum; +} +int getIndexOfSigns(char ch) +{ + if(ch >= '0' && ch <= '9') + { + return ch - '0'; + } + if(ch >= 'A' && ch <='F') + { + return ch - 'A' + 10; + } + if(ch >= 'a' && ch <= 'f') + { + return ch - 'a' + 10; + } + return -1; +} ///// 0 1 (1-0)+1 //// 把buf中的数据从[usStart]到[usEnd] 共 usEnd-usStart+1 的数据转换成ascii /// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' -void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii) +void Lc_hex2ascii(U8 *buf,U8 *ascii,U16 len) { vU16 t = 0,m = 0; for(t = 0;t < len;t ++) @@ -414,6 +446,15 @@ int Lc_memset(U8 *buf,U8 c,U16 len) } return 0; } +void Lc_memset8bits (void *s,unsigned char c,unsigned char n) +{ + const unsigned char uc = c; + unsigned char *su; + for(su = s;0 < n;++su,--n) + *su = uc; + } + + #if 0 diff --git a/source/clib/clib.h b/source/clib/clib.h index 41bc041..add9a20 100644 --- a/source/clib/clib.h +++ b/source/clib/clib.h @@ -30,6 +30,9 @@ typedef struct extern U8 Lc_Hex2Char(U8 CharStr); extern int Lc_strlen(const char *str); extern U8* Lc_strcpy(U8* dst,const char* str); +extern long hexToDec(const char *source); +extern int getIndexOfSigns(char ch); + //extern void Lc_int2str(U32 ui_in,UN_TYPE len,UN_TYPE point,char *d); // input: 123456d // output: '1' '2' '3'.... @@ -97,7 +100,7 @@ extern vS32 Lc_S32_media(vS32 val[],S16 num); extern void Lc_array_sort(S32 arr[],int n); /// 0x11 0x22 ---> 0x31 0x31 0x32 0x32 '1' '1' '2' '2' -extern void Lc_hex2ascii(U8 *buf,U16 len,U8 *ascii); +extern void Lc_hex2ascii(U8 *buf,U8 *ascii,U16 len); extern void crc16(unsigned char *CRC,void *dat,unsigned int len) /*reentrant*/; extern void crc16_irq(unsigned char *CRC,void *dat,unsigned int len); extern int isBigEndianOrder(void); @@ -115,6 +118,8 @@ extern int Lc_memset(U8 *buf,U8 c,U16 len); extern void Lc_buf_copy_uc(U8 *dst,U8 *src,U16 len); extern U8 Lc_strStartsWith(U8 *s1,U8 *s2); +void Lc_memset8bits (void *s,unsigned char c,unsigned char n); + #endif /* end __UART_H */ /***************************************************************************** diff --git a/source/clib/type.h b/source/clib/type.h index 439b662..2db1efd 100644 --- a/source/clib/type.h +++ b/source/clib/type.h @@ -1,23 +1,34 @@ ////////////////////////////////////////////////////////////////////////// /// COPYRIGHT NOTICE -/// Copyright (c) 2020, ؿƼ +/// Copyright (c) 2020, 传控科技 /// All rights reserved. /// /// @file main.c /// @brief main app /// -///ļʵֵĹܵ +///(本文件实现的功能的详述) /// /// @version 1.1 CCsens technology /// @author CC /// @date 20150102 /// /// -/// ޶˵汾 +/// 修订说明:最初版本 /// Modified by: cc /// Modified date: 20200531 /// Version: /// Descriptions: add u8 +/// Modified by: cc +/// Modified date: 20211222 +/// Version: +/// Descriptions: add uint32_t +#if 0 +abs(x) +{ + y = x<<31; +  return(x^y)-y;//也可写作 (x+y)^y +} +#endif ////////////////////////////////////////////////////////////////////////// @@ -82,7 +93,7 @@ #endif /********************************************************************************************************* - ޹ص + 定义与编译器无关的数据类型 *********************************************************************************************************/ typedef unsigned char U8; @@ -91,7 +102,7 @@ typedef volatile U8 vU8; -typedef U8 BOOLEAN; /* */ +typedef U8 BOOLEAN; /* 布尔变量 */ typedef U8 *PU8; typedef U8 BYTE; typedef signed char S8; @@ -104,52 +115,61 @@ typedef signed char *PS8; //#define code typedef unsigned short u16; -typedef unsigned short U16; /* ޷16λͱ */ -typedef volatile U16 vU16; /* ޷16λͱ */ +typedef unsigned short U16; /* 无符号16位整型变量 */ +typedef volatile U16 vU16; /* 无符号16位整型变量 */ typedef signed short S16; -typedef volatile S16 vS16; /* з16λͱ */ +typedef volatile S16 vS16; /* 有符号16位整型变量 */ typedef signed long S32; -typedef unsigned long U32; /* ޷32λͱ */ -typedef volatile U32 vU32; /* з32λͱ */ +typedef unsigned long U32; /* 无符号32位整型变量 */ +typedef volatile U32 vU32; /* 有符号32位整型变量 */ typedef volatile signed long vS32; -typedef float FP32; /* ȸ32λȣ */ -typedef double FP64; /* ˫ȸ64λȣ */ +typedef float FP32; /* 单精度浮点数(32位长度) */ +typedef double FP64; /* 双精度浮点数(64位长度) */ -//typedef unsigned char BOOLEAN; // -typedef unsigned char INT8U; // ޷8λͱ -typedef signed char INT8S; // з8λͱ -typedef unsigned short INT16U; // ޷16λͱ -typedef signed short INT16S; // з16λͱ -typedef unsigned long INT32U; // ޷32λͱ +//typedef unsigned char BOOLEAN; // 布尔变量 +typedef unsigned char INT8U; // 无符号8位整型变量 +typedef signed char INT8S; // 有符号8位整型变量 +typedef unsigned short INT16U; // 无符号16位整型变量 +typedef signed short INT16S; // 有符号16位整型变量 +typedef unsigned long INT32U; // 无符号32位整型变量 +typedef unsigned char uint8_t; +typedef unsigned long uint32_t;////51 +///typedef unsigned long long uint64_t;////51 -typedef signed long INT32S; // з32λͱ -//typedef float FP32; // ȸ32λȣ -//typedef double FP64; // ˫ȸ64λȣ +///typedef volatile uint64_t vU64; -typedef unsigned int FLAG_P; // ׼ -//typedef unsigned char INTU; // ׼8BIT MCU -typedef unsigned int INTU; // ׼32BIT MCU +typedef unsigned short uint16_t; ///// + +typedef signed long INT32S; // 有符号32位整型变量 +//typedef float FP32; // 单精度浮点数(32位长度) +//typedef double FP64; // 双精度浮点数(64位长度) + +typedef unsigned int FLAG_P; // 标准类变量 +//typedef unsigned char INTU; // 标准类变量8BIT MCU +typedef unsigned int INTU; // 标准类变量32BIT MCU /****************** **************************/ +////for TTSS 2022011 cc +typedef vU32 TtimeStamp; /********************************************************************************************************* - ֵ + 返回值定义 *********************************************************************************************************/ -#define ZY_OK 0 /* ɹ */ -#define ZY_NOT_OK 1 /* ʧ */ -#define ZY_PARAMETER_ERR 2 /* */ -#define ZY_NO_FIND_FUNCTION 6 /* ûзָ */ -#define ZY_NO_MEMORY 12 /* ڴ治 */ -#define ZY_TIME_OUT 13 /* ʱ */ -#define ZY_NO_FIND_OBJECT 16 /* ûзֶ */ +#define ZY_OK 0 /* 操作成功 */ +#define ZY_NOT_OK 1 /* 操作失败 */ +#define ZY_PARAMETER_ERR 2 /* 参数错误 */ +#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */ +#define ZY_NO_MEMORY 12 /* 内存不足 */ +#define ZY_TIME_OUT 13 /* 超时 */ +#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */ /********************************************************************************************************* - realViewҪӵͷļ + realView编译器需要添加的头文件 *********************************************************************************************************/ #include #include @@ -166,6 +186,20 @@ typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; typedef U8 UN_TYPE; typedef U8 vtype; +/// >>>>>>>>>>>>>>>>>>>cc: sd znfat +#define UINT8 unsigned char +#define UINT16 unsigned int +#define UINT32 unsigned long + +#define INT8 char +#define INT16 int +#define INT32 long + +#define ROM_TYPE_UINT8 unsigned char code +#define ROM_TYPE_UINT16 unsigned int code +#define ROM_TYPE_UINT32 unsigned long code + +///<<<<<<<<<<<<<<<<<<<<<>4) #define D_uc_low(ww) ((ww)&0x0f) diff --git a/source/clib/type.h.bak b/source/clib/type.h.bak new file mode 100644 index 0000000..af6bfec --- /dev/null +++ b/source/clib/type.h.bak @@ -0,0 +1,355 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2020, 传控科技 +/// All rights reserved. +/// +/// @file main.c +/// @brief main app +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20150102 +/// +/// +/// 修订说明:最初版本 +/// Modified by: cc +/// Modified date: 20200531 +/// Version: +/// Descriptions: add u8 +/// Modified by: cc +/// Modified date: 20211222 +/// Version: +/// Descriptions: add uint32_t +#if 0 +abs(x) +{ + y = x<<31; +  return(x^y)-y;//也可写作 (x+y)^y +} +#endif +////////////////////////////////////////////////////////////////////////// + + +//#include + +#ifndef __TYPE_H__ +#define __TYPE_H__ + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef D_stop +#define D_stop (1) +#endif + +#ifndef D_run +#define D_run (0) +#endif + +#ifndef D_ready +#define D_ready (1) +#endif + +#ifndef D_ready2 +#define D_ready2 (2) +#endif + + +#ifndef D_max +#define D_max (3) +#endif + + + +#ifndef D_diff +#define D_diff (4) +#endif + +#ifndef D_set +#define D_set (1) +#endif + + + +#ifndef D_clear +#define D_clear (0) +#endif +#define D_ON 1 +#define D_OFF 0 + +#define D_sleep_wakeup 3 +#define D_sleep 1 +#define D_wakeup 0 + +#ifndef TRUE +#define TRUE (1) +#endif + +/********************************************************************************************************* + 定义与编译器无关的数据类型 +*********************************************************************************************************/ + +typedef unsigned char U8; +typedef unsigned char u8; +typedef volatile U8 vU8; + + + +typedef U8 BOOLEAN; /* 布尔变量 */ +typedef U8 *PU8; +typedef U8 BYTE; +typedef signed char S8; +typedef volatile signed char vS8; +typedef signed char *PS8; + + + +#define bit char +//#define code + +typedef unsigned short u16; +typedef unsigned short U16; /* 无符号16位整型变量 */ +typedef volatile U16 vU16; /* 无符号16位整型变量 */ +typedef signed short S16; +typedef volatile S16 vS16; /* 有符号16位整型变量 */ + +typedef signed long S32; +typedef unsigned long U32; /* 无符号32位整型变量 */ +typedef volatile U32 vU32; /* 有符号32位整型变量 */ +typedef volatile signed long vS32; + +typedef float FP32; /* 单精度浮点数(32位长度) */ +typedef double FP64; /* 双精度浮点数(64位长度) */ + + +//typedef unsigned char BOOLEAN; // 布尔变量 +typedef unsigned char INT8U; // 无符号8位整型变量 +typedef signed char INT8S; // 有符号8位整型变量 +typedef unsigned short INT16U; // 无符号16位整型变量 +typedef signed short INT16S; // 有符号16位整型变量 +typedef unsigned long INT32U; // 无符号32位整型变量 + +typedef signed long INT32S; // 有符号32位整型变量 +//typedef float FP32; // 单精度浮点数(32位长度) +//typedef double FP64; // 双精度浮点数(64位长度) + +typedef unsigned int FLAG_P; // 标准类变量 +//typedef unsigned char INTU; // 标准类变量8BIT MCU +typedef unsigned int INTU; // 标准类变量32BIT MCU +/****************** +**************************/ + + + +/********************************************************************************************************* + 返回值定义 +*********************************************************************************************************/ +#define ZY_OK 0 /* 操作成功 */ +#define ZY_NOT_OK 1 /* 操作失败 */ +#define ZY_PARAMETER_ERR 2 /* 参数错误 */ +#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */ +#define ZY_NO_MEMORY 12 /* 内存不足 */ +#define ZY_TIME_OUT 13 /* 超时 */ +#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */ + +/********************************************************************************************************* + realView编译器需要添加的头文件 +*********************************************************************************************************/ +#include +#include +#include +//#include +#define D_flag_lock 2 +#define D_flag_clear 0 +#define D_flag_CanUse 1 + + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; + +typedef U8 UN_TYPE; +typedef U8 vtype; + +/// >>>>>>>>>>>>>>>>>>>cc: sd znfat +#define UINT8 unsigned char +#define UINT16 unsigned int +#define UINT32 unsigned long + +#define INT8 char +#define INT16 int +#define INT32 long + +#define ROM_TYPE_UINT8 unsigned char code +#define ROM_TYPE_UINT16 unsigned int code +#define ROM_TYPE_UINT32 unsigned long code + +///<<<<<<<<<<<<<<<<<<<<<>>>> + + +typedef union +{ + vU32 ui; + vU16 s[2]; + vU8 d[4]; +}tu_ui4uc; + +typedef union +{ + vU16 word; + struct + { + vU8 h; + vU8 l; + }BYTE2; +}U_U16; + +typedef union +{ + vU32 dWord; + ///High 0123 Low + struct + { + vU8 byte0; + vU8 byte1; + vU8 byte2; + vU8 byte3; + }BYTE4; +}U_U32; +typedef union +{ + vU32 d32[2]; + + vU16 d16[4]; + + vU8 d[8]; +}U_U64; + + +typedef union +{ + vU16 us; + vU8 uc[2]; + struct + { + vU8 H; + vU8 L; + }BYTE2; +}U_F16; +/********** +k.us = 0x1234 +uc + [0]=0x12 + [1]=0x34 +byte2 + H=0x12 + L=0x34 + +**********/ + + + +typedef union +{ + float fl; + vU8 uc[4]; + +}U_F32; + +typedef struct +{ + vU8 *buffer; + vU8 wpt; + vU8 rpt; + vU8 cnt; +}byte_len_fifo_struct; + +typedef struct +{ + vU16 *buffer; + vU16 wpt; + vU16 rpt; + vU16 cnt; +}word_len_fifo_struct; + +typedef struct +{ + vU16 x; + vU16 y; +}point_struct; + + +typedef struct +{ + vU16 x; + vU16 y; + vU16 width; + vU16 height; +}rect_struct; + + +#define HIGHT 1 +#define LOW 0 +#if 0 +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#endif +#ifndef ABS +#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) +#endif + + +#define F_FINSIH 1 +#define F_WORKING 0 +#define F_WAITINGKEY 2 + + +#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); +//if step > 1 bug warning!! +#define DF_var_down(v,step,min,init) \ +if((v) < ((min) + (step))) \ +{ \ + (v) = (init); \ +}else \ +{ \ + (v) -= (step); \ +} + +#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) +#define D_us2uc_L(x) (U8)(0x00ff&(x)) + + +#define D_2uc2_us(H,L) ((((U16)H)<<8)|((U16)L)) + +#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) +#define D_uc_high(ww) ((ww)>>4) +#define D_uc_low(ww) ((ww)&0x0f) + +#define L0_type_byte(x) ((U8 *) &(x)) + + +//#define _nop_ __NOP +// #define _nop_ + + +extern void L3_us_big(U16 *d); +extern void L3_ui_big(vU32 *d); +#endif /* __TYPE_H__ */ diff --git a/source/cpu/STC_stc8h3k.H b/source/cpu/STC_stc8h3k.H new file mode 100644 index 0000000..41d5dee --- /dev/null +++ b/source/cpu/STC_stc8h3k.H @@ -0,0 +1,1394 @@ +#ifndef __STC_stc8h3k_H_ +#define __STC_stc8h3k_H_ +// STC_stc8a8k.h +#include + +#if 0 + +///////////////////////////////////////////////// +正在检测目标单片机 ... + 单片机型号: STC8H3K64S4 + 固件版本号: 7.4.1U + +当前芯片的硬件选项为: + . 系统ISP工作频率: 23.801MHz + . 内部IRC振荡器的频率: 22.123MHz + . 掉电唤醒定时器的频率: 35.400KHz + . 振荡器放大增益使能 + . P3.2和P3.3与下次下载无关 + . 上电复位时增加额外的复位延时 + . 复位引脚用作普通I/O口 + . 检测到低压时复位 + . 低压检测门槛电压 : 2.00 V + . 上电复位时,硬件不启动内部看门狗 + . 上电自动启动内部看门狗时的预分频数为 : 256 + . 空闲状态时看门狗定时器停止计数 + . 启动看门狗后,软件可以修改分频数,但不能关闭看门狗 + . 下次下载用户程序时,将用户EEPROM区一并擦除 + . 下次下载用户程序时,没有相关的端口控制485 + . 下次下载时不需要校验下载口令 + . 内部参考电压: 1185 mV (参考范围: 1100~1300mV) + . 内部安排测试时间: 2021年8月16日 + + 单片机型号: STC8H3K64S4 + 固件版本号: 7.4.1U + + +操作成功 !(2021-12-25 21:35:51) + + +///////////////////////////////////////////////// + +#endif +///////////////////////////////////////////////// + +///////////////////////////////////////////////// + +//包含本头文件后,不用另外再包含"REG51.H" + +sfr P0 = 0x80; +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr SP = 0x81; +sfr DPL = 0x82; +sfr DPH = 0x83; +sfr S4CON = 0x84; +sfr S4BUF = 0x85; +sfr PCON = 0x87; +sfr TCON = 0x88; +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; +sfr TL0 = 0x8a; +sfr TL1 = 0x8b; +sfr TH0 = 0x8c; +sfr TH1 = 0x8d; +sfr AUXR = 0x8e; +sfr INTCLKO = 0x8f; +sfr P1 = 0x90; +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P1M1 = 0x91; +sfr P1M0 = 0x92; +sfr P0M1 = 0x93; +sfr P0M0 = 0x94; +sfr P2M1 = 0x95; +sfr P2M0 = 0x96; +sfr SCON = 0x98; +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +sfr SBUF = 0x99; +sfr S2CON = 0x9a; +sfr S2BUF = 0x9b; +sfr IRCBAND = 0x9d; +sfr LIRTRIM = 0x9e; +sfr IRTRIM = 0x9f; +sfr P2 = 0xa0; +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P_SW1 = 0xa2; +sfr IE = 0xa8; +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr SADDR = 0xa9; +sfr WKTCL = 0xaa; +sfr WKTCH = 0xab; +sfr S3CON = 0xac; +sfr S3BUF = 0xad; +sfr TA = 0xae; +sfr IE2 = 0xaf; +sfr P3 = 0xb0; +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P3M1 = 0xb1; +sfr P3M0 = 0xb2; +sfr P4M1 = 0xb3; +sfr P4M0 = 0xb4; +sfr IP2 = 0xb5; +sfr IP2H = 0xb6; +sfr IPH = 0xb7; +sfr IP = 0xb8; +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +sfr SADEN = 0xb9; +sfr P_SW2 = 0xba; +sfr ADC_CONTR = 0xbc; +sfr ADC_RES = 0xbd; +sfr ADC_RESL = 0xbe; +sfr P4 = 0xc0; +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr WDT_CONTR = 0xc1; +sfr IAP_DATA = 0xc2; +sfr IAP_ADDRH = 0xc3; +sfr IAP_ADDRL = 0xc4; +sfr IAP_CMD = 0xc5; +sfr IAP_TRIG = 0xc6; +sfr IAP_CONTR = 0xc7; +sfr P5 = 0xc8; +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P5M1 = 0xc9; +sfr P5M0 = 0xca; +sfr P6M1 = 0xcb; +sfr P6M0 = 0xcc; +sfr SPSTAT = 0xcd; +sfr SPCTL = 0xce; +sfr SPDAT = 0xcf; +sfr PSW = 0xd0; +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit F1 = PSW^1; +sbit P = PSW^0; +sfr T4T3M = 0xd1; +sfr T4H = 0xd2; +sfr T4L = 0xd3; +sfr T3H = 0xd4; +sfr T3L = 0xd5; +sfr T2H = 0xd6; +sfr T2L = 0xd7; +sfr USBCLK = 0xdc; +sfr ADCCFG = 0xde; +sfr IP3 = 0xdf; +sfr ACC = 0xe0; +sfr P7M1 = 0xe1; +sfr P7M0 = 0xe2; +sfr DPS = 0xe3; +sfr DPL1 = 0xe4; +sfr DPH1 = 0xe5; +sfr CMPCR1 = 0xe6; +sfr CMPCR2 = 0xe7; +sfr P6 = 0xe8; +sfr USBDAT = 0xec; +sfr IP3H = 0xee; +sfr AUXINTIF = 0xef; +sfr B = 0xf0; +sfr USBCON = 0xf4; +sfr IAP_TPS = 0xf5; +sfr P7 = 0xf8; +sfr USBADR = 0xfc; +sfr RSTCFG = 0xff; + +//如下特殊功能寄存器位于扩展RAM区域 +//访问这些寄存器,需先将P_SW2的BIT7设置为1,才可正常读写 + +///////////////////////////////////////////////// +//FF00H-FFFFH +///////////////////////////////////////////////// + + + +///////////////////////////////////////////////// +//FE00H-FEFFH +///////////////////////////////////////////////// + +#define CKSEL (*(unsigned char volatile xdata *)0xfe00) +#define CLKDIV (*(unsigned char volatile xdata *)0xfe01) +#define HIRCCR (*(unsigned char volatile xdata *)0xfe02) +#define XOSCCR (*(unsigned char volatile xdata *)0xfe03) +#define IRC32KCR (*(unsigned char volatile xdata *)0xfe04) +#define MCLKOCR (*(unsigned char volatile xdata *)0xfe05) +#define IRCDB (*(unsigned char volatile xdata *)0xfe06) +#define X32KCR (*(unsigned char volatile xdata *)0xfe08) + +#define P0PU (*(unsigned char volatile xdata *)0xfe10) +#define P1PU (*(unsigned char volatile xdata *)0xfe11) +#define P2PU (*(unsigned char volatile xdata *)0xfe12) +#define P3PU (*(unsigned char volatile xdata *)0xfe13) +#define P4PU (*(unsigned char volatile xdata *)0xfe14) +#define P5PU (*(unsigned char volatile xdata *)0xfe15) +#define P6PU (*(unsigned char volatile xdata *)0xfe16) +#define P7PU (*(unsigned char volatile xdata *)0xfe17) +#define P0NCS (*(unsigned char volatile xdata *)0xfe18) +#define P1NCS (*(unsigned char volatile xdata *)0xfe19) +#define P2NCS (*(unsigned char volatile xdata *)0xfe1a) +#define P3NCS (*(unsigned char volatile xdata *)0xfe1b) +#define P4NCS (*(unsigned char volatile xdata *)0xfe1c) +#define P5NCS (*(unsigned char volatile xdata *)0xfe1d) +#define P6NCS (*(unsigned char volatile xdata *)0xfe1e) +#define P7NCS (*(unsigned char volatile xdata *)0xfe1f) +#define P0SR (*(unsigned char volatile xdata *)0xfe20) +#define P1SR (*(unsigned char volatile xdata *)0xfe21) +#define P2SR (*(unsigned char volatile xdata *)0xfe22) +#define P3SR (*(unsigned char volatile xdata *)0xfe23) +#define P4SR (*(unsigned char volatile xdata *)0xfe24) +#define P5SR (*(unsigned char volatile xdata *)0xfe25) +#define P6SR (*(unsigned char volatile xdata *)0xfe26) +#define P7SR (*(unsigned char volatile xdata *)0xfe27) +#define P0DR (*(unsigned char volatile xdata *)0xfe28) +#define P1DR (*(unsigned char volatile xdata *)0xfe29) +#define P2DR (*(unsigned char volatile xdata *)0xfe2a) +#define P3DR (*(unsigned char volatile xdata *)0xfe2b) +#define P4DR (*(unsigned char volatile xdata *)0xfe2c) +#define P5DR (*(unsigned char volatile xdata *)0xfe2d) +#define P6DR (*(unsigned char volatile xdata *)0xfe2e) +#define P7DR (*(unsigned char volatile xdata *)0xfe2f) +#define P0IE (*(unsigned char volatile xdata *)0xfe30) +#define P1IE (*(unsigned char volatile xdata *)0xfe31) +#define P2IE (*(unsigned char volatile xdata *)0xfe32) +#define P3IE (*(unsigned char volatile xdata *)0xfe33) +#define P4IE (*(unsigned char volatile xdata *)0xfe34) +#define P5IE (*(unsigned char volatile xdata *)0xfe35) +#define P6IE (*(unsigned char volatile xdata *)0xfe36) +#define P7IE (*(unsigned char volatile xdata *)0xfe37) + +#define RTCCR (*(unsigned char volatile xdata *)0xfe60) +#define RTCCFG (*(unsigned char volatile xdata *)0xfe61) +#define RTCIEN (*(unsigned char volatile xdata *)0xfe62) +#define RTCIF (*(unsigned char volatile xdata *)0xfe63) +#define ALAHOUR (*(unsigned char volatile xdata *)0xfe64) +#define ALAMIN (*(unsigned char volatile xdata *)0xfe65) +#define ALASEC (*(unsigned char volatile xdata *)0xfe66) +#define ALASSEC (*(unsigned char volatile xdata *)0xfe67) +#define INIYEAR (*(unsigned char volatile xdata *)0xfe68) +#define INIMONTH (*(unsigned char volatile xdata *)0xfe69) +#define INIDAY (*(unsigned char volatile xdata *)0xfe6a) +#define INIHOUR (*(unsigned char volatile xdata *)0xfe6b) +#define INIMIN (*(unsigned char volatile xdata *)0xfe6c) +#define INISEC (*(unsigned char volatile xdata *)0xfe6d) +#define INISSEC (*(unsigned char volatile xdata *)0xfe6e) +#define YEAR (*(unsigned char volatile xdata *)0xfe70) +#define MONTH (*(unsigned char volatile xdata *)0xfe71) +#define DAY (*(unsigned char volatile xdata *)0xfe72) +#define HOUR (*(unsigned char volatile xdata *)0xfe73) +#define MINI (*(unsigned char volatile xdata *)0xfe74) +#define SEC (*(unsigned char volatile xdata *)0xfe75) +#define SSEC (*(unsigned char volatile xdata *)0xfe76) + +#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) +#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) +#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) +#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) +#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) +#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) +#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) +#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) +#define I2CMSAUX (*(unsigned char volatile xdata *)0xfe88) +#define TM2PS (*(unsigned char volatile xdata *)0xfea2) +#define TM3PS (*(unsigned char volatile xdata *)0xfea3) +#define TM4PS (*(unsigned char volatile xdata *)0xfea4) +#define ADCTIM (*(unsigned char volatile xdata *)0xfea8) +#define T3T4PIN (*(unsigned char volatile xdata *)0xfeac) + +#define PWM1_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWM1_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWM1_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWM1_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWM2_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWM2_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWM2_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWM2_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWM1_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWM1_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWM1_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWM1_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWM1_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWM1_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWM1_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWM1_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWM1_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWM1_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWM1_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWM1_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWM1_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWM1_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWM1_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWM1_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWM1_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWM1_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWM1_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWM1_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWM1_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWM1_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWM1_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWM1_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWM1_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWM1_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWM1_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWM1_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWM1_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWM1_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWM1_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWM1_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWM1_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWM1_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWM1_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWM1_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWM1_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWM1_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWM1_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWM2_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWM2_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWM2_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWM2_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWM2_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWM2_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWM2_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWM2_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWM2_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWM2_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWM2_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWM2_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWM2_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWM2_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWM2_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWM2_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWM2_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWM2_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWM2_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWM2_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWM2_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWM2_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWM2_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWM2_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWM2_CCR1 (*(unsigned int volatile xdata *)0xfef5) +#define PWM2_CCR1H (*(unsigned char volatile xdata *)0xfef5) +#define PWM2_CCR1L (*(unsigned char volatile xdata *)0xfef6) +#define PWM2_CCR2 (*(unsigned int volatile xdata *)0xfef7) +#define PWM2_CCR2H (*(unsigned char volatile xdata *)0xfef7) +#define PWM2_CCR2L (*(unsigned char volatile xdata *)0xfef8) +#define PWM2_CCR3 (*(unsigned int volatile xdata *)0xfef9) +#define PWM2_CCR3H (*(unsigned char volatile xdata *)0xfef9) +#define PWM2_CCR3L (*(unsigned char volatile xdata *)0xfefa) +#define PWM2_CCR4 (*(unsigned int volatile xdata *)0xfefb) +#define PWM2_CCR4H (*(unsigned char volatile xdata *)0xfefb) +#define PWM2_CCR4L (*(unsigned char volatile xdata *)0xfefc) +#define PWM2_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWM2_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWM2_OISR (*(unsigned char volatile xdata *)0xfeff) + +#define PWMA_ETRPS (*(unsigned char volatile xdata *)0xfeb0) +#define PWMA_ENO (*(unsigned char volatile xdata *)0xfeb1) +#define PWMA_PS (*(unsigned char volatile xdata *)0xfeb2) +#define PWMA_IOAUX (*(unsigned char volatile xdata *)0xfeb3) +#define PWMB_ETRPS (*(unsigned char volatile xdata *)0xfeb4) +#define PWMB_ENO (*(unsigned char volatile xdata *)0xfeb5) +#define PWMB_PS (*(unsigned char volatile xdata *)0xfeb6) +#define PWMB_IOAUX (*(unsigned char volatile xdata *)0xfeb7) +#define PWMA_CR1 (*(unsigned char volatile xdata *)0xfec0) +#define PWMA_CR2 (*(unsigned char volatile xdata *)0xfec1) +#define PWMA_SMCR (*(unsigned char volatile xdata *)0xfec2) +#define PWMA_ETR (*(unsigned char volatile xdata *)0xfec3) +#define PWMA_IER (*(unsigned char volatile xdata *)0xfec4) +#define PWMA_SR1 (*(unsigned char volatile xdata *)0xfec5) +#define PWMA_SR2 (*(unsigned char volatile xdata *)0xfec6) +#define PWMA_EGR (*(unsigned char volatile xdata *)0xfec7) +#define PWMA_CCMR1 (*(unsigned char volatile xdata *)0xfec8) +#define PWMA_CCMR2 (*(unsigned char volatile xdata *)0xfec9) +#define PWMA_CCMR3 (*(unsigned char volatile xdata *)0xfeca) +#define PWMA_CCMR4 (*(unsigned char volatile xdata *)0xfecb) +#define PWMA_CCER1 (*(unsigned char volatile xdata *)0xfecc) +#define PWMA_CCER2 (*(unsigned char volatile xdata *)0xfecd) +#define PWMA_CNTR (*(unsigned int volatile xdata *)0xfece) +#define PWMA_CNTRH (*(unsigned char volatile xdata *)0xfece) +#define PWMA_CNTRL (*(unsigned char volatile xdata *)0xfecf) +#define PWMA_PSCR (*(unsigned int volatile xdata *)0xfed0) +#define PWMA_PSCRH (*(unsigned char volatile xdata *)0xfed0) +#define PWMA_PSCRL (*(unsigned char volatile xdata *)0xfed1) +#define PWMA_ARR (*(unsigned int volatile xdata *)0xfed2) +#define PWMA_ARRH (*(unsigned char volatile xdata *)0xfed2) +#define PWMA_ARRL (*(unsigned char volatile xdata *)0xfed3) +#define PWMA_RCR (*(unsigned char volatile xdata *)0xfed4) +#define PWMA_CCR1 (*(unsigned int volatile xdata *)0xfed5) +#define PWMA_CCR1H (*(unsigned char volatile xdata *)0xfed5) +#define PWMA_CCR1L (*(unsigned char volatile xdata *)0xfed6) +#define PWMA_CCR2 (*(unsigned int volatile xdata *)0xfed7) +#define PWMA_CCR2H (*(unsigned char volatile xdata *)0xfed7) +#define PWMA_CCR2L (*(unsigned char volatile xdata *)0xfed8) +#define PWMA_CCR3 (*(unsigned int volatile xdata *)0xfed9) +#define PWMA_CCR3H (*(unsigned char volatile xdata *)0xfed9) +#define PWMA_CCR3L (*(unsigned char volatile xdata *)0xfeda) +#define PWMA_CCR4 (*(unsigned int volatile xdata *)0xfedb) +#define PWMA_CCR4H (*(unsigned char volatile xdata *)0xfedb) +#define PWMA_CCR4L (*(unsigned char volatile xdata *)0xfedc) +#define PWMA_BKR (*(unsigned char volatile xdata *)0xfedd) +#define PWMA_DTR (*(unsigned char volatile xdata *)0xfede) +#define PWMA_OISR (*(unsigned char volatile xdata *)0xfedf) +#define PWMB_CR1 (*(unsigned char volatile xdata *)0xfee0) +#define PWMB_CR2 (*(unsigned char volatile xdata *)0xfee1) +#define PWMB_SMCR (*(unsigned char volatile xdata *)0xfee2) +#define PWMB_ETR (*(unsigned char volatile xdata *)0xfee3) +#define PWMB_IER (*(unsigned char volatile xdata *)0xfee4) +#define PWMB_SR1 (*(unsigned char volatile xdata *)0xfee5) +#define PWMB_SR2 (*(unsigned char volatile xdata *)0xfee6) +#define PWMB_EGR (*(unsigned char volatile xdata *)0xfee7) +#define PWMB_CCMR1 (*(unsigned char volatile xdata *)0xfee8) +#define PWMB_CCMR2 (*(unsigned char volatile xdata *)0xfee9) +#define PWMB_CCMR3 (*(unsigned char volatile xdata *)0xfeea) +#define PWMB_CCMR4 (*(unsigned char volatile xdata *)0xfeeb) +#define PWMB_CCER1 (*(unsigned char volatile xdata *)0xfeec) +#define PWMB_CCER2 (*(unsigned char volatile xdata *)0xfeed) +#define PWMB_CNTR (*(unsigned int volatile xdata *)0xfeee) +#define PWMB_CNTRH (*(unsigned char volatile xdata *)0xfeee) +#define PWMB_CNTRL (*(unsigned char volatile xdata *)0xfeef) +#define PWMB_PSCR (*(unsigned int volatile xdata *)0xfef0) +#define PWMB_PSCRH (*(unsigned char volatile xdata *)0xfef0) +#define PWMB_PSCRL (*(unsigned char volatile xdata *)0xfef1) +#define PWMB_ARR (*(unsigned int volatile xdata *)0xfef2) +#define PWMB_ARRH (*(unsigned char volatile xdata *)0xfef2) +#define PWMB_ARRL (*(unsigned char volatile xdata *)0xfef3) +#define PWMB_RCR (*(unsigned char volatile xdata *)0xfef4) +#define PWMB_CCR5 (*(unsigned int volatile xdata *)0xfef5) +#define PWMB_CCR5H (*(unsigned char volatile xdata *)0xfef5) +#define PWMB_CCR5L (*(unsigned char volatile xdata *)0xfef6) +#define PWMB_CCR6 (*(unsigned int volatile xdata *)0xfef7) +#define PWMB_CCR6H (*(unsigned char volatile xdata *)0xfef7) +#define PWMB_CCR6L (*(unsigned char volatile xdata *)0xfef8) +#define PWMB_CCR7 (*(unsigned int volatile xdata *)0xfef9) +#define PWMB_CCR7H (*(unsigned char volatile xdata *)0xfef9) +#define PWMB_CCR7L (*(unsigned char volatile xdata *)0xfefa) +#define PWMB_CCR8 (*(unsigned int volatile xdata *)0xfefb) +#define PWMB_CCR8H (*(unsigned char volatile xdata *)0xfefb) +#define PWMB_CCR8L (*(unsigned char volatile xdata *)0xfefc) +#define PWMB_BKR (*(unsigned char volatile xdata *)0xfefd) +#define PWMB_DTR (*(unsigned char volatile xdata *)0xfefe) +#define PWMB_OISR (*(unsigned char volatile xdata *)0xfeff) + +///////////////////////////////////////////////// +//FD00H-FDFFH +///////////////////////////////////////////////// + +#define P0INTE (*(unsigned char volatile xdata *)0xfd00) +#define P1INTE (*(unsigned char volatile xdata *)0xfd01) +#define P2INTE (*(unsigned char volatile xdata *)0xfd02) +#define P3INTE (*(unsigned char volatile xdata *)0xfd03) +#define P4INTE (*(unsigned char volatile xdata *)0xfd04) +#define P5INTE (*(unsigned char volatile xdata *)0xfd05) +#define P6INTE (*(unsigned char volatile xdata *)0xfd06) +#define P7INTE (*(unsigned char volatile xdata *)0xfd07) +#define P0INTF (*(unsigned char volatile xdata *)0xfd10) +#define P1INTF (*(unsigned char volatile xdata *)0xfd11) +#define P2INTF (*(unsigned char volatile xdata *)0xfd12) +#define P3INTF (*(unsigned char volatile xdata *)0xfd13) +#define P4INTF (*(unsigned char volatile xdata *)0xfd14) +#define P5INTF (*(unsigned char volatile xdata *)0xfd15) +#define P6INTF (*(unsigned char volatile xdata *)0xfd16) +#define P7INTF (*(unsigned char volatile xdata *)0xfd17) +#define P0IM0 (*(unsigned char volatile xdata *)0xfd20) +#define P1IM0 (*(unsigned char volatile xdata *)0xfd21) +#define P2IM0 (*(unsigned char volatile xdata *)0xfd22) +#define P3IM0 (*(unsigned char volatile xdata *)0xfd23) +#define P4IM0 (*(unsigned char volatile xdata *)0xfd24) +#define P5IM0 (*(unsigned char volatile xdata *)0xfd25) +#define P6IM0 (*(unsigned char volatile xdata *)0xfd26) +#define P7IM0 (*(unsigned char volatile xdata *)0xfd27) +#define P0IM1 (*(unsigned char volatile xdata *)0xfd30) +#define P1IM1 (*(unsigned char volatile xdata *)0xfd31) +#define P2IM1 (*(unsigned char volatile xdata *)0xfd32) +#define P3IM1 (*(unsigned char volatile xdata *)0xfd33) +#define P4IM1 (*(unsigned char volatile xdata *)0xfd34) +#define P5IM1 (*(unsigned char volatile xdata *)0xfd35) +#define P6IM1 (*(unsigned char volatile xdata *)0xfd36) +#define P7IM1 (*(unsigned char volatile xdata *)0xfd37) +#define P0WKUE (*(unsigned char volatile xdata *)0xfd40) +#define P1WKUE (*(unsigned char volatile xdata *)0xfd41) +#define P2WKUE (*(unsigned char volatile xdata *)0xfd42) +#define P3WKUE (*(unsigned char volatile xdata *)0xfd43) +#define P4WKUE (*(unsigned char volatile xdata *)0xfd44) +#define P5WKUE (*(unsigned char volatile xdata *)0xfd45) +#define P6WKUE (*(unsigned char volatile xdata *)0xfd46) +#define P7WKUE (*(unsigned char volatile xdata *)0xfd47) +#define PIN_IP (*(unsigned char volatile xdata *)0xfd60) +#define PIN_IPH (*(unsigned char volatile xdata *)0xfd61) + +///////////////////////////////////////////////// +//FC00H-FCFFH +///////////////////////////////////////////////// + +#define MD3 (*(unsigned char volatile xdata *)0xfcf0) +#define MD2 (*(unsigned char volatile xdata *)0xfcf1) +#define MD1 (*(unsigned char volatile xdata *)0xfcf2) +#define MD0 (*(unsigned char volatile xdata *)0xfcf3) +#define MD5 (*(unsigned char volatile xdata *)0xfcf4) +#define MD4 (*(unsigned char volatile xdata *)0xfcf5) +#define ARCON (*(unsigned char volatile xdata *)0xfcf6) +#define OPCON (*(unsigned char volatile xdata *)0xfcf7) + +///////////////////////////////////////////////// +//FB00H-FBFFH +///////////////////////////////////////////////// + +#define COMEN (*(unsigned char volatile xdata *)0xfb00) +#define SEGENL (*(unsigned char volatile xdata *)0xfb01) +#define SEGENH (*(unsigned char volatile xdata *)0xfb02) +#define LEDCTRL (*(unsigned char volatile xdata *)0xfb03) +#define LEDCKS (*(unsigned char volatile xdata *)0xfb04) +#define COM0_DA_L (*(unsigned char volatile xdata *)0xfb10) +#define COM1_DA_L (*(unsigned char volatile xdata *)0xfb11) +#define COM2_DA_L (*(unsigned char volatile xdata *)0xfb12) +#define COM3_DA_L (*(unsigned char volatile xdata *)0xfb13) +#define COM4_DA_L (*(unsigned char volatile xdata *)0xfb14) +#define COM5_DA_L (*(unsigned char volatile xdata *)0xfb15) +#define COM6_DA_L (*(unsigned char volatile xdata *)0xfb16) +#define COM7_DA_L (*(unsigned char volatile xdata *)0xfb17) +#define COM0_DA_H (*(unsigned char volatile xdata *)0xfb18) +#define COM1_DA_H (*(unsigned char volatile xdata *)0xfb19) +#define COM2_DA_H (*(unsigned char volatile xdata *)0xfb1a) +#define COM3_DA_H (*(unsigned char volatile xdata *)0xfb1b) +#define COM4_DA_H (*(unsigned char volatile xdata *)0xfb1c) +#define COM5_DA_H (*(unsigned char volatile xdata *)0xfb1d) +#define COM6_DA_H (*(unsigned char volatile xdata *)0xfb1e) +#define COM7_DA_H (*(unsigned char volatile xdata *)0xfb1f) +#define COM0_DC_L (*(unsigned char volatile xdata *)0xfb20) +#define COM1_DC_L (*(unsigned char volatile xdata *)0xfb21) +#define COM2_DC_L (*(unsigned char volatile xdata *)0xfb22) +#define COM3_DC_L (*(unsigned char volatile xdata *)0xfb23) +#define COM4_DC_L (*(unsigned char volatile xdata *)0xfb24) +#define COM5_DC_L (*(unsigned char volatile xdata *)0xfb25) +#define COM6_DC_L (*(unsigned char volatile xdata *)0xfb26) +#define COM7_DC_L (*(unsigned char volatile xdata *)0xfb27) +#define COM0_DC_H (*(unsigned char volatile xdata *)0xfb28) +#define COM1_DC_H (*(unsigned char volatile xdata *)0xfb29) +#define COM2_DC_H (*(unsigned char volatile xdata *)0xfb2a) +#define COM3_DC_H (*(unsigned char volatile xdata *)0xfb2b) +#define COM4_DC_H (*(unsigned char volatile xdata *)0xfb2c) +#define COM5_DC_H (*(unsigned char volatile xdata *)0xfb2d) +#define COM6_DC_H (*(unsigned char volatile xdata *)0xfb2e) +#define COM7_DC_H (*(unsigned char volatile xdata *)0xfb2f) + +#define TSCHEN1 (*(unsigned char volatile xdata *)0xfb40) +#define TSCHEN2 (*(unsigned char volatile xdata *)0xfb41) +#define TSCFG1 (*(unsigned char volatile xdata *)0xfb42) +#define TSCFG2 (*(unsigned char volatile xdata *)0xfb43) +#define TSWUTC (*(unsigned char volatile xdata *)0xfb44) +#define TSCTRL (*(unsigned char volatile xdata *)0xfb45) +#define TSSTA1 (*(unsigned char volatile xdata *)0xfb46) +#define TSSTA2 (*(unsigned char volatile xdata *)0xfb47) +#define TSRT (*(unsigned char volatile xdata *)0xfb48) +#define TSDAT (*(unsigned int volatile xdata *)0xfb49) +#define TSDATH (*(unsigned char volatile xdata *)0xfb49) +#define TSDATL (*(unsigned char volatile xdata *)0xfb4A) +#define TSTH00 (*(unsigned int volatile xdata *)0xfb50) +#define TSTH00H (*(unsigned char volatile xdata *)0xfb50) +#define TSTH00L (*(unsigned char volatile xdata *)0xfb51) +#define TSTH01 (*(unsigned int volatile xdata *)0xfb52) +#define TSTH01H (*(unsigned char volatile xdata *)0xfb52) +#define TSTH01L (*(unsigned char volatile xdata *)0xfb53) +#define TSTH02 (*(unsigned int volatile xdata *)0xfb54) +#define TSTH02H (*(unsigned char volatile xdata *)0xfb54) +#define TSTH02L (*(unsigned char volatile xdata *)0xfb55) +#define TSTH03 (*(unsigned int volatile xdata *)0xfb56) +#define TSTH03H (*(unsigned char volatile xdata *)0xfb56) +#define TSTH03L (*(unsigned char volatile xdata *)0xfb57) +#define TSTH04 (*(unsigned int volatile xdata *)0xfb58) +#define TSTH04H (*(unsigned char volatile xdata *)0xfb58) +#define TSTH04L (*(unsigned char volatile xdata *)0xfb59) +#define TSTH05 (*(unsigned int volatile xdata *)0xfb5a) +#define TSTH05H (*(unsigned char volatile xdata *)0xfb5a) +#define TSTH05L (*(unsigned char volatile xdata *)0xfb5b) +#define TSTH06 (*(unsigned int volatile xdata *)0xfb5c) +#define TSTH06H (*(unsigned char volatile xdata *)0xfb5c) +#define TSTH06L (*(unsigned char volatile xdata *)0xfb5d) +#define TSTH07 (*(unsigned int volatile xdata *)0xfb5e) +#define TSTH07H (*(unsigned char volatile xdata *)0xfb5e) +#define TSTH07L (*(unsigned char volatile xdata *)0xfb5f) +#define TSTH08 (*(unsigned int volatile xdata *)0xfb60) +#define TSTH08H (*(unsigned char volatile xdata *)0xfb60) +#define TSTH08L (*(unsigned char volatile xdata *)0xfb61) +#define TSTH09 (*(unsigned int volatile xdata *)0xfb62) +#define TSTH09H (*(unsigned char volatile xdata *)0xfb62) +#define TSTH09L (*(unsigned char volatile xdata *)0xfb63) +#define TSTH10 (*(unsigned int volatile xdata *)0xfb64) +#define TSTH10H (*(unsigned char volatile xdata *)0xfb64) +#define TSTH10L (*(unsigned char volatile xdata *)0xfb65) +#define TSTH11 (*(unsigned int volatile xdata *)0xfb66) +#define TSTH11H (*(unsigned char volatile xdata *)0xfb66) +#define TSTH11L (*(unsigned char volatile xdata *)0xfb67) +#define TSTH12 (*(unsigned int volatile xdata *)0xfb68) +#define TSTH12H (*(unsigned char volatile xdata *)0xfb68) +#define TSTH12L (*(unsigned char volatile xdata *)0xfb69) +#define TSTH13 (*(unsigned int volatile xdata *)0xfb6a) +#define TSTH13H (*(unsigned char volatile xdata *)0xfb6a) +#define TSTH13L (*(unsigned char volatile xdata *)0xfb6b) +#define TSTH14 (*(unsigned int volatile xdata *)0xfb6c) +#define TSTH14H (*(unsigned char volatile xdata *)0xfb6c) +#define TSTH14L (*(unsigned char volatile xdata *)0xfb6d) +#define TSTH15 (*(unsigned int volatile xdata *)0xfb6e) +#define TSTH15H (*(unsigned char volatile xdata *)0xfb6e) +#define TSTH15L (*(unsigned char volatile xdata *)0xfb6f) + +///////////////////////////////////////////////// +//FA00H-FAFFH +///////////////////////////////////////////////// + +#define DMA_ADC_CFG (*(unsigned char volatile xdata *)0xfa10) +#define DMA_ADC_CR (*(unsigned char volatile xdata *)0xfa11) +#define DMA_ADC_STA (*(unsigned char volatile xdata *)0xfa12) +#define DMA_ADC_RXA (*(unsigned int volatile xdata *)0xfa17) +#define DMA_ADC_RXAH (*(unsigned char volatile xdata *)0xfa17) +#define DMA_ADC_RXAL (*(unsigned char volatile xdata *)0xfa18) +#define DMA_ADC_CFG2 (*(unsigned char volatile xdata *)0xfa19) +#define DMA_ADC_CHSW0 (*(unsigned char volatile xdata *)0xfa1a) +#define DMA_ADC_CHSW1 (*(unsigned char volatile xdata *)0xfa1b) + +#define DMA_SPI_CFG (*(unsigned char volatile xdata *)0xfa20) +#define DMA_SPI_CR (*(unsigned char volatile xdata *)0xfa21) +#define DMA_SPI_STA (*(unsigned char volatile xdata *)0xfa22) +#define DMA_SPI_AMT (*(unsigned char volatile xdata *)0xfa23) +#define DMA_SPI_DONE (*(unsigned char volatile xdata *)0xfa24) +#define DMA_SPI_TXA (*(unsigned int volatile xdata *)0xfa25) +#define DMA_SPI_TXAH (*(unsigned char volatile xdata *)0xfa25) +#define DMA_SPI_TXAL (*(unsigned char volatile xdata *)0xfa26) +#define DMA_SPI_RXA (*(unsigned int volatile xdata *)0xfa27) +#define DMA_SPI_RXAH (*(unsigned char volatile xdata *)0xfa27) +#define DMA_SPI_RXAL (*(unsigned char volatile xdata *)0xfa28) +#define DMA_SPI_CFG2 (*(unsigned char volatile xdata *)0xfa29) + +#define DMA_UR1T_CFG (*(unsigned char volatile xdata *)0xfa30) +#define DMA_UR1T_CR (*(unsigned char volatile xdata *)0xfa31) +#define DMA_UR1T_STA (*(unsigned char volatile xdata *)0xfa32) +#define DMA_UR1T_AMT (*(unsigned char volatile xdata *)0xfa33) +#define DMA_UR1T_DONE (*(unsigned char volatile xdata *)0xfa34) +#define DMA_UR1T_TXA (*(unsigned int volatile xdata *)0xfa35) +#define DMA_UR1T_TXAH (*(unsigned char volatile xdata *)0xfa35) +#define DMA_UR1T_TXAL (*(unsigned char volatile xdata *)0xfa36) +#define DMA_UR1R_CFG (*(unsigned char volatile xdata *)0xfa38) +#define DMA_UR1R_CR (*(unsigned char volatile xdata *)0xfa39) +#define DMA_UR1R_STA (*(unsigned char volatile xdata *)0xfa3a) +#define DMA_UR1R_AMT (*(unsigned char volatile xdata *)0xfa3b) +#define DMA_UR1R_DONE (*(unsigned char volatile xdata *)0xfa3c) +#define DMA_UR1R_RXA (*(unsigned int volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAH (*(unsigned char volatile xdata *)0xfa3d) +#define DMA_UR1R_RXAL (*(unsigned char volatile xdata *)0xfa3e) + +#define DMA_UR2T_CFG (*(unsigned char volatile xdata *)0xfa40) +#define DMA_UR2T_CR (*(unsigned char volatile xdata *)0xfa41) +#define DMA_UR2T_STA (*(unsigned char volatile xdata *)0xfa42) +#define DMA_UR2T_AMT (*(unsigned char volatile xdata *)0xfa43) +#define DMA_UR2T_DONE (*(unsigned char volatile xdata *)0xfa44) +#define DMA_UR2T_TXA (*(unsigned int volatile xdata *)0xfa45) +#define DMA_UR2T_TXAH (*(unsigned char volatile xdata *)0xfa45) +#define DMA_UR2T_TXAL (*(unsigned char volatile xdata *)0xfa46) +#define DMA_UR2R_CFG (*(unsigned char volatile xdata *)0xfa48) +#define DMA_UR2R_CR (*(unsigned char volatile xdata *)0xfa49) +#define DMA_UR2R_STA (*(unsigned char volatile xdata *)0xfa4a) +#define DMA_UR2R_AMT (*(unsigned char volatile xdata *)0xfa4b) +#define DMA_UR2R_DONE (*(unsigned char volatile xdata *)0xfa4c) +#define DMA_UR2R_RXA (*(unsigned int volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAH (*(unsigned char volatile xdata *)0xfa4d) +#define DMA_UR2R_RXAL (*(unsigned char volatile xdata *)0xfa4e) + +#define DMA_UR3T_CFG (*(unsigned char volatile xdata *)0xfa50) +#define DMA_UR3T_CR (*(unsigned char volatile xdata *)0xfa51) +#define DMA_UR3T_STA (*(unsigned char volatile xdata *)0xfa52) +#define DMA_UR3T_AMT (*(unsigned char volatile xdata *)0xfa53) +#define DMA_UR3T_DONE (*(unsigned char volatile xdata *)0xfa54) +#define DMA_UR3T_TXA (*(unsigned int volatile xdata *)0xfa55) +#define DMA_UR3T_TXAH (*(unsigned char volatile xdata *)0xfa55) +#define DMA_UR3T_TXAL (*(unsigned char volatile xdata *)0xfa56) +#define DMA_UR3R_CFG (*(unsigned char volatile xdata *)0xfa58) +#define DMA_UR3R_CR (*(unsigned char volatile xdata *)0xfa59) +#define DMA_UR3R_STA (*(unsigned char volatile xdata *)0xfa5a) +#define DMA_UR3R_AMT (*(unsigned char volatile xdata *)0xfa5b) +#define DMA_UR3R_DONE (*(unsigned char volatile xdata *)0xfa5c) +#define DMA_UR3R_RXA (*(unsigned int volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAH (*(unsigned char volatile xdata *)0xfa5d) +#define DMA_UR3R_RXAL (*(unsigned char volatile xdata *)0xfa5e) + +#define DMA_UR4T_CFG (*(unsigned char volatile xdata *)0xfa60) +#define DMA_UR4T_CR (*(unsigned char volatile xdata *)0xfa61) +#define DMA_UR4T_STA (*(unsigned char volatile xdata *)0xfa62) +#define DMA_UR4T_AMT (*(unsigned char volatile xdata *)0xfa63) +#define DMA_UR4T_DONE (*(unsigned char volatile xdata *)0xfa64) +#define DMA_UR4T_TXA (*(unsigned int volatile xdata *)0xfa65) +#define DMA_UR4T_TXAH (*(unsigned char volatile xdata *)0xfa65) +#define DMA_UR4T_TXAL (*(unsigned char volatile xdata *)0xfa66) +#define DMA_UR4R_CFG (*(unsigned char volatile xdata *)0xfa68) +#define DMA_UR4R_CR (*(unsigned char volatile xdata *)0xfa69) +#define DMA_UR4R_STA (*(unsigned char volatile xdata *)0xfa6a) +#define DMA_UR4R_AMT (*(unsigned char volatile xdata *)0xfa6b) +#define DMA_UR4R_DONE (*(unsigned char volatile xdata *)0xfa6c) +#define DMA_UR4R_RXA (*(unsigned int volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAH (*(unsigned char volatile xdata *)0xfa6d) +#define DMA_UR4R_RXAL (*(unsigned char volatile xdata *)0xfa6e) + +#define DMA_LCM_CFG (*(unsigned char volatile xdata *)0xfa70) +#define DMA_LCM_CR (*(unsigned char volatile xdata *)0xfa71) +#define DMA_LCM_STA (*(unsigned char volatile xdata *)0xfa72) +#define DMA_LCM_AMT (*(unsigned char volatile xdata *)0xfa73) +#define DMA_LCM_DONE (*(unsigned char volatile xdata *)0xfa74) +#define DMA_LCM_TXA (*(unsigned int volatile xdata *)0xfa75) +#define DMA_LCM_TXAH (*(unsigned char volatile xdata *)0xfa75) +#define DMA_LCM_TXAL (*(unsigned char volatile xdata *)0xfa76) +#define DMA_LCM_RXA (*(unsigned int volatile xdata *)0xfa77) +#define DMA_LCM_RXAH (*(unsigned char volatile xdata *)0xfa77) +#define DMA_LCM_RXAL (*(unsigned char volatile xdata *)0xfa78) + + +///////////////////////////////////////////////// +#if 0 + +//包含本头文件后,不用另外再包含"REG51.H" + +//内核特殊功能寄存器 // 复位值 描述 +sfr ACC = 0xE0; //0000,0000 累加器Accumulator +sfr B = 0xF0; //0000,0000 B寄存器 +sfr PSW = 0xD0; //0000,0000 程序状态字 +sbit CY = PSW^7; +sbit AC = PSW^6; +sbit F0 = PSW^5; +sbit RS1 = PSW^4; +sbit RS0 = PSW^3; +sbit OV = PSW^2; +sbit P = PSW^0; +sfr SP = 0x81; //0000,0111 堆栈指针 +sfr DPL = 0x82; //0000,0000 数据指针低字节 +sfr DPH = 0x83; //0000,0000 数据指针高字节 + +//I/O 口特殊功能寄存器 +sfr P0 = 0x80; //1111,1111 端口0 +sbit P00 = P0^0; +sbit P01 = P0^1; +sbit P02 = P0^2; +sbit P03 = P0^3; +sbit P04 = P0^4; +sbit P05 = P0^5; +sbit P06 = P0^6; +sbit P07 = P0^7; +sfr P1 = 0x90; //1111,1111 端口1 +sbit P10 = P1^0; +sbit P11 = P1^1; +sbit P12 = P1^2; +sbit P13 = P1^3; +sbit P14 = P1^4; +sbit P15 = P1^5; +sbit P16 = P1^6; +sbit P17 = P1^7; +sfr P2 = 0xA0; //1111,1111 端口2 +sbit P20 = P2^0; +sbit P21 = P2^1; +sbit P22 = P2^2; +sbit P23 = P2^3; +sbit P24 = P2^4; +sbit P25 = P2^5; +sbit P26 = P2^6; +sbit P27 = P2^7; +sfr P3 = 0xB0; //1111,1111 端口3 +sbit P30 = P3^0; +sbit P31 = P3^1; +sbit P32 = P3^2; +sbit P33 = P3^3; +sbit P34 = P3^4; +sbit P35 = P3^5; +sbit P36 = P3^6; +sbit P37 = P3^7; +sfr P4 = 0xC0; //1111,1111 端口4 +sbit P40 = P4^0; +sbit P41 = P4^1; +sbit P42 = P4^2; +sbit P43 = P4^3; +sbit P44 = P4^4; +sbit P45 = P4^5; +sbit P46 = P4^6; +sbit P47 = P4^7; +sfr P5 = 0xC8; //xxxx,1111 端口5 +sbit P50 = P5^0; +sbit P51 = P5^1; +sbit P52 = P5^2; +sbit P53 = P5^3; +sbit P54 = P5^4; +sbit P55 = P5^5; +sbit P56 = P5^6; +sbit P57 = P5^7; +sfr P6 = 0xE8; //0000,0000 端口6 +sbit P60 = P6^0; +sbit P61 = P6^1; +sbit P62 = P6^2; +sbit P63 = P6^3; +sbit P64 = P6^4; +sbit P65 = P6^5; +sbit P66 = P6^6; +sbit P67 = P6^7; +sfr P7 = 0xF8; //0000,0000 端口7 +sbit P70 = P7^0; +sbit P71 = P7^1; +sbit P72 = P7^2; +sbit P73 = P7^3; +sbit P74 = P7^4; +sbit P75 = P7^5; +sbit P76 = P7^6; +sbit P77 = P7^7; + + +///00 准双向口 灌电流20mA 拉电流270-150uS +///01 推挽输出 20mA 加限流 +///10 高阻 +///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + + +sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0 +sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1 +sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0 +sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1 +sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0 +sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1 +sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0 +sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1 +sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0 +sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1 +sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0 +sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1 +sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0 +sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1 +sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0 +sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1 + +//系统管理特殊功能寄存器 +sfr PCON = 0x87; //0001,0000 电源控制寄存器 +sfr AUXR = 0x8E; //0000,0000 辅助寄存器 + +#define TOx12 BITN7 +#define T1x12 BITN6 +#define UART_M0x6 BITN5 //串口1模式0速度 =0 12倍 = 1 两倍 +#define T2R BITN4 //定时器2 运行 =1 +#define T2_C BITN3 //定时器/计数器选择 +#define T2x12 BITN2 +#define EXTRAM BITN1 +#define S1ST2 BITN0 //串口1选择定时器1 =0 选择定时器2 =1 + + +sfr VOCTR = 0xBB; //电压控制寄存器 +///BITN_1(VOCTR, BITN7) VOCTR +#define D_VOCTR_SCCIN 0x00 +#define D_VOCTR_SCC 0x80 +#define D_VOCTR_SET(X) VOCTR = (X) + +sfr AUXR1 = 0xA2; //0000,0000 辅助寄存器1 +sfr P_SW1 = 0xA2; //0000,0000 外设端口切换寄存器1 +sfr CLK_DIV = 0x97; //0000,0000 时钟分频控制寄存器 +sfr BUS_SPEED = 0xA1; //xx10,x011 总线速度控制寄存器 +sfr P1ASF = 0x9D; //0000,0000 端口1模拟功能配置寄存器 +//----------------------------------------------------------------- +sfr P_SW2 = 0xBA; //0xxx,x000 外设端口切换寄存器 +#define EAXFR BITN7 +#define I2C_S1 BITN5 +#define I2C_S2 BITN4 +#define CMPO_S BITN3 +#define S4_S BITN2 +#define S3_S BITN1 +#define S2_S BITN0 + +//----------------------------------------------------------------- + +//中断特殊功能寄存器 +sfr IE = 0xA8; //0000,0000 中断控制寄存器 +sbit EA = IE^7; +sbit ELVD = IE^6; +sbit EADC = IE^5; +sbit ES = IE^4; +sbit ET1 = IE^3; +sbit EX1 = IE^2; +sbit ET0 = IE^1; +sbit EX0 = IE^0; +sfr IE2 = 0xAF; //0000,0000 中断控制寄存器2 +sfr IP = 0xB8; //0000,0000 中断优先级寄存器 +sbit PPCA = IP^7; +sbit PLVD = IP^6; +sbit PADC = IP^5; +sbit PS = IP^4; +sbit PT1 = IP^3; +sbit PX1 = IP^2; +sbit PT0 = IP^1; +sbit PX0 = IP^0; +/// 不可位寻址 +#define ET4 BITN6 +#define ET3 BITN5 +#define ES4 BITN4 +#define ES3 BITN3 +#define ET2 BITN2 +#define ESPI BITN1 +#define ES2 BITN0 + + +sfr IPH = 0xB7; //xxxx,xx00 中断优先级寄存器2 +#define PPCAH BITN7 +#define PLVDH BITN6 +#define PADCH BITN5 +#define PSH BITN4 +#define PT1H BITN3 +#define PX1H BITN2 +#define PT0H BITN1 +#define PX0H BITN0 + + + +sfr IP2 = 0xB5; //xxxx,xx00 中断优先级寄存器2 +#define IP2_7 BITN7 +#define PI2C BITN6 +#define PCMP BITN5 +#define PX4 BITN4 +#define PPWMFD BITN3 +#define PPWM BITN2 +#define PSPI BITN1 +#define PS2 BITN0 + +sfr IP2H = 0xB6; //xxxx,xx00 中断优先级寄存器2 +#define IP2_7 BITN7 +#define PI2CH BITN6 +#define PCMPH BITN5 +#define PX4H BITN4 +#define PPWMFDH BITN3 +#define PPWMH BITN2 +#define PSPIH BITN1 +#define PS2H BITN0 + + + + + +sfr INT_CLKO = 0x8F; //0000,0000 外部中断与时钟输出控制寄存器 +#define INT_EX4 BITN6 +#define INT_EX3 BITN5 +#define INT_EX2 BITN4 +//定时器特殊功能寄存器 +sfr TCON = 0x88; //0000,0000 T0/T1控制寄存器 +sbit TF1 = TCON^7; +sbit TR1 = TCON^6; +sbit TF0 = TCON^5; +sbit TR0 = TCON^4; +sbit IE1 = TCON^3; +sbit IT1 = TCON^2; +sbit IE0 = TCON^1; +sbit IT0 = TCON^0; +sfr TMOD = 0x89; //0000,0000 T0/T1模式寄存器 +sfr TL0 = 0x8A; //0000,0000 T0低字节 +sfr TL1 = 0x8B; //0000,0000 T1低字节 +sfr TH0 = 0x8C; //0000,0000 T0高字节 +sfr TH1 = 0x8D; //0000,0000 T1高字节 +sfr T4T3M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T3T4M = 0xD1; //0000,0000 T3/T4模式寄存器 +sfr T4H = 0xD2; //0000,0000 T4高字节 +sfr T4L = 0xD3; //0000,0000 T4低字节 +sfr T3H = 0xD4; //0000,0000 T3高字节 +sfr T3L = 0xD5; //0000,0000 T3低字节 +sfr T2H = 0xD6; //0000,0000 T2高字节 +sfr T2L = 0xD7; //0000,0000 T2低字节 +sfr WKTCL = 0xAA; //0000,0000 掉电唤醒定时器低字节 +sfr WKTCH = 0xAB; //0000,0000 掉电唤醒定时器高字节 +sfr16 WKTC = 0xAA; +sfr WDT_CONTR = 0xC1; //0000,0000 看门狗控制寄存器 + +//串行口特殊功能寄存器 +sfr SCON = 0x98; //0000,0000 串口1控制寄存器 +sbit SM0 = SCON^7; +sbit SM1 = SCON^6; +sbit SM2 = SCON^5; +sbit REN = SCON^4; +sbit TB8 = SCON^3; +sbit RB8 = SCON^2; +sbit TI = SCON^1; +sbit RI = SCON^0; +//sfr SBUF = 0x99; //xxxx,xxxx 串口1数据寄存器 +//sfr S2CON = 0x9A; //0000,0000 串口2控制寄存器 +//sfr S2BUF = 0x9B; //xxxx,xxxx 串口2数据寄存器 +//sfr SADDR = 0xA9; //0000,0000 从机地址寄存器 +//sfr SADEN = 0xB9; //0000,0000 从机地址屏蔽寄存器 + +sfr SBUF = 0x99; //Serial Data Buffer +sfr SBUF0 = 0x99; //Serial Data Buffer xxxx,xxxx +sfr SADEN = 0xB9; //Slave Address Mask 0000,0000 +sfr SADDR = 0xA9; //Slave Address 0000,0000 +//----------------------------------- +// 7 6 5 4 3 2 1 0 Reset Value +sfr S2CON = 0x9A; //S2 Control S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B +#define S2SM0 BITN7 +#define S2ST4 BITN6 +#define S2SM2 BITN5 +#define S2REN BITN4 +#define S2TB8 BITN3 +#define S2RB8 BITN2 +#define S2TI BITN1 +#define S2RI BITN0 + +sfr S2BUF = 0x9B; //S2 Serial Buffer xxxx,xxxx +//sfr BRT = 0x9C; //S2 Baud-Rate Timer 0000,0000 + +//--------------------------------------------------------------- +sfr S3CON = 0xAC; //0000,0000 串口3控制寄存器 +#define S3SM0 BITN7 +#define S3ST4 BITN6 +#define S3SM2 BITN5 +#define S3REN BITN4 +#define S3TB8 BITN3 +#define S3RB8 BITN2 +#define S3TI BITN1 +#define S3RI BITN0 + +sfr S3BUF = 0xAD; //xxxx,xxxx 串口3数据寄存器 +//--------------------------------------------------------------- +sfr S4CON = 0x84; //0000,0000 串口4控制寄存器 +#define S4SM0 BITN7 +#define S4ST4 BITN6 +#define S4SM2 BITN5 +#define S4REN BITN4 +#define S4TB8 BITN3 +#define S4RB8 BITN2 +#define S4TI BITN1 +#define S4RI BITN0 + +sfr S4BUF = 0x85; //xxxx,xxxx 串口4数据寄存器 + +//ADC 特殊功能寄存器 +sfr ADC_CONTR = 0xBC; //0000,0000 A/D转换控制寄存器 +sfr ADC_RES = 0xBD; //0000,0000 A/D转换结果高8位 +sfr ADC_RESL = 0xBE; //0000,0000 A/D转换结果低2位 + +//SPI 特殊功能寄存器 +sfr SPSTAT = 0xCD; //00xx,xxxx SPI状态寄存器 +sfr SPCTL = 0xCE; //0000,0100 SPI控制寄存器 +sfr SPDAT = 0xCF; //0000,0000 SPI数据寄存器 + +//IAP/ISP 特殊功能寄存器 +sfr IAP_DATA = 0xC2; //0000,0000 EEPROM数据寄存器 +sfr IAP_ADDRH = 0xC3; //0000,0000 EEPROM地址高字节 +sfr IAP_ADDRL = 0xC4; //0000,0000 EEPROM地址第字节 +sfr IAP_CMD = 0xC5; //xxxx,xx00 EEPROM命令寄存器 +sfr IAP_TRIG = 0xC6; //0000,0000 EEPRPM命令触发寄存器 +sfr IAP_CONTR = 0xC7; //0000,x000 EEPROM控制寄存器 + +//PCA/PWM 特殊功能寄存器 +sfr CCON = 0xD8; //00xx,xx00 PCA控制寄存器 +sbit CF = CCON^7; +sbit CR = CCON^6; +sbit CCF2 = CCON^2; +sbit CCF1 = CCON^1; +sbit CCF0 = CCON^0; +sfr CMOD = 0xD9; //0xxx,x000 PCA 工作模式寄存器 +sfr CL = 0xE9; //0000,0000 PCA计数器低字节 +sfr CH = 0xF9; //0000,0000 PCA计数器高字节 +sfr CCAPM0 = 0xDA; //0000,0000 PCA模块0的PWM寄存器 +sfr CCAPM1 = 0xDB; //0000,0000 PCA模块1的PWM寄存器 +sfr CCAPM2 = 0xDC; //0000,0000 PCA模块2的PWM 寄存器 +sfr CCAP0L = 0xEA; //0000,0000 PCA模块0的捕捉/比较寄存器低字节 +sfr CCAP1L = 0xEB; //0000,0000 PCA模块1的捕捉/比较寄存器低字节 +sfr CCAP2L = 0xEC; //0000,0000 PCA模块2的捕捉/比较寄存器低字节 +sfr PCA_PWM0 = 0xF2; //xxxx,xx00 PCA模块0的PWM寄存器 +sfr PCA_PWM1 = 0xF3; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr PCA_PWM2 = 0xF4; //xxxx,xx00 PCA模块1的PWM寄存器 +sfr CCAP0H = 0xFA; //0000,0000 PCA模块0的捕捉/比较寄存器高字节 +sfr CCAP1H = 0xFB; //0000,0000 PCA模块1的捕捉/比较寄存器高字节 +sfr CCAP2H = 0xFC; //0000,0000 PCA模块2的捕捉/比较寄存器高字节 + +//比较器特殊功能寄存器 +sfr CMPCR1 = 0xE6; //0000,0000 比较器控制寄存器1 +sfr CMPCR2 = 0xE7; //0000,0000 比较器控制寄存器2 + + +//sfr P_SW2 = 0xba; +sfr PWMCFG = 0xf1; +sfr PWMIF = 0xf6; +sfr PWMFDCR = 0xf7; +sfr PWMCR = 0xfe; + +#define PWMC (*(unsigned int volatile xdata *)0xfff0) +#define PWMCKS (*(unsigned char volatile xdata *)0xfff2) +#define TADCP (*(unsigned int volatile xdata *)0xfff3) +#define PWM0T1 (*(unsigned int volatile xdata *)0xff00) +#define PWM0T2 (*(unsigned int volatile xdata *)0xff02) +#define PWM0CR (*(unsigned char volatile xdata *)0xff04) +#define PWM0HLD (*(unsigned char volatile xdata *)0xff05) +#define PWM1T1 (*(unsigned int volatile xdata *)0xff10) +#define PWM1T2 (*(unsigned int volatile xdata *)0xff12) +#define PWM1CR (*(unsigned char volatile xdata *)0xff14) +#define PWM1HLD (*(unsigned char volatile xdata *)0xff15) +#define PWM2T1 (*(unsigned int volatile xdata *)0xff20) +#define PWM2T2 (*(unsigned int volatile xdata *)0xff22) +#define PWM2CR (*(unsigned char volatile xdata *)0xff24) +#define PWM2HLD (*(unsigned char volatile xdata *)0xff25) +#define PWM3T1 (*(unsigned int volatile xdata *)0xff30) +#define PWM3T2 (*(unsigned int volatile xdata *)0xff32) +#define PWM3CR (*(unsigned char volatile xdata *)0xff34) +#define PWM3HLD (*(unsigned char volatile xdata *)0xff35) +#define PWM4T1 (*(unsigned int volatile xdata *)0xff40) +#define PWM4T2 (*(unsigned int volatile xdata *)0xff42) +#define PWM4CR (*(unsigned char volatile xdata *)0xff44) +#define PWM4HLD (*(unsigned char volatile xdata *)0xff45) +#define PWM5T1 (*(unsigned int volatile xdata *)0xff50) +#define PWM5T2 (*(unsigned int volatile xdata *)0xff52) +#define PWM5CR (*(unsigned char volatile xdata *)0xff54) +#define PWM5HLD (*(unsigned char volatile xdata *)0xff55) +#define PWM6T1 (*(unsigned int volatile xdata *)0xff60) +#define PWM6T2 (*(unsigned int volatile xdata *)0xff62) +#define PWM6CR (*(unsigned char volatile xdata *)0xff64) +#define PWM6HLD (*(unsigned char volatile xdata *)0xff65) +#define PWM7T1 (*(unsigned int volatile xdata *)0xff70) +#define PWM7T2 (*(unsigned int volatile xdata *)0xff72) +#define PWM7CR (*(unsigned char volatile xdata *)0xff74) +#define PWM7HLD (*(unsigned char volatile xdata *)0xff75) + + +#define CKSEL (*(unsigned char volatile xdata *)0xfE00)//108@ST8.PDF +#define MCLKODIV BIT4 +#define MCLKO_S BITN3 +#define MCLKSEL BIT0 + +#define CLKDIV (*(unsigned char volatile xdata *)0xfE01)//108@ST8.PDF +#define IRC24MCR (*(unsigned char volatile xdata *)0xfE02)//108@ST8.PDF +#define XOSCCR (*(unsigned char volatile xdata *)0xfE03)//108@ST8.PDF +#define IRC32KCR (*(unsigned char volatile xdata *)0xfE04)//108@ST8.PDF +#endif + +#if 0 +///已经放到了stc only中 + +#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF + +#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF + + + +///------------------------------------- + +#define gRccUs01_H (*(unsigned char volatile data *)0xd2) +#define gRccUs01_L (*(unsigned char volatile data *)0xd3) + + + +#define gRccUs01 (*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 (*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs03 (*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +//#define gRccUs03 s_task_GC032A.n + + + +#define gRccUs04 (*(unsigned short volatile data *)0xFA)///351@ST8.PDF +#define gRccUs05 (*(unsigned short volatile data *)0xFC)///351@ST8.PD CCAP2H + +///////////////////////////////////////////////// + + + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + + +sfr AUXINTIF = 0xef; + +#define T2IF 0x01 +#define INT4IF BITN6 +#define INT3IF BITN5 +#define INT2IF BITN4 + +//#define T4IF BITN2 +//#define T3IF BITN1 +//#define T2IF BITN0 + + +/// >>>>> add by cc + +#include "../clib/bit.h" + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + + +#define D_stdIO_P0(n) BITN_0(P0M1,n);BITN_0(P0M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(n) BITN_0(P0M1,n);BITN_1(P0M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(n) BITN_1(P0M1,n);BITN_0(P0M0,n); /////////10 高阻 +#define D_OpenD_P0(n) BITN_1(P0M1,n);BITN_1(P0M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(n) BITN_0(P1M1,n);BITN_0(P1M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(n) BITN_0(P1M1,n);BITN_1(P1M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(n) BITN_1(P1M1,n);BITN_0(P1M0,n); /////////10 高阻 +#define D_OpenD_P1(n) BITN_1(P1M1,n);BITN_1(P1M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(n) BITN_0(P2M1,n);BITN_0(P2M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(n) BITN_0(P2M1,n);BITN_1(P2M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(n) BITN_1(P2M1,n);BITN_0(P2M0,n); /////////10 高阻 +#define D_OpenD_P2(n) BITN_1(P2M1,n);BITN_1(P2M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(n) BITN_0(P3M1,n);BITN_0(P3M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(n) BITN_0(P3M1,n);BITN_1(P3M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(n) BITN_1(P3M1,n);BITN_0(P3M0,n); /////////10 高阻 +#define D_OpenD_P3(n) BITN_1(P3M1,n);BITN_1(P3M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(n) BITN_0(P4M1,n);BITN_0(P4M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(n) BITN_0(P4M1,n);BITN_1(P4M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(n) BITN_1(P4M1,n);BITN_0(P4M0,n); /////////10 高阻 +#define D_OpenD_P4(n) BITN_1(P4M1,n);BITN_1(P4M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻 +#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(n) BITN_0(P6M1,n);BITN_0(P6M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(n) BITN_0(P6M1,n);BITN_1(P6M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(n) BITN_1(P6M1,n);BITN_0(P6M0,n); /////////10 高阻 +#define D_OpenD_P6(n) BITN_1(P6M1,n);BITN_1(P6M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(n) BITN_0(P7M1,n);BITN_0(P7M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(n) BITN_0(P7M1,n);BITN_1(P7M0,n); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(n) BITN_1(P7M1,n);BITN_0(P7M0,n); /////////10 高阻 +#define D_OpenD_P7(n) BITN_1(P7M1,n);BITN_1(P7M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#define D_ISR_int0 0 ///int0 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer0 1 +#define D_ISR_int1 2 ///int1 下降沿触发 = 0 上下沿均可触发 +#define D_ISR_timer1 3 +#define D_ISR_int2 10 /////只有下降沿 +#define D_ISR_int3 11 /////只有下降沿 +#define D_SERVE_UART 4 +#define D_SERVE_UART1 8 +#define D_ISR_int4 16 /////只有下降沿 + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); + +#endif +#endif //STC_stc8a8k + + + + + + + + diff --git a/source/cpu/c51_macro.H b/source/cpu/c51_macro.H new file mode 100644 index 0000000..5bbfab9 --- /dev/null +++ b/source/cpu/c51_macro.H @@ -0,0 +1,301 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2018, 传控科技 +/// All rights reserved. +/// +/// @file __C51_MACRO_H_ +/// @brief macro define 和cpu相关,可以和同一个系列的cpu共享 +/// +///(本文件实现的功能的详述) +/// +/// @version 1.1 CCsens technology +/// @author CC +/// @date 20180102 + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __C51_MACRO_H_ +#define __C51_MACRO_H_ + +#include + +#define D_P07_ON() P07 = 1 +#define D_P06_ON() P06 = 1 +#define D_P05_ON() P05 = 1 +#define D_P04_ON() P04 = 1 +#define D_P03_ON() P03 = 1 +#define D_P02_ON() P02 = 1 +#define D_P01_ON() P01 = 1 +#define D_P00_ON() P00 = 1 +#define D_P07_OFF() P07 = 0 +#define D_P06_OFF() P06 = 0 +#define D_P05_OFF() P05 = 0 +#define D_P04_OFF() P04 = 0 +#define D_P03_OFF() P03 = 0 +#define D_P02_OFF() P02 = 0 +#define D_P01_OFF() P01 = 0 +#define D_P00_OFF() P00 = 0 +#define D_P07_AT() (P07) +#define D_P06_AT() (P06) +#define D_P05_AT() (P05) +#define D_P04_AT() (P04) +#define D_P03_AT() (P03) +#define D_P02_AT() (P02) +#define D_P01_AT() (P01) +#define D_P00_AT() (P00) +#define D_P07_REV() P07 = ~P07 +#define D_P06_REV() P06 = ~P06 +#define D_P05_REV() P05 = ~P05 +#define D_P04_REV() P04 = ~P04 +#define D_P03_REV() P03 = ~P03 +#define D_P02_REV() P02 = ~P02 +#define D_P01_REV() P01 = ~P01 +#define D_P00_REV() P00 = ~P00 + + +#define D_P17_ON() P17 = 1 +#define D_P16_ON() P16 = 1 +#define D_P15_ON() P15 = 1 +#define D_P14_ON() P14 = 1 +#define D_P13_ON() P13 = 1 +#define D_P12_ON() P12 = 1 +#define D_P11_ON() P11 = 1 +#define D_P10_ON() P10 = 1 +#define D_P17_OFF() P17 = 0 +#define D_P16_OFF() P16 = 0 +#define D_P15_OFF() P15 = 0 +#define D_P14_OFF() P14 = 0 +#define D_P13_OFF() P13 = 0 +#define D_P12_OFF() P12 = 0 +#define D_P11_OFF() P11 = 0 +#define D_P10_OFF() P10 = 0 +#define D_P17_AT() (P17) +#define D_P16_AT() (P16) +#define D_P15_AT() (P15) +#define D_P14_AT() (P14) +#define D_P13_AT() (P13) +#define D_P12_AT() (P12) +#define D_P11_AT() (P11) +#define D_P10_AT() (P10) +#define D_P17_REV() P17 = ~P17 +#define D_P16_REV() P16 = ~P16 +#define D_P15_REV() P15 = ~P15 +#define D_P14_REV() P14 = ~P14 +#define D_P13_REV() P13 = ~P13 +#define D_P12_REV() P12 = ~P12 +#define D_P11_REV() P11 = ~P11 +#define D_P10_REV() P10 = ~P10 + +#define D_P27_ON() P27 = 1 +#define D_P26_ON() P26 = 1 +#define D_P25_ON() P25 = 1 +#define D_P24_ON() P24 = 1 +#define D_P23_ON() P23 = 1 +#define D_P22_ON() P22 = 1 +#define D_P21_ON() P21 = 1 +#define D_P20_ON() P20 = 1 +#define D_P27_OFF() P27 = 0 +#define D_P26_OFF() P26 = 0 +#define D_P25_OFF() P25 = 0 +#define D_P24_OFF() P24 = 0 +#define D_P23_OFF() P23 = 0 +#define D_P22_OFF() P22 = 0 +#define D_P21_OFF() P21 = 0 +#define D_P20_OFF() P20 = 0 +#define D_P27_AT() (P27) +#define D_P26_AT() (P26) +#define D_P25_AT() (P25) +#define D_P24_AT() (P24) +#define D_P23_AT() (P23) +#define D_P22_AT() (P22) +#define D_P21_AT() (P21) +#define D_P20_AT() (P20) +#define D_P27_REV() P27 = ~P27 +#define D_P26_REV() P26 = ~P26 +#define D_P25_REV() P25 = ~P25 +#define D_P24_REV() P24 = ~P24 +#define D_P23_REV() P23 = ~P23 +#define D_P22_REV() P22 = ~P22 +#define D_P21_REV() P21 = ~P21 +#define D_P20_REV() P20 = ~P20 + + +#define D_P37_ON() P37 = 1 +#define D_P36_ON() P36 = 1 +#define D_P35_ON() P35 = 1 +#define D_P34_ON() P34 = 1 +#define D_P33_ON() P33 = 1 +#define D_P32_ON() P32 = 1 +#define D_P31_ON() P31 = 1 +#define D_P30_ON() P30 = 1 +#define D_P37_OFF() P37 = 0 +#define D_P36_OFF() P36 = 0 +#define D_P35_OFF() P35 = 0 +#define D_P34_OFF() P34 = 0 +#define D_P33_OFF() P33 = 0 +#define D_P32_OFF() P32 = 0 +#define D_P31_OFF() P31 = 0 +#define D_P30_OFF() P30 = 0 +#define D_P37_AT() (P37) +#define D_P36_AT() (P36) +#define D_P35_AT() (P35) +#define D_P34_AT() (P34) +#define D_P33_AT() (P33) +#define D_P32_AT() (P32) +#define D_P31_AT() (P31) +#define D_P30_AT() (P30) +#define D_P37_REV() P37 = ~P37 +#define D_P36_REV() P36 = ~P36 +#define D_P35_REV() P35 = ~P35 +#define D_P34_REV() P34 = ~P34 +#define D_P33_REV() P33 = ~P33 +#define D_P32_REV() P32 = ~P32 +#define D_P31_REV() P31 = ~P31 +#define D_P30_REV() P30 = ~P30 + + +#define D_P47_ON() P47 = 1 +#define D_P46_ON() P46 = 1 +#define D_P45_ON() P45 = 1 +#define D_P44_ON() P44 = 1 +#define D_P43_ON() P43 = 1 +#define D_P42_ON() P42 = 1 +#define D_P41_ON() P41 = 1 +#define D_P40_ON() P40 = 1 +#define D_P47_OFF() P47 = 0 +#define D_P46_OFF() P46 = 0 +#define D_P45_OFF() P45 = 0 +#define D_P44_OFF() P44 = 0 +#define D_P43_OFF() P43 = 0 +#define D_P42_OFF() P42 = 0 +#define D_P41_OFF() P41 = 0 +#define D_P40_OFF() P40 = 0 +#define D_P47_AT() (P47) +#define D_P46_AT() (P46) +#define D_P45_AT() (P45) +#define D_P44_AT() (P44) +#define D_P43_AT() (P43) +#define D_P42_AT() (P42) +#define D_P41_AT() (P41) +#define D_P40_AT() (P40) +#define D_P47_REV() P47 = ~P47 +#define D_P46_REV() P46 = ~P46 +#define D_P45_REV() P45 = ~P45 +#define D_P44_REV() P44 = ~P44 +#define D_P43_REV() P43 = ~P43 +#define D_P42_REV() P42 = ~P42 +#define D_P41_REV() P41 = ~P41 +#define D_P40_REV() P40 = ~P40 + +#define D_P57_ON() P57 = 1 +#define D_P56_ON() P56 = 1 +#define D_P55_ON() P55 = 1 +#define D_P54_ON() P54 = 1 +#define D_P53_ON() P53 = 1 +#define D_P52_ON() P52 = 1 +#define D_P51_ON() P51 = 1 +#define D_P50_ON() P50 = 1 +#define D_P57_OFF() P57 = 0 +#define D_P56_OFF() P56 = 0 +#define D_P55_OFF() P55 = 0 +#define D_P54_OFF() P54 = 0 +#define D_P53_OFF() P53 = 0 +#define D_P52_OFF() P52 = 0 +#define D_P51_OFF() P51 = 0 +#define D_P50_OFF() P50 = 0 +#define D_P57_AT() (P57) +#define D_P56_AT() (P56) +#define D_P55_AT() (P55) +#define D_P54_AT() (P54) +#define D_P53_AT() (P53) +#define D_P52_AT() (P52) +#define D_P51_AT() (P51) +#define D_P50_AT() (P50) +#define D_P57_REV() P57 = ~P57 +#define D_P56_REV() P56 = ~P56 +#define D_P55_REV() P55 = ~P55 +#define D_P54_REV() P54 = ~P54 +#define D_P53_REV() P53 = ~P53 +#define D_P52_REV() P52 = ~P52 +#define D_P51_REV() P51 = ~P51 +#define D_P50_REV() P50 = ~P50 + +#define D_P67_ON() P67 = 1 +#define D_P66_ON() P66 = 1 +#define D_P65_ON() P65 = 1 +#define D_P64_ON() P64 = 1 +#define D_P63_ON() P63 = 1 +#define D_P62_ON() P62 = 1 +#define D_P61_ON() P61 = 1 +#define D_P60_ON() P60 = 1 +#define D_P67_OFF() P67 = 0 +#define D_P66_OFF() P66 = 0 +#define D_P65_OFF() P65 = 0 +#define D_P64_OFF() P64 = 0 +#define D_P63_OFF() P63 = 0 +#define D_P62_OFF() P62 = 0 +#define D_P61_OFF() P61 = 0 +#define D_P60_OFF() P60 = 0 +#define D_P67_AT() (P67) +#define D_P66_AT() (P66) +#define D_P65_AT() (P65) +#define D_P64_AT() (P64) +#define D_P63_AT() (P63) +#define D_P62_AT() (P62) +#define D_P61_AT() (P61) +#define D_P60_AT() (P60) +#define D_P67_REV() P67 = ~P67 +#define D_P66_REV() P66 = ~P66 +#define D_P65_REV() P65 = ~P65 +#define D_P64_REV() P64 = ~P64 +#define D_P63_REV() P63 = ~P63 +#define D_P62_REV() P62 = ~P62 +#define D_P61_REV() P61 = ~P61 +#define D_P60_REV() P60 = ~P60 + +#define D_P77_ON() P77 = 1 +#define D_P76_ON() P76 = 1 +#define D_P75_ON() P75 = 1 +#define D_P74_ON() P74 = 1 +#define D_P73_ON() P73 = 1 +#define D_P72_ON() P72 = 1 +#define D_P71_ON() P71 = 1 +#define D_P70_ON() P70 = 1 +#define D_P77_OFF() P77 = 0 +#define D_P76_OFF() P76 = 0 +#define D_P75_OFF() P75 = 0 +#define D_P74_OFF() P74 = 0 +#define D_P73_OFF() P73 = 0 +#define D_P72_OFF() P72 = 0 +#define D_P71_OFF() P71 = 0 +#define D_P70_OFF() P70 = 0 +#define D_P77_AT() (P77) +#define D_P76_AT() (P76) +#define D_P75_AT() (P75) +#define D_P74_AT() (P74) +#define D_P73_AT() (P73) +#define D_P72_AT() (P72) +#define D_P71_AT() (P71) +#define D_P70_AT() (P70) +#define D_P77_REV() P77 = ~P77 +#define D_P76_REV() P76 = ~P76 +#define D_P75_REV() P75 = ~P75 +#define D_P74_REV() P74 = ~P74 +#define D_P73_REV() P73 = ~P73 +#define D_P72_REV() P72 = ~P72 +#define D_P71_REV() P71 = ~P71 +#define D_P70_REV() P70 = ~P70 + + + +#endif //__C51_MACRO_H_ + + + + + + + diff --git a/source/cpu/STC_stc8a8k.H b/source/cpu/nouse/STC_stc8a8k.H similarity index 100% rename from source/cpu/STC_stc8a8k.H rename to source/cpu/nouse/STC_stc8a8k.H diff --git a/source/cpu/stc_macro.H b/source/cpu/nouse/stc_macro.H similarity index 100% rename from source/cpu/stc_macro.H rename to source/cpu/nouse/stc_macro.H diff --git a/source/cpu/stc_stc15w.H b/source/cpu/nouse/stc_stc15w.H similarity index 100% rename from source/cpu/stc_stc15w.H rename to source/cpu/nouse/stc_stc15w.H diff --git a/source/cpu/stc_stc8G1k.H b/source/cpu/nouse/stc_stc8G1k.H similarity index 100% rename from source/cpu/stc_stc8G1k.H rename to source/cpu/nouse/stc_stc8G1k.H diff --git a/source/cpu/stc_stc8f.h b/source/cpu/nouse/stc_stc8f.h similarity index 100% rename from source/cpu/stc_stc8f.h rename to source/cpu/nouse/stc_stc8f.h diff --git a/source/cpu/stc_stc8hxx.h b/source/cpu/nouse/stc_stc8hxx.h similarity index 100% rename from source/cpu/stc_stc8hxx.h rename to source/cpu/nouse/stc_stc8hxx.h diff --git a/source/cpu/stc_only.H b/source/cpu/stc_only.H new file mode 100644 index 0000000..aa5c378 --- /dev/null +++ b/source/cpu/stc_only.H @@ -0,0 +1,258 @@ +////////////////////////////////////////////////////////////////////////// +/// COPYRIGHT NOTICE +/// Copyright (c) 2022, 传控科技 +/// All rights reserved. +/// +/// @file __STC_ONLY_H_ +/// @brief macro define 和cpu相关,STC独有的 使用stc系列单片机是使用 +/// +///(本文件实现的功能的详述) +/// +/// @version 1.0 CCsens technology +/// @author CC +/// @date 20211226 + +// +////////////////////////////////////////////////////////////////////////// + + + +#ifndef __STC_ONLY_H_ +#define __STC_ONLY_H_ + +#include + +#define ET3 0x20 +#define T3IF 0x02 + +///#define ES2 0x01 +///#define ES3 0x08 + +#define S2TI 0x02 +#define S2RI 0x01 +#define S3TI 0x02 +#define S3RI 0x01 +#define ET4 0x40 + + + + +///#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF + +///#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF + + + +///------------------------------------- + +#define gRccUs01_H (*(unsigned char volatile data *)0xd2) +#define gRccUs01_L (*(unsigned char volatile data *)0xd3) + + + +#define gRccUs01 (*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H +#define gRccUs02 (*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +#define gRccUs03 (*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH +//#define gRccUs03 s_task_GC032A.n + + + +#define gRccUs04 (*(unsigned short volatile data *)0xFA)///351@ST8.PDF +#define gRccUs05 (*(unsigned short volatile data *)0xFC)///351@ST8.PD CCAP2H + +///////////////////////////////////////////////// + +#ifdef docasdfasdf + 符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 + IE2 AFH EUSB ET4 ET3 ES4 ES3 ET2 ESPI ES2 + + EUSB∶USB中断允许位。 + 0∶禁止 USB中断1∶允许 USB中断 + ET4∶定时/计数器T4的溢出中断允许位。 + 0∶禁止 T4中断1∶允许T4中断 + ET3∶定时/计数器 T3的溢出中断允许位。 + 0∶禁止 T3中断1∶允许T3中断 + ES4∶串行口4中断允许位。 + 0∶禁止串行口4中断1∶允许串行口 4中断ES3∶串行口3中断允许位。 + 0∶禁止串行口3中断1∶允许串行口3中断 + ET2∶定时/计数器 T2的溢出中断允许位。 + 0∶禁止T2中断1∶允许T3中断ESPI∶SPI中断允许位。 + 0∶禁止 SPI中断1∶允许 SPI中断 + ES2∶串行口 2中断允许位。 + 0∶禁止串行口2中断1∶允许串行口2中断 + + +#endif + +#define ES4 BITN4 +#define ES3 BITN3 +#define ES2 BITN0 + + + +/* P3 */ +sbit RD = 0xB7; +sbit WR = 0xB6; +sbit T1 = 0xB5; +sbit T0 = 0xB4; +sbit INT1 = 0xB3; +sbit INT0 = 0xB2; +sbit TXD = 0xB1; +sbit RXD = 0xB0; + + +///sfr AUXINTIF = 0xef; + +#define T2IF 0x01 +#define INT4IF BITN6 +#define INT3IF BITN5 +#define INT2IF BITN4 + +//#define T4IF BITN2 +//#define T3IF BITN1 +//#define T2IF BITN0 + + +/// >>>>> add by cc + +#include "../clib/bit.h" + +#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; +#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; +#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; +#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; + +#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; +#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; +#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; +#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; + + +#define D_stdIO_P0(BITNx) BITN_0(P0M1,BITNx);BITN_0(P0M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P0(BITNx) BITN_0(P0M1,BITNx);BITN_1(P0M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P0(BITNx) BITN_1(P0M1,BITNx);BITN_0(P0M0,BITNx); /////////10 高阻 +#define D_OpenD_P0(BITNx) BITN_1(P0M1,BITNx);BITN_1(P0M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P1(BITNx) BITN_0(P1M1,BITNx);BITN_0(P1M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P1(BITNx) BITN_0(P1M1,BITNx);BITN_1(P1M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P1(BITNx) BITN_1(P1M1,BITNx);BITN_0(P1M0,BITNx); /////////10 高阻 +#define D_OpenD_P1(BITNx) BITN_1(P1M1,BITNx);BITN_1(P1M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P2(BITNx) BITN_0(P2M1,BITNx);BITN_0(P2M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P2(BITNx) BITN_0(P2M1,BITNx);BITN_1(P2M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P2(BITNx) BITN_1(P2M1,BITNx);BITN_0(P2M0,BITNx); /////////10 高阻 +#define D_OpenD_P2(BITNx) BITN_1(P2M1,BITNx);BITN_1(P2M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P3(BITNx) BITN_0(P3M1,BITNx);BITN_0(P3M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P3(BITNx) BITN_0(P3M1,BITNx);BITN_1(P3M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P3(BITNx) BITN_1(P3M1,BITNx);BITN_0(P3M0,BITNx); /////////10 高阻 +#define D_OpenD_P3(BITNx) BITN_1(P3M1,BITNx);BITN_1(P3M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P4(BITNx) BITN_0(P4M1,BITNx);BITN_0(P4M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P4(BITNx) BITN_0(P4M1,BITNx);BITN_1(P4M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P4(BITNx) BITN_1(P4M1,BITNx);BITN_0(P4M0,BITNx); /////////10 高阻 +#define D_OpenD_P4(BITNx) BITN_1(P4M1,BITNx);BITN_1(P4M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P5(BITNx) BITN_0(P5M1,BITNx);BITN_0(P5M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P5(BITNx) BITN_0(P5M1,BITNx);BITN_1(P5M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P5(BITNx) BITN_1(P5M1,BITNx);BITN_0(P5M0,BITNx); /////////10 高阻 +#define D_OpenD_P5(BITNx) BITN_1(P5M1,BITNx);BITN_1(P5M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P6(BITNx) BITN_0(P6M1,BITNx);BITN_0(P6M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P6(BITNx) BITN_0(P6M1,BITNx);BITN_1(P6M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P6(BITNx) BITN_1(P6M1,BITNx);BITN_0(P6M0,BITNx); /////////10 高阻 +#define D_OpenD_P6(BITNx) BITN_1(P6M1,BITNx);BITN_1(P6M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +#define D_stdIO_P7(BITNx) BITN_0(P7M1,BITNx);BITN_0(P7M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS +#define D_HighI_P7(BITNx) BITN_0(P7M1,BITNx);BITN_1(P7M0,BITNx); //////01 推挽输出 20mA 加限流 +#define D_HighR_P7(BITNx) BITN_1(P7M1,BITNx);BITN_0(P7M0,BITNx); /////////10 高阻 +#define D_OpenD_P7(BITNx) BITN_1(P7M1,BITNx);BITN_1(P7M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平 + +/*** + +#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); +#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); +#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); +#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); + + +#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); +#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); + +#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); +#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); + +***/ + + + +#define NOP() _nop_() + +#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) +#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) + +#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) + + + + +#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) +#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) +#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) + + + + +////// + +#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); +#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); +#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); +#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); +#define L0_INT1_OPEN() EX1 = 1; +#define L0_INT1_CLOSE() EX1 = 0; +#define L0_INT0_OPEN() EX0 = 1; +#define L0_INT0_CLOSE() EX0 = 0; + +#if 0 +#define L0_TIMER1_start() TR1 = 1; +#define L0_TIMER1_end() TR1 = 0; + + +#define L0_TIMER1_isr_OPEN() ET1 = 1; +#define L0_TIMER1_isr_CLOSE() ET1 = 0; + + +#else + +#define L0_TIMER1_start() ET1 = 1; +#define L0_TIMER1_end() ET1 = 0; + + +#define L0_TIMER1_isr_OPEN() TR1 = 1; +#define L0_TIMER1_isr_CLOSE() TR1 = 0; + + +#endif + +/// fixme 颠倒定义会让c51锁死#define _nop_() NOP() + +///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断 +///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3); + + + + + + + + + +#endif //__STC_ONLY_H_ + + + + + + + diff --git a/source/ctask/task.h b/source/ctask/task.h index 33cde0e..0b9f100 100644 --- a/source/ctask/task.h +++ b/source/ctask/task.h @@ -143,10 +143,66 @@ typedef struct _ts_task L2_task_switch_default_idelay();} #define TTSS_Task_fun(step); break;}\ case (step):{ + //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + + +/// 放在任务节点?每delay时间欿执行以下功能 x必须在对应的任务里是独一无二瘿 +#define TTSS_run_every_init(X,delay); (X) = s_nos_tick.t_10ms + delay; +#define TTSS_run_every(X,delay) if( (X) < s_nos_tick.t_10ms) { TTSS_run_every_init(X,delay); +#define TTSS_run_every0(X,delay) if(0){ +#define TTSS_run_every_end } + + + +#define TTSS_Cycle_every_init(X); (X) = 0; +#define TTSS_Cycle_every(X,delay) if( X++ > delay) { TTSS_Cycle_every_init(X); +#define TTSS_Cycle_every0(X,delay) if(0){ +#define TTSS_Cycle_every_end } + + +#define TTSS_run_times(X,n) for(X = 0;X < n;X ++) +#define TTSS_run_overflow(X,n) if(X++ > n) + + + + +////设定溢出时间 如果到了就进行执行某个操仿 和run-every的区别是执行一次,所以不需要再次初始化 +#define TTSS_overtime_init(X,delay); (X) = s_nos_tick.jiffies + delay; +#define TTSS_overtime_get(X) if( (X) < s_nos_tick.jiffies) { +#define TTSS_overtime_end } + + +//////are you ok ,使用任务变量 overVal(全局变量不可随意嵌套使用), +///// timerx: 问候的时间间隔 +///// printChar 应答的内容(单字符,arccii字符可打印字符最佳) +////代码套路化,符合自然语言的拟人化,为将来自动生成代码做准备 +#define TTSS_AreUok(overVal,timerx,printChar) \ + TTSS_overtime_get(overVal) \ + L0_uart0_uc(printChar); \ + TTSS_overtime_init(overVal,timerx);\ + TTSS_overtime_end + + +#define TTSS_Alarm_init(X,delay); (X) = s_nos_tick.jiffies + delay; +#define TTSS_Alarm_AT(X) ( (X) < s_nos_tick.jiffies) + +#define TTSS_Alarm_arrives(X) if( (X) < s_nos_tick.jiffies) { +#define TTSS_Alarm_end } + + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + + + extern void L1_task_init(TS_task *s); + + #endif//_TASK_H_ /***************************************************** *============================================================== diff --git a/source/ctask/tick.c b/source/ctask/tick.c index fa4ee64..4540d3b 100644 --- a/source/ctask/tick.c +++ b/source/ctask/tick.c @@ -23,8 +23,8 @@ void L1_tick_init(void) { s_nos_tick.jiffies = 0; s_nos_tick.t_1s = 0; - s_nos_tick.t1s_heatbeart= 0; - //s_nos_tick.t_10ms = 0; + s_nos_tick.t1s_heartbeat= 0; + s_nos_tick.t_50ms = 0; } @@ -37,11 +37,11 @@ void L1_tick_tick (void) //s_nos_tick.t_50ms ++;//D_led_D1_REV(); 20160522验证 s_nos_tick.jiffies++; //s_nos_tick.t_10ms = 1; - if(s_nos_tick.jiffies % HZ == 0) + if(s_nos_tick.jiffies % HZ == 0) ///HZ = 10ms { // 65535*65535/24/60/60/356/10 =12.7年 s_nos_tick.t_1s ++; - s_nos_tick.t1s_heatbeart = 1; + s_nos_tick.t1s_heartbeat = 1; } } diff --git a/source/ctask/tick.h b/source/ctask/tick.h index 42f156a..e37e9c8 100644 --- a/source/ctask/tick.h +++ b/source/ctask/tick.h @@ -17,7 +17,18 @@ struct _s_nos_tick_ { vU32 jiffies; // noos系统定时器最小计时单元 vU32 t_1s; - vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除 + vU8 t1s_heartbeat; //noos 系统定时器整秒时刻标志,需要软件清除 + + vU8 print_heartbeat; + + vU32 n_stamp; +//// vU32 t_10ms; + vU32 t_50ms; // noos 系统定时器10m技术 +// vU32 t1s_flag[6]; //fixme: INT32U 根据不同的系统来决定 + //volatile unsigned char t1s_flag; +/// vU8 ts_flag; + vU32 n_stamp3; + // vU8 t_10ms; }; extern struct _s_nos_tick_ s_nos_tick; @@ -46,6 +57,8 @@ extern struct _s_nos_tick_ s_nos_tick; #define D_Tdelay_5ms ((5-1) / JIFFIES + 1) #define D_Tdelay_10ms ((10-1) / JIFFIES + 1) #define D_Tdelay_20ms ((20-1) / JIFFIES + 1) +#define D_Tdelay_30ms ((30-1) / JIFFIES + 1) +#define D_Tdelay_40ms ((40-1) / JIFFIES + 1) #define D_Tdelay_50ms ((50-1) / JIFFIES + 1) #define D_Tdelay_100ms ((100-1) / JIFFIES + 1) @@ -72,7 +85,6 @@ extern struct _s_nos_tick_ s_nos_tick; #define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms #define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_50ms - start_n) - #define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s #define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n) @@ -85,6 +97,14 @@ extern struct _s_nos_tick_ s_nos_tick; #define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x) #define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); +#define D_print_heartbeat_nexttimes(); s_nos_tick.print_heartbeat = 1;//下一次再打印心跳 +#define D_print_heartbeat_close(); s_nos_tick.print_heartbeat = 0;//停止打印心跳 +#define D_print_heartbeat_ok() (1 == s_nos_tick.print_heartbeat)//允许打印心跳 +#define D_print_heartbeat_disable() (0 == s_nos_tick.print_heartbeat)//允许打印心跳 + +#define D_print_heartbeat() if(D_print_heartbeat_disable()){\ + D_print_heartbeat_nexttimes();\ + }else extern void L1_tick_init(void); extern void L1_tick_tick (void); diff --git a/source/ctask/tick.h.bak b/source/ctask/tick.h.bak new file mode 100644 index 0000000..42f156a --- /dev/null +++ b/source/ctask/tick.h.bak @@ -0,0 +1,94 @@ +/***************************************************************************** + * uart.h: Header file for NXP LPC17xx Family Microprocessors + * + * Copyright(C) 2017,SensorControl + * All rights reserved. + * + * History + * 2009.05.27 ver 1.00 Prelimnary version, first Release + *2017.01.10 ver 1.10 rename tick.h tick.c +******************************************************************************/ +#ifndef __tick_H +#define __tick_H +#include "../clib/Type.h" +#include "../msp/time.h" + +struct _s_nos_tick_ +{ + vU32 jiffies; // noos系统定时器最小计时单元 + vU32 t_1s; + vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除 +// vU8 t_10ms; +}; +extern struct _s_nos_tick_ s_nos_tick; + +#if(TYPE_JIFFIES_5MS == D_sys_Jiffies) + #define HZ 200 +#elif(TYPE_JIFFIES_10MS == D_sys_Jiffies) + #define HZ 100 +#elif(TYPE_JIFFIES_25MS == D_sys_Jiffies) + #define HZ 40 +#endif +#define JIFFIES (1000/HZ) + +#define D_sys_now (s_nos_tick.jiffies) +//D_sys_delay_msec以jiffies为最小计时单位,jiffies是10ms为例,参数n=12ms时,最终延时了20ms +#define D_sys_delay_msec(n) do{ \ + if(n>0) \ + { \ + U32 mstmp = D_sys_now; \ + while(D_sys_now - mstmp < (((n)-1)/JIFFIES) + 1); \ + } \ + }while(0) + +#define D_Tdelay_Msec(n) (((n)-1) / JIFFIES + 1) +#define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) +#define D_Tdelay_5ms ((5-1) / JIFFIES + 1) +#define D_Tdelay_10ms ((10-1) / JIFFIES + 1) +#define D_Tdelay_20ms ((20-1) / JIFFIES + 1) +#define D_Tdelay_50ms ((50-1) / JIFFIES + 1) + +#define D_Tdelay_100ms ((100-1) / JIFFIES + 1) +#define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) +#define D_Tdelay_300ms ((300-1) / JIFFIES + 1) +#define D_Tdelay_400ms ((400-1) / JIFFIES + 1) +#define D_Tdelay_500ms ((500-1) / JIFFIES + 1) + +#define D_Tdelay_1s (1 * HZ) +#define D_Tdelay_2s (2 * HZ) +#define D_Tdelay_3s (3 * HZ) +#define D_Tdelay_4s (4 * HZ) +#define D_Tdelay_5s (5 * HZ) +#define D_Tdelay_10s (10 * HZ) +#define D_Tdelay_15s (15 * HZ) + +#define D_Tdelay_1min (1 * 60 * HZ) +#define D_Tdelay_10min (10 * 60 * HZ) +#define D_Tdelay_1h (60 * 60 * HZ) +#define D_Tdelay_1day (24 * 60 * 60 * HZ) + + +//必须配对 +#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms +#define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_50ms - start_n) + + +#define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s +#define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n) + + +//>>>//必须配对 +#define L2_tick_time_stamp(time_stamp) time_stamp = s_nos_tick.t_50ms; +#define L2_tick_time_interval(time_stamp,time_overflow) (( s_nos_tick.t_50ms - time_stamp) > time_overflow) + + +#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x) +#define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); + +extern void L1_tick_init(void); +extern void L1_tick_tick (void); + +#endif /* end __tick_H */ +/***************************************************************************** +** End Of File +******************************************************************************/ diff --git a/source/msp/eeprom.h b/source/msp/eeprom.h index e8bbf92..c2310cb 100644 --- a/source/msp/eeprom.h +++ b/source/msp/eeprom.h @@ -21,7 +21,7 @@ #include "../clib/type.h" #include "../clib/clib.h" #include "../ctask/tick.h" -#include "uart0.h" +#include "msp_uart0.h" /** * EEPROM 存储结构 diff --git a/source/msp/UART0.C b/source/msp/mcu support/UART0.C similarity index 99% rename from source/msp/UART0.C rename to source/msp/mcu support/UART0.C index c158a2f..9bea919 100644 --- a/source/msp/UART0.C +++ b/source/msp/mcu support/UART0.C @@ -54,7 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart0.h" +#include "msp_uart0.h" #include "../msp/time.h" //#define _USE_485 @@ -154,7 +154,7 @@ void INTERRUPT_UART(void) D_SERVE_UART } //NOP(); NOP(); NOP(); } - +#if 0 void timer3_isrHanddle(void) D_SERVE_TIMER3 { struct _tp_handler_x *p1 = &s_uart0_rec; @@ -175,6 +175,6 @@ void timer3_isrHanddle(void) D_SERVE_TIMER3 L0_timer3_stop(); } - +#endif diff --git a/source/msp/UART2.C b/source/msp/mcu support/UART2.C similarity index 96% rename from source/msp/UART2.C rename to source/msp/mcu support/UART2.C index e746df4..ae3cde6 100644 --- a/source/msp/UART2.C +++ b/source/msp/mcu support/UART2.C @@ -54,7 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart2.h" +#include "msp_uart2.h" #include "../app/app_config.h" #include "../msp/time.h" @@ -135,8 +135,11 @@ void L1_uart_tpc_config(void) /************************************************* UART 中断 *************************************************/ -#define D_SERVE_uart2 interrupt 8 -void INTERRUPT_uart2(void) D_SERVE_uart2// using 2 +///#define D_SERVE_uart2 interrupt 8 +// using 2 +#define D_SERVE_UART2 interrupt 8 +///void INTERRUPT_uart2(void) D_SERVE_uart2 +void INTERRUPT_uart2(void) interrupt 8 { //NOP(); NOP(); NOP(); if(L0_uart2_IntRI()) //如果是U2接收中断 diff --git a/source/msp/UART2.h b/source/msp/mcu support/UART2.h similarity index 99% rename from source/msp/UART2.h rename to source/msp/mcu support/UART2.h index cf66fe8..d3bb23c 100644 --- a/source/msp/UART2.h +++ b/source/msp/mcu support/UART2.h @@ -57,7 +57,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../tpc/at0d0a.h" #include "../tpc/modbus.h" -#include "uart_x.h" +#include "msp_uart_x.h" #include "../tpc/ccmodbus.h" #define uNum2 1 diff --git a/source/msp/UART4.h b/source/msp/mcu support/UART4.h similarity index 100% rename from source/msp/UART4.h rename to source/msp/mcu support/UART4.h diff --git a/source/msp/uart_x.c b/source/msp/mcu support/uart_x.c similarity index 99% rename from source/msp/uart_x.c rename to source/msp/mcu support/uart_x.c index bdda560..57210d8 100644 --- a/source/msp/uart_x.c +++ b/source/msp/mcu support/uart_x.c @@ -54,7 +54,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart_x.h" +#include "msp_uart_x.h" TS_uart_reg idata ts_uart[SERIAL_MAX_NUM] = {0}; diff --git a/source/msp/msp_uart0.C b/source/msp/msp_uart0.C new file mode 100644 index 0000000..014d7b4 --- /dev/null +++ b/source/msp/msp_uart0.C @@ -0,0 +1,187 @@ +////////////////////////////////////////////////////////////////////////// +/// 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 +//putchar字符发送函数重定向 +extern char putchar(char c) +{ + ///PrintData1(c); + L0_uart0_sendArray(&c,1); + return c; +} + + diff --git a/source/msp/UART0.h b/source/msp/msp_uart0.h similarity index 95% rename from source/msp/UART0.h rename to source/msp/msp_uart0.h index 29caea2..4a8af1c 100644 --- a/source/msp/UART0.h +++ b/source/msp/msp_uart0.h @@ -54,9 +54,9 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #define _uart0_H #include "../bsp/bsp_config.h" #include "../tpc/modbus.h" -#include "uart_x.h" -#include "../msp/uart2.h" -#include "../msp/uart3.h" +#include "msp_uart_x.h" +#include "../msp/msp_uart2.h" +///#include "../msp/msp_uart3.h" //#include "../tpc/tpc_x.h" #define uNum0 0 @@ -80,7 +80,7 @@ void L0_uart0_sendArray(U8 * buf, U16 len); #define L0_uart0_ushex(X) L0_uartN_ushex(uNum0,X) #define L0_uart0_ulhex(X) L0_uartN_ulhex(uNum0,X) #define L0_uart0_sendstr(buf) L0_uartN_sendstr(uNum0,buf) -#define L1_uart0_uchexArray(buf) L1_uartN_uchexArray(uNum0,buf) +#define L1_uart0_uchexArray(buf,n) L1_uartN_uchexArray(uNum0,buf,n) extern TP_Handler_X s_uart0_rec; extern TS_PH4_modbus s_uart0_ack; diff --git a/source/msp/msp_uart2.C b/source/msp/msp_uart2.C new file mode 100644 index 0000000..3a6232e --- /dev/null +++ b/source/msp/msp_uart2.C @@ -0,0 +1,183 @@ +////////////////////////////////////////////////////////////////////////// +/// 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_uart2.h" +#include "../app/app_config.h" +#include "../msp/time.h" + +//#define _USE_485 + +static volatile Ts_uart_send_buf idata ts_uart2_send_shop; +//TP_Handler_X s_uart2_rec; +//TS_PH4_modbus s_uart2_ack; +struct _s_PC1_0D0A_ s_uart2_at; +TS_Handle_PH3 s_uart2_tcp_rec; +void (*Lp0_uart2_fun)(unsigned char sbufreg); + +void L0_uart2_init(void) +{ + S2CON = 0x50; //8位数据,可变波特率 + AUXR &= 0xFB; //定时器时钟12T模式 + T2L = 0xFC; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +} + +void L0_uart2_buf_init(void) +{ + s_uart2_at.head = 0; + s_uart2_at.ok = 0; + s_uart2_at.num = 0; + + ts_uart[uNum2].p = &ts_uart2_send_shop; + ts_uart[uNum2].p->now = 0; + ts_uart[uNum2].p->ok = D_ready; + //ts_uart[uNum2].t = &s_uart2_rec; + ts_uart[uNum2].t->head = 0; + ts_uart[uNum2].t->ok = 0; + ts_uart[uNum2].tp_handler = NULL; + //ts_uart[uNum2].ack = (U8*)&s_uart2_ack; + L0_uart2_init(); + D_uart2_ES_INT(1); //打开串口中断 + + + //配置串口对应的操作协议 + L1_uart_tpc_config(); + +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart2_sendArray(U8 * buf, U16 len) +{ +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_TX() //切换到输出状态 +#endif + L0_uartN_sendArray(uNum2,buf,len); +} +void L1_s2b_gm35(unsigned char sbufreg) +{ + s_uart2_tcp_rec.reg = sbufreg; + L1_s2b_PH3(&s_uart2_tcp_rec); + if(0 == s_uart2_tcp_rec.head) + { + s_uart2_at.reg = sbufreg; + L1_s2b_0d0a(&s_uart2_at); + } + else + { + s_uart2_at.head = 0; + } +} +void L1_uart_tpc_config(void) +{ + s_uart2_tcp_rec.head = 0; + s_uart2_tcp_rec.ok = 0; + s_uart2_tcp_rec.head_0 = D_CMD_Filter1_ff; + s_uart2_tcp_rec.head_1 = D_CMD_Filter2_fe; + s_uart2_tcp_rec.sp = (U8*)&(s_uart2_tcp_rec.ts_ccmodbus); +} + +/************************************************* +UART 中断 +*************************************************/ +///#define D_SERVE_uart2 interrupt 8 +void INTERRUPT_uart2(void) interrupt 8 ///D_SERVE_uart2// using 2 +{ + //NOP(); NOP(); NOP(); + if(L0_uart2_IntRI()) //如果是U2接收中断 + { + //LED1 ^= 1; + L0_uart2_IntRIClear(); //清除接收中断标志 + //ts_uart[uNum2].t->reg = L0_uartN_get(uNum2); + //ts_uart[uNum2].tp_handler(ts_uart[uNum2].t); + //s_uart2_at.reg = L0_uartN_get(uNum2); + //L1_s2b_0d0a(&s_uart2_at); + L1_s2b_gm35(L0_uart2_get()); + } + if(L0_uart2_IntTI()) //如果是U0发送中断 + { + L0_uart2_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now) + { + S2BUF = ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]; + //L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]); + ts_uart[uNum2].p->now ++; + } + else + { + ts_uart[uNum2].p->ok = D_ready; + ts_uart[uNum2].p->max = 0; + ts_uart[uNum2].p->now = 0;//可以发送下一个数据 +#if (D_UART2_485_TYPE != TYPE_485_NONE) + D_UART2_485_RX() //切换到接收状态 +#endif + + } + } + //NOP(); NOP(); NOP(); +} + + + + + + + + + + diff --git a/source/msp/msp_uart2.h b/source/msp/msp_uart2.h new file mode 100644 index 0000000..d3bb23c --- /dev/null +++ b/source/msp/msp_uart2.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////// +/// 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: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +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_uart2_Init + uart2_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart2_H +#define _uart2_H + +#include "../bsp/bsp_config.h" + +#include "../tpc/at0d0a.h" +#include "../tpc/modbus.h" +#include "msp_uart_x.h" +#include "../tpc/ccmodbus.h" + +#define uNum2 1 + +#define D_uart2_ES_INT(x) (x) ? (BITN_1(IE2,ES2)) : (BITN_0(IE2,ES2)) +#define L0_uart2_IntRI() (S2CON & S2RI)//BITN_G(SCON,U0RI) +#define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI) +#define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) +#define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) +#define L0_uart2_get() (S2BUF) + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +void L0_uart2_buf_init(void); +void L0_uart2_sendArray(U8 * buf, U16 len); +void uart2_Handdle(void); +#define L0_uart2_uc(X) L0_uartN_uc(uNum2,X) +#define L0_uart2_us(X) L0_uartN_us(uNum2,X) +#define L0_uart2_ul(X) L0_uartN_ul(uNum2,X) +#define L0_uart2_0d0a() L0_uartN_0d0a(0) +#define L0_uart2_uchex(X) L0_uartN_uchex(uNum2,X) +#define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X) +#define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X) +#define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf) +//extern TP_Handler_X s_uart2_rec; +//extern TS_PH4_modbus s_uart2_ack; +extern TS_Handle_0d0a s_uart2_at; +extern TS_Handle_PH3 s_uart2_tcp_rec; +extern void (*Lp0_uart2_fun)(unsigned char sbufreg); + +extern void L1_uart_tpc_config(void); + +#endif //#ifndef _uart2_H + diff --git a/source/msp/UART3.c b/source/msp/msp_uart3.c similarity index 93% rename from source/msp/UART3.c rename to source/msp/msp_uart3.c index 383bf45..3b63afe 100644 --- a/source/msp/UART3.c +++ b/source/msp/msp_uart3.c @@ -54,11 +54,11 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 L0_Usend_uc------UserDef ----------------------------------------------------------------------------------------- ********************************************************************************/ -#include "uart3.h" +#include "msp_uart3.h" #include "../msp/time.h" #include -static volatile Ts_uart_send_buf idata ts_uart_send_shop; +static volatile Ts_uart_send_buf idata ts_uart3_send_shop; struct _tp_handler_x s_uart3_rec; TS_PH4_modbus s_uart3_ack; @@ -80,18 +80,27 @@ void L0_uart3_init(void) // T3H = 0xFF; //设定定时初值 // T4T3M |= 0x08; //启动定时器3 //#endif - +#if 0 S3CON = 0x10; //8位数据,可变波特率 S3CON &= 0xBF; //串口3选择定时器2为波特率发生器 AUXR |= 0x04; //定时器时钟1T模式 T2L = 0xD0; //设置定时初始值 T2H = 0xFF; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 +#endif +//115200 + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M |= 0x02; //定时器时钟1T模式 + T3L = 0xD0; //设置定时初始值 + T3H = 0xFF; //设置定时初始值 + T4T3M |= 0x08; //定时器3开始计时 + } void L0_uart3_buf_init(void) { - ts_uart[uNum3].p = &ts_uart_send_shop; + ts_uart[uNum3].p = &ts_uart3_send_shop; ts_uart[uNum3].p->now = 0; ts_uart[uNum3].p->ok = D_ready; ts_uart[uNum3].t = &s_uart3_rec; diff --git a/source/msp/UART3.h b/source/msp/msp_uart3.h similarity index 96% rename from source/msp/UART3.h rename to source/msp/msp_uart3.h index eb4bb28..fd535d4 100644 --- a/source/msp/UART3.h +++ b/source/msp/msp_uart3.h @@ -55,7 +55,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../bsp/bsp_config.h" #include "../tpc/modbus.h" -#include "uart_x.h" +#include "msp_uart_x.h" #define uNum3 2 @@ -73,8 +73,8 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -void L0_uart3_buf_init(void); -void L0_uart3_sendArray(U8 * buf, U16 len); +extern void L0_uart3_buf_init(void); +extern void L0_uart3_sendArray(U8 * buf, U16 len); #define L0_uart3_uc(X) L0_uartN_uc(uNum3,X) #define L0_uart3_us(X) L0_uartN_us(uNum3,X) diff --git a/source/msp/msp_uart_x.c b/source/msp/msp_uart_x.c new file mode 100644 index 0000000..c4cc12e --- /dev/null +++ b/source/msp/msp_uart_x.c @@ -0,0 +1,236 @@ +////////////////////////////////////////////////////////////////////////// +/// 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相关 缓存发送也放在里面idata + L0_UART0_Init + UART0_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ +#include "msp_uart_x.h" + +TS_uart_reg 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 10 //发送数据特别快时,某些情况下会导致数据发送出错 + if(ts_uart[uartx].p->over ++ > 6000000) + { + 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= D_UART_send_buf_max) + { + len = D_UART_send_buf_max - 1; + + } + Lc_hex2ascii(ts_uart[uartx].p->bufhex,buf,len); + L0_uartN_sendArray(uartx,ts_uart[uartx].p->bufhex,len*3); +} + +#endif + diff --git a/source/msp/uart_x.h b/source/msp/msp_uart_x.h similarity index 96% rename from source/msp/uart_x.h rename to source/msp/msp_uart_x.h index 4c060e3..05d7713 100644 --- a/source/msp/uart_x.h +++ b/source/msp/msp_uart_x.h @@ -56,6 +56,7 @@ msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 #include "../tpc/tpc_x.h" #include "../bsp/bsp_config.h" + #define D_uartN_free() (0 == ts_uart_send_shop[uartx].max) #define D_uartN_busy() (0 != ts_uart_send_shop[uartx].max) #define D_BRT_COUNT(t,clk,uartBRT) (U16)(65536- (clk / (4 * uartBRT * t))) @@ -70,6 +71,7 @@ typedef struct _ts_uart0_send_buf_ vU32 over; /// 结束等待标志,over累加到某个值时,结束等待 vU8 ok; /// 发送完成标志 vU8 buf[D_UART_send_buf_max + 1]; + /// U8 bufhex[D_UART_send_buf_max*3]; /// U8 buf2[D_send_buf2_max]; vU8 buf3[D_UART_send_buf2_max]; //// U8 buf4[D_send_buf_max]; @@ -78,6 +80,7 @@ typedef struct _ts_uart0_send_buf_ typedef struct _TS_uart_reg { + ////Ts_uart_send_buf *p; Ts_uart_send_buf idata *p; TP_Handler_X *t; void (*tp_handler)(TP_Handler_X *); @@ -85,7 +88,7 @@ typedef struct _TS_uart_reg }TS_uart_reg; -extern TS_uart_reg idata ts_uart[SERIAL_MAX_NUM]; +extern TS_uart_reg ts_uart[SERIAL_MAX_NUM];///cc:fixme idata不要过多的使用 extern void L0_uartN_init(U8 uartx); extern void L0_uartN_set(U8 uartx,U8 x); diff --git a/source/msp/nouse/msp_uart3.c b/source/msp/nouse/msp_uart3.c new file mode 100644 index 0000000..4a05f9d --- /dev/null +++ b/source/msp/nouse/msp_uart3.c @@ -0,0 +1,184 @@ +////////////////////////////////////////////////////////////////////////// +/// 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/msp_uart3.h" +#include "../msp/time.h" +#include + +static volatile Ts_uart_send_buf idata ts_uart3_send_shop; +struct _tp_handler_x s_uart3_rec; +TS_PH4_modbus s_uart3_ack; + +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 |= 0x02; //定时器3时钟为Fosc,即1T +// T3L = 0xD0; //设定定时初值 +// T3H = 0xFF; //设定定时初值 +// T4T3M |= 0x08; //启动定时器3 +//#endif +#if 0 + S3CON = 0x10; //8位数据,可变波特率 + S3CON &= 0xBF; //串口3选择定时器2为波特率发生器 + AUXR |= 0x04; //定时器时钟1T模式 + T2L = 0xD0; //设置定时初始值 + T2H = 0xFF; //设置定时初始值 + AUXR |= 0x10; //定时器2开始计时 +#endif +//512000 + S3CON = 0x10; //8位数据,可变波特率 + S3CON |= 0x40; //串口3选择定时器3为波特率发生器 + T4T3M &= 0xFD; //定时器时钟12T模式 + T3L = 0xFF; //设置定时初始值 + T3H = 0xFF; //设置定时初始值 + T4T3M |= 0x08; //定时器3开始计时 +} + +void L0_uart3_buf_init(void) +{ + ts_uart[uNum3].p = &ts_uart3_send_shop; + ts_uart[uNum3].p->now = 0; + ts_uart[uNum3].p->ok = D_ready; + ts_uart[uNum3].t = &s_uart3_rec; + ts_uart[uNum3].t->head = 0; + ts_uart[uNum3].t->ok = 0; + ts_uart[uNum3].tp_handler = L1_s2b_PH4; + ts_uart[uNum3].ack = (U8*)&s_uart3_ack; + L0_uart3_init(); + //D_uart3_ES_INT_OPEN(); //打开串口中断 + D_uart3_ES_INT(1); //打开串口中断 + +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //默认处于接收状态 +#endif +} + +void L0_uart3_sendArray(U8 * buf, U16 len) +{ +//#if (D_UART3_485_TYPE != TYPE_485_NONE) +// D_UART3_485_TX() //切换到输出状态 +//#endif + L0_uartN_sendArray(uNum3,buf,len); +} + +/************************************************* +UART 中断 +*************************************************/ +#define D_SERVE_UART3 interrupt 17 +void INTERRUPT_UART3(void) D_SERVE_UART3// using 3 +{ + NOP(); NOP(); NOP(); + if(L0_uart3_IntRI()) //如果是U0接收中断 + { + L0_uart3_IntRIClear(); //清除接收中断标志 + ts_uart[uNum3].t->reg = L0_uartN_get(uNum3); + ts_uart[uNum3].tp_handler(ts_uart[uNum3].t); + //L0_timer4_start(); + } + if(L0_uart3_IntTI()) + { + if(L0_uart3_IntTI()) //如果是U0发送中断 + { + L0_uart3_IntTIClear(); //清除发送中断标志 + if(ts_uart[uNum3].p->max != ts_uart[uNum3].p->now) + { + L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]); + ts_uart[uNum3].p->now ++; + } + else + { + ts_uart[uNum3].p->ok = D_ready; + ts_uart[uNum3].p->max = 0; + ts_uart[uNum3].p->now = 0;//可以发送下一个数据 +#if (D_UART3_485_TYPE != TYPE_485_NONE) + D_UART3_485_RX() //切换到接收状态 +#endif + } + } + } + NOP(); NOP(); NOP(); +} + +void timer4_isrHanddle(void) D_SERVE_TIMER4 +{ + struct _tp_handler_x *p = &s_uart3_rec; + if((p->head == 1) && (p->num >= D_s_modbus_min)) + { + 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]) + { + if(p->ok == 0) + { + p->ok = 1; + } + } + //LED0 ^= 1; + } + L0_timer4_stop(); +} + + diff --git a/source/msp/nouse/msp_uart3.h b/source/msp/nouse/msp_uart3.h new file mode 100644 index 0000000..fd535d4 --- /dev/null +++ b/source/msp/nouse/msp_uart3.h @@ -0,0 +1,93 @@ +////////////////////////////////////////////////////////////////////////// +/// 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: +////////////////////////////////////////////////////////////////////////// +/***************************************************************************** +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_uart3_Init + uart3_IRQHandler + L0_Usend_uc------UserDef +----------------------------------------------------------------------------------------- +********************************************************************************/ + + +#ifndef _uart3_H +#define _uart3_H + +#include "../bsp/bsp_config.h" +#include "../tpc/modbus.h" +#include "msp_uart_x.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) + + +//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +extern void L0_uart3_buf_init(void); +extern void L0_uart3_sendArray(U8 * buf, U16 len); + +#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 L1_uart3_uchexArray(buf) L1_uartN_uchexArray(uNum3,buf) + +extern TP_Handler_X s_uart3_rec; +extern TS_PH4_modbus s_uart3_ack; + +#endif //#ifndef _uart3_H + diff --git a/source/msp/UART4.C b/source/msp/nouse/msp_uart4.C similarity index 100% rename from source/msp/UART4.C rename to source/msp/nouse/msp_uart4.C diff --git a/source/tpc/ccmodbus.c b/source/tpc/ccmodbus.c index f8ff9be..1f2f7ae 100644 --- a/source/tpc/ccmodbus.c +++ b/source/tpc/ccmodbus.c @@ -98,7 +98,7 @@ U8 L3_pack_ccmodbus_90(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) pmodbus->buf[1] = APP_VERSION_HEX >> 0 & 0xF; //minor version pmodbus->buf[2] = 0x00; //mq high pmodbus->buf[3] = 0x04; //mq low - pmodbus->buf[4] = 0x00; // + pmodbus->buf[4] = 0x00; // for(i=5;ibuf[i] = G.mcu_id[j]; @@ -124,7 +124,7 @@ U8 L3_pack_ccmodbus_92(TS_PH3_ccmodbus *pmodbus ,U8 slaverId) U8 L3_pack_ccmodbus(TS_PH3_ccmodbus *pccmodbus, CCMD_SLAVER_INFO *slaver_info) { - U8 pkglen = 0; + U16 pkglen = 0; pccmodbus->filter1 = D_CMD_Filter1_ff; pccmodbus->filter2 = D_CMD_Filter2_fe; switch(slaver_info->oper) diff --git a/source/tpc/ccmodbus.h b/source/tpc/ccmodbus.h index 9130a0a..f10ae56 100644 --- a/source/tpc/ccmodbus.h +++ b/source/tpc/ccmodbus.h @@ -62,7 +62,7 @@ msp/uartx.c 底层代码 和cpu相关 /// 协议表达的意思为地址为0x52的从机, 功能码16 数据为11 22 33 44,校验码 F5 9F /// 校验码的范围为 -#define D_s_PH3_ccmodbus_max 128 +#define D_s_PH3_ccmodbus_max 256////cc fixme #define D_s_ccmodbus_min (D_s_modbus_min + 3) #define D_CMD_Filter1_ff 0xFF #define D_CMD_Filter2_fe 0xFE