Communication.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234
  1. /* -------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen ---------------------------*/
  2. /* File Name : Communication.c
  3. /* Author : Fortiortech Appliction Team
  4. /* Version : V1.0
  5. /* Date : 2020-04-09
  6. /* Description : This file contains XX-XX-XX function used for Motor Control.
  7. /* ----------------------------------------------------------------------------------------------*/
  8. /* All Rights Reserved
  9. /* ----------------------------------------------------------------------------------------------*/
  10. #include "FU68xx_5.h"
  11. #include <Myproject.h>
  12. #include <Communication.h>
  13. /************** Private variables *********************/
  14. //MCUART xdata ubf_status;
  15. #if (Debugg==1)
  16. void CMDMONI_WT_INIT(void);
  17. static int zop_cmdcheck(void);
  18. static int zop_dummy(void);
  19. static int zop_cmd00(void);
  20. static int zop_cmd01(void);
  21. static int zop_cmd02(void);
  22. static int zop_cmd03(void);
  23. static int zop_cmd04(void);
  24. static int zop_cmd05(void);
  25. static int zop_cmd06(void);
  26. static int zop_cmd07(void);
  27. static int zop_cmd08(void);
  28. static int zop_cmd09(void);
  29. static int zop_cmd0A(void);
  30. static unsigned char zop_CalcCheckSum(unsigned char * p, int cnt);
  31. static void zop_ClearSendCmdBuffer(void);
  32. static void zop_PressSend(int cnt);
  33. static void zop_ComCmdCheck(int id, int ctp);
  34. static void zop_SetGetTraceData(void);
  35. static void zop_trig_check(int trig_ch, int trig_mode);
  36. static int zop_SetByteToInt(unsigned char * pByte);
  37. static int cmdmoni_getdata_size(int * adrs, char size);
  38. const uint16 LengthMask[4] = {127, 255, 511, 1023};
  39. unsigned char snd_ringbuf[SZ_SENDRINGBUF] = 0; //SZ_SENDRINGBUF
  40. int16 iRd = 0;
  41. int16 iWr = 0;
  42. unsigned char rcv_cmdbuf[SZ_RECVBUF] = 0; //SZ_RECVBUF
  43. unsigned char snd_cmdbuf[SZ_SENDBUF] = 0; //SZ_SENDBUF
  44. int buf_trace[SZ_TRACEBUF] = 0; //SZ_TRACEBUF
  45. int idy_trace = 0;
  46. int idy_copy_trace = 0;
  47. int iTraceCount = 0;
  48. uint16 iTraceCntMax = 0;
  49. uint16 iIntervalCount = 0;
  50. int16 iTraceID = 0;
  51. uint8 iReceiveCount = 0;
  52. int * ptr_adrs[CH_MAX] = 0; //CH_MAX
  53. char adrs_size[CH_MAX] = 0; //CH_MAX
  54. int iTrigLevel = 0;
  55. int iTrigDelay = 0;
  56. int itrig_cnt_delay = 0;
  57. int itrig_cnt_wait = 0;
  58. int itrig_data_old = 0;
  59. union UNION_STATUS xdata ubf_status;
  60. uint16 cnt_wt_timeout = 0;
  61. uint16 cnt_wt_timeout2 = 0; //
  62. void MD_WT_INTRE( void )
  63. {
  64. // REG_RESET();// 处理各种错误,如:针错误,数据超时等等
  65. }
  66. void MD_WT_INTR( void )
  67. {
  68. int iCmd = rcv_cmdbuf[0];
  69. rcv_cmdbuf[iReceiveCount] = UT_DR;
  70. iCmd = rcv_cmdbuf[0];
  71. iReceiveCount++;
  72. if (iReceiveCount >= SZ_RECVBUF)
  73. {
  74. iReceiveCount = 0;
  75. iRd = 0;
  76. iWr = 0;
  77. }
  78. }
  79. void senddeal(void)
  80. {
  81. int iCmd = 0;
  82. iCmd = rcv_cmdbuf[0];
  83. switch (iReceiveCount)
  84. {
  85. case RCVCMD6:
  86. if (iCmd == 0x01)
  87. {
  88. zop_cmd01();
  89. iReceiveCount = 0;
  90. break;
  91. }
  92. if (iCmd == 0x05)
  93. {
  94. zop_cmd05();
  95. iReceiveCount = 0;
  96. break;
  97. }
  98. if (iCmd == 0x07)
  99. {
  100. zop_cmd07();
  101. iReceiveCount = 0;
  102. break;
  103. }
  104. if (iCmd == 0x0A)
  105. {
  106. zop_cmd0A();
  107. iReceiveCount = 0;
  108. break;
  109. }
  110. break;
  111. case RCVCMD9:
  112. if (iCmd == 0x03)
  113. {
  114. zop_cmd03();
  115. iReceiveCount = 0;
  116. break;
  117. }
  118. if (iCmd == 0x09)
  119. {
  120. zop_cmd09();
  121. iReceiveCount = 0;
  122. break;
  123. }
  124. break;
  125. case RCVCMD11:
  126. if (iCmd == 0x06)
  127. {
  128. zop_cmd06();
  129. iReceiveCount = 0;
  130. }
  131. break;
  132. case RCVCMD14:
  133. if (iCmd == 0x04)
  134. {
  135. zop_cmd04();
  136. iReceiveCount = 0;
  137. }
  138. break;
  139. case RCVCMD16:
  140. if (iCmd == 0x08)
  141. {
  142. zop_cmd08();
  143. iReceiveCount = 0;
  144. }
  145. break;
  146. }
  147. return;
  148. }
  149. static void CMDMONI_WT_TRACEHALT(void)
  150. {
  151. if (ubf_status.bf.halt_trace == 0)
  152. {
  153. ubf_status.bf.halt_trace = 1;
  154. idy_copy_trace = idy_trace;
  155. }
  156. }
  157. static int cmdmoni_getdata_size(int * adrs, char size)
  158. {
  159. switch (size)
  160. {
  161. case 1:
  162. {
  163. char * ptr = (char *)(adrs);
  164. return ((int)(*ptr));
  165. }
  166. break;
  167. case 2:
  168. {
  169. short * ptr = (short *)(adrs);
  170. return ((int)(*ptr));
  171. }
  172. break;
  173. case 4:
  174. return ((int)(*adrs));
  175. break;
  176. default:
  177. return ((int)(*adrs));
  178. break;
  179. }
  180. }
  181. int16 xdata GPFCON1 _at_ 0x000C2; //IA
  182. int16 xdata GPFCON2 _at_ 0x000C4; //IB
  183. int16 xdata GPFCON3 _at_ 0x000C6; //UD
  184. int16 xdata GPFCON4 _at_ 0x000C8; //UQ
  185. int16 xdata GPFCON5 _at_ 0x000CA; //角度
  186. int16 xdata GPFCON6 _at_ 0x000A2; //母线电压
  187. int16 xdata GPFCON7 _at_ 0x000A4; //给定转速
  188. int16 xdata GPFCON8 _at_ 0x000A6; //反馈转速
  189. int16 xdata GPFCON9 _at_ 0x000A8; //ipm温度
  190. int16 xdata GPFCON10 _at_ 0x000AA; //开关机转太
  191. /*根据所获得的地址设至相应的发送数据*/
  192. void CMDMONI_WT_TRACEWATCH(void)
  193. {
  194. int msk = 0;
  195. int iBase = 0;
  196. int itrig_data_new;
  197. {
  198. if (iIntervalCount < ubf_status.bf.interval)
  199. {
  200. iIntervalCount++;
  201. return;
  202. }
  203. else
  204. {
  205. iIntervalCount = 0;
  206. }
  207. }
  208. switch (adrs_size[ubf_status.bf.ch_trig])
  209. {
  210. case 1:
  211. {
  212. char * ptr = (char *)(ptr_adrs[ubf_status.bf.ch_trig]);
  213. itrig_data_new = (int)(*ptr);
  214. }
  215. break;
  216. case 2:
  217. {
  218. short * ptr = (short *)(ptr_adrs[ubf_status.bf.ch_trig]);
  219. itrig_data_new = (int)(*ptr);
  220. }
  221. break;
  222. case 4:
  223. itrig_data_new = (int)(*ptr_adrs[ubf_status.bf.ch_trig]);
  224. break;
  225. }
  226. if (ubf_status.bf.halt_trace == 0)
  227. {
  228. msk = LengthMask[(ubf_status.bf.len_trace & 0x03)];
  229. switch (ubf_status.bf.ch_trace)
  230. {
  231. case 0:
  232. iBase = idy_trace;
  233. #if BIGENDIAN
  234. buf_trace[iBase + 0] = cmdmoni_getdata_size(ptr_adrs[0], adrs_size[0]);
  235. #else
  236. buf_trace[iBase + 0] = 25122; //*( int16 xdata *)(ptr_adrs[0]); //*ptr_adrs[0];//*ptr_adrs[0]:所放数据的地址
  237. #endif
  238. idy_trace++;
  239. idy_trace &= msk;
  240. break;
  241. case 1:
  242. iBase = idy_trace + idy_trace;
  243. #if BIGENDIAN
  244. buf_trace[iBase + 0] = cmdmoni_getdata_size(ptr_adrs[0], adrs_size[0]);
  245. buf_trace[iBase + 1] = cmdmoni_getdata_size(ptr_adrs[1], adrs_size[1]);
  246. #else
  247. // GPFCON1=FOC__IA;
  248. // GPFCON2=FOC__IB;
  249. buf_trace[iBase + 0] = *(( int16 xdata *)ptr_adrs[0]);//*(( uint8 xdata *)0x000C2);//*( int16 xdata *)(ptr_adrs[0]); //*ptr_adrs[0];
  250. buf_trace[iBase + 1] = *(( int16 xdata *)ptr_adrs[1]);//*(( int16 xdata *)0x000A2);//( int16 xdata *)ojhgt;//*( int16 xdata *)(ptr_adrs[1]);//*ptr_adrs[1];
  251. #endif
  252. idy_trace++;
  253. idy_trace &= msk;
  254. break;
  255. case 2:
  256. iBase = idy_trace + idy_trace + idy_trace;
  257. #if BIGENDIAN
  258. buf_trace[iBase + 0] = cmdmoni_getdata_size(ptr_adrs[0], adrs_size[0]);
  259. buf_trace[iBase + 1] = cmdmoni_getdata_size(ptr_adrs[1], adrs_size[1]);
  260. buf_trace[iBase + 2] = cmdmoni_getdata_size(ptr_adrs[2], adrs_size[2]);
  261. #else
  262. buf_trace[iBase + 0] = FOC__IA;//*( int16 xdata *)(ptr_adrs[0]);//*ptr_adrs[0];
  263. buf_trace[iBase + 1] = FOC__IB;//*( int16 xdata *)(ptr_adrs[1]);//*ptr_adrs[1];
  264. buf_trace[iBase + 2] = FOC__IC;//*( int16 xdata *)(ptr_adrs[2]);//*ptr_adrs[2];
  265. #endif
  266. idy_trace++;
  267. idy_trace &= msk;
  268. break;
  269. case 3:
  270. iBase = idy_trace + idy_trace + idy_trace + idy_trace;
  271. #if BIGENDIAN
  272. buf_trace[iBase + 0] = cmdmoni_getdata_size(ptr_adrs[0], adrs_size[0]);
  273. buf_trace[iBase + 1] = cmdmoni_getdata_size(ptr_adrs[1], adrs_size[1]);
  274. buf_trace[iBase + 2] = cmdmoni_getdata_size(ptr_adrs[2], adrs_size[2]);
  275. buf_trace[iBase + 3] = cmdmoni_getdata_size(ptr_adrs[3], adrs_size[3]);
  276. #else
  277. buf_trace[iBase + 0] = *( int16 xdata *)(ptr_adrs[0]);//*ptr_adrs[0];
  278. buf_trace[iBase + 1] = *( int16 xdata *)(ptr_adrs[1]);//*ptr_adrs[1];
  279. buf_trace[iBase + 2] = *( int16 xdata *)(ptr_adrs[2]); //*ptr_adrs[2];
  280. buf_trace[iBase + 3] = *( int16 xdata *)(ptr_adrs[3]);//*ptr_adrs[3];
  281. #endif
  282. idy_trace++;
  283. idy_trace &= msk;
  284. break;
  285. }
  286. itrig_cnt_wait++;
  287. if (itrig_cnt_wait > (msk * 2))
  288. {
  289. itrig_cnt_wait = msk * 2;
  290. if ((0 == ubf_status.bf.triggered) && (0 != ubf_status.bf.trig_en))
  291. {
  292. switch (ubf_status.bf.type_trig)
  293. {
  294. case 0: // rise
  295. if ((itrig_data_new >= iTrigLevel) && (itrig_data_old < iTrigLevel))
  296. {
  297. ubf_status.bf.triggered = 1;
  298. }
  299. break;
  300. case 1: // fall
  301. if ((itrig_data_new <= iTrigLevel) && (itrig_data_old > iTrigLevel))
  302. {
  303. ubf_status.bf.triggered = 1;
  304. }
  305. break;
  306. case 2: // rise & fall
  307. if (itrig_data_new >= iTrigLevel)
  308. {
  309. if (itrig_data_old < iTrigLevel)
  310. {
  311. ubf_status.bf.triggered = 1;
  312. }
  313. }
  314. else
  315. {
  316. if (itrig_data_old > iTrigLevel)
  317. {
  318. ubf_status.bf.triggered = 1;
  319. }
  320. }
  321. break;
  322. default: // no
  323. break;
  324. }
  325. }
  326. }
  327. if (0 != ubf_status.bf.triggered)
  328. {
  329. itrig_cnt_delay++;
  330. if (itrig_cnt_delay >= iTrigDelay)
  331. {
  332. CMDMONI_WT_TRACEHALT();
  333. return;
  334. }
  335. }
  336. }
  337. else
  338. {
  339. ubf_status.bf.triggered = 0;
  340. itrig_cnt_delay = 0;
  341. itrig_cnt_wait = 0;
  342. if (0 == ubf_status.bf.trig_normal)
  343. {
  344. ubf_status.bf.trig_en = 0;
  345. }
  346. }
  347. itrig_data_old = itrig_data_new;
  348. }
  349. void CMDMONI_WT_1MS(void)
  350. {
  351. if (iReceiveCount > 0)
  352. {
  353. cnt_wt_timeout++;
  354. }
  355. else
  356. {
  357. cnt_wt_timeout = 0;
  358. }
  359. }
  360. static void zop_ComCmdCheck(int id, int ctp)
  361. {
  362. snd_cmdbuf[0] = 0x8A;
  363. snd_cmdbuf[1] = 0x04;
  364. snd_cmdbuf[2] = id;
  365. snd_cmdbuf[3] = 0x00;
  366. snd_cmdbuf[4] = ctp;
  367. snd_cmdbuf[5] = zop_CalcCheckSum(snd_cmdbuf, 5);
  368. zop_PressSend(6);
  369. }
  370. static int zop_SetByteToInt(unsigned char * pByte)
  371. {
  372. union UNION_INT iDATA;
  373. #if BIGENDIAN
  374. iDATA.b[0] = *(pByte + 3);
  375. iDATA.b[1] = *(pByte + 2);
  376. iDATA.b[2] = *(pByte + 1);
  377. iDATA.b[3] = *(pByte + 0);
  378. #else
  379. iDATA.b[0] = *(pByte + 0);
  380. iDATA.b[1] = *(pByte + 1);
  381. iDATA.b[2] = *(pByte + 2);
  382. iDATA.b[3] = *(pByte + 3);
  383. #endif
  384. return iDATA.i;
  385. }
  386. // Hello
  387. // RE[6]: 01H,04H,id,00H,00H,CS
  388. // TX[8]: 81H,06H,id,STATUS(4),CS
  389. static int zop_cmd01(void)
  390. {
  391. uint8 cnt = RCVCMD6 - 1;
  392. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  393. if (rcv_cmdbuf[cnt] != sum)
  394. {
  395. return 0;
  396. }
  397. snd_cmdbuf[0] = 0x81;
  398. snd_cmdbuf[1] = 0x06;
  399. snd_cmdbuf[2] = rcv_cmdbuf[2];
  400. #if BIGENDIAN
  401. snd_cmdbuf[3] = ubf_status.b[0];
  402. snd_cmdbuf[4] = ubf_status.b[1];
  403. snd_cmdbuf[6] = ubf_status.b[2];
  404. snd_cmdbuf[5] = ubf_status.b[3];
  405. #else
  406. snd_cmdbuf[3] = ubf_status.b[3];
  407. snd_cmdbuf[4] = ubf_status.b[2];
  408. snd_cmdbuf[6] = ubf_status.b[1];
  409. snd_cmdbuf[5] = ubf_status.b[0];
  410. #endif
  411. snd_cmdbuf[7] = zop_CalcCheckSum(snd_cmdbuf, 7);
  412. zop_PressSend(8);
  413. return 1;
  414. }
  415. static int zop_cmd02(void)
  416. {
  417. return 0;
  418. }
  419. // Read
  420. // RE[9]: 03H,07H,id,00H,ADRESS(4),CS
  421. // TX[13]: 83H,0BH,id,00H,ADRESS(4),DATA(4),CS
  422. static int zop_cmd03(void)
  423. {
  424. union UNION_DWORD xdata dwAdrs;
  425. union UNION_INT xdata iDATA;
  426. union UNION_INT xdata iDATA2;
  427. uint8 cnt = RCVCMD9 - 1;
  428. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  429. if (rcv_cmdbuf[cnt] != sum)
  430. {
  431. return 0;
  432. }
  433. dwAdrs.dw = zop_SetByteToInt(&rcv_cmdbuf[4]);
  434. if (dwAdrs.dw == 0)
  435. {
  436. dwAdrs.dw = DEF_TRACEADDR;
  437. }
  438. #if BIGENDIAN
  439. switch (rcv_cmdbuf[3])
  440. {
  441. case 1:
  442. {
  443. char * ptr;
  444. ptr = (char *)(dwAdrs.dw);
  445. iDATA.b[0] = 0;
  446. iDATA.b[1] = 0;
  447. iDATA.b[2] = 0;
  448. iDATA.b[3] = *ptr++;
  449. }
  450. break;
  451. case 2:
  452. {
  453. char * ptr;
  454. ptr = (char *)(dwAdrs.dw);
  455. iDATA.b[0] = 0;
  456. iDATA.b[1] = 0;
  457. iDATA.b[2] = *ptr++;
  458. iDATA.b[3] = *ptr++;
  459. }
  460. break;
  461. default:
  462. {
  463. char * ptr;
  464. ptr = (char *)(dwAdrs.dw);
  465. iDATA.b[0] = *ptr++;
  466. iDATA.b[1] = *ptr++;
  467. iDATA.b[2] = *ptr++;
  468. iDATA.b[3] = *ptr++;
  469. }
  470. break;
  471. }
  472. #else
  473. iDATA.i = *(( int16 xdata *)dwAdrs.dw);;//*(int *)(0x40c6 );
  474. #endif
  475. snd_cmdbuf[0] = 0x83;
  476. snd_cmdbuf[1] = 0x0B;
  477. snd_cmdbuf[2] = rcv_cmdbuf[2];
  478. snd_cmdbuf[3] = 0x00;
  479. #if BIGENDIAN
  480. snd_cmdbuf[4] = dwAdrs.b[0];
  481. snd_cmdbuf[5] = dwAdrs.b[1];
  482. snd_cmdbuf[6] = dwAdrs.b[2];
  483. snd_cmdbuf[7] = dwAdrs.b[3];
  484. snd_cmdbuf[8] = iDATA.b[0];
  485. snd_cmdbuf[9] = iDATA.b[1];
  486. snd_cmdbuf[10] = iDATA.b[2];
  487. snd_cmdbuf[11] = iDATA.b[3];
  488. #else
  489. snd_cmdbuf[4] = dwAdrs.b[3];
  490. snd_cmdbuf[5] = dwAdrs.b[2];
  491. snd_cmdbuf[6] = dwAdrs.b[1];
  492. snd_cmdbuf[7] = dwAdrs.b[0];
  493. snd_cmdbuf[8] = iDATA.b[0];
  494. snd_cmdbuf[9] = iDATA.b[1];
  495. snd_cmdbuf[10] = iDATA.b[2];
  496. snd_cmdbuf[11] = iDATA.b[3];
  497. #endif
  498. snd_cmdbuf[12] = zop_CalcCheckSum(snd_cmdbuf, 12);
  499. zop_PressSend(13);
  500. return 3;
  501. }
  502. // Write
  503. // RE[14]: 04H,0CH,id,00H,DATASIZE(1)ADRESS(4),DATA(4),CS
  504. // TX[13]: 84H,0BH,id,00H,ADRESS(4),DATA(4),CS
  505. static int zop_cmd04(void)
  506. {
  507. union UNION_DWORD xdata dwADRS;
  508. union UNION_INT xdata iDATA;
  509. uint8 cnt = RCVCMD14 - 1;
  510. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  511. if (rcv_cmdbuf[cnt] != sum)
  512. {
  513. return 0;
  514. }
  515. dwADRS.dw = zop_SetByteToInt(&rcv_cmdbuf[5]);
  516. if (dwADRS.dw == 0)
  517. {
  518. dwADRS.dw = DEF_TRACEADDR;
  519. }
  520. iDATA.i = zop_SetByteToInt(&rcv_cmdbuf[9]);
  521. switch (rcv_cmdbuf[4])
  522. {
  523. case 1:
  524. #if BIGENDIAN
  525. *(char *)(dwADRS.dw) = iDATA.i;
  526. #else
  527. dwADRS.b[3] = 0;
  528. dwADRS.b[2] = 0;
  529. dwADRS.b[1] = 0;
  530. dwADRS.b[0] = iDATA.b[0];
  531. // *(char *)(dwADRS.dw) = iDATA.b[0];
  532. #endif
  533. break;
  534. case 2:
  535. #if BIGENDIAN
  536. *(short *)(dwADRS.dw) = iDATA.i;
  537. #else
  538. {
  539. union UNION_SHORT sSHORT;
  540. //// iDATA.b[3] = 0;
  541. //// iDATA.b[2] = 0;
  542. sSHORT.b[1] = iDATA.b[3];
  543. sSHORT.b[0] = iDATA.b[2];
  544. *(( int16 xdata *)dwADRS.dw) = sSHORT.s;
  545. }
  546. #endif
  547. break;
  548. case 4:
  549. *(int *)(dwADRS.dw) = iDATA.i;
  550. break;
  551. }
  552. snd_cmdbuf[0] = 0x84;
  553. snd_cmdbuf[1] = 0x0B;
  554. snd_cmdbuf[2] = rcv_cmdbuf[2];
  555. snd_cmdbuf[3] = 0x00;
  556. #if BIGENDIAN
  557. snd_cmdbuf[4] = dwADRS.b[0];
  558. snd_cmdbuf[5] = dwADRS.b[1];
  559. snd_cmdbuf[6] = dwADRS.b[2];
  560. snd_cmdbuf[7] = dwADRS.b[3];
  561. snd_cmdbuf[8] = iDATA.b[0];
  562. snd_cmdbuf[9] = iDATA.b[1];
  563. snd_cmdbuf[10] = iDATA.b[2];
  564. snd_cmdbuf[11] = iDATA.b[3];
  565. #else
  566. snd_cmdbuf[4] = dwADRS.b[0];
  567. snd_cmdbuf[5] = dwADRS.b[1];
  568. snd_cmdbuf[6] = dwADRS.b[2];
  569. snd_cmdbuf[7] = dwADRS.b[3];
  570. snd_cmdbuf[8] = iDATA.b[0];
  571. snd_cmdbuf[9] = iDATA.b[1];
  572. snd_cmdbuf[10] = iDATA.b[2];
  573. snd_cmdbuf[11] = iDATA.b[3];
  574. #endif
  575. snd_cmdbuf[12] = zop_CalcCheckSum(snd_cmdbuf, 12);
  576. zop_PressSend(13);
  577. return 4;
  578. }
  579. // GetTrace
  580. // RE[6]: 05H,04H,id,00H,00H,CS
  581. // TXHEAD[7]: 85H,05H,id,00H,Halt(2),cs //Halt(2)通道
  582. // TXBODY[?]: 85H,??H,id,FFH,NUM(2),{DATA(4) * (CHANNEL)},CS//数据
  583. static int zop_cmd05(void)
  584. {
  585. uint8 cnt = RCVCMD6 - 1;
  586. union UNION_WORD xdata wd;
  587. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  588. if (rcv_cmdbuf[cnt] != sum)
  589. {
  590. return 0;
  591. }
  592. if (ubf_status.bf.cmd_gettrace)
  593. {
  594. return 0;
  595. }
  596. CMDMONI_WT_TRACEHALT();
  597. iTraceID = rcv_cmdbuf[2];
  598. iTraceCount = 0;
  599. iTraceCntMax = (0x80 << ubf_status.bf.len_trace);
  600. ubf_status.bf.cmd_gettrace = 1;
  601. wd.w = idy_copy_trace;
  602. snd_cmdbuf[0] = 0x85;
  603. snd_cmdbuf[1] = 0x05;
  604. snd_cmdbuf[2] = iTraceID;
  605. snd_cmdbuf[3] = 0x00;
  606. #if BIGENDIAN
  607. snd_cmdbuf[4] = wd.b[0];
  608. snd_cmdbuf[5] = wd.b[1];
  609. #else
  610. snd_cmdbuf[5] = wd.b[1];
  611. snd_cmdbuf[4] = wd.b[0];
  612. #endif
  613. snd_cmdbuf[6] = zop_CalcCheckSum(snd_cmdbuf, 6);
  614. zop_PressSend(7);
  615. return 5;
  616. }
  617. //int pokujg=0;
  618. // SetTraceAddress
  619. // RE[11]: 06H,09H,id,00H,CHANNEL(1),DATASIZE(1),ADRESS(4),CS
  620. // TX[6]: 86H,04H,id,00H,00H,CS
  621. static int zop_cmd06(void)
  622. {
  623. uint8 cnt = RCVCMD11 - 1;
  624. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  625. if (rcv_cmdbuf[cnt] != sum)
  626. {
  627. return 0;
  628. }
  629. {
  630. int iCH = (rcv_cmdbuf[4] & 0x03);
  631. int dwAdrs = zop_SetByteToInt(&rcv_cmdbuf[6]);
  632. if (dwAdrs == 0)
  633. {
  634. dwAdrs = DEF_TRACEADDR;
  635. }
  636. ptr_adrs[iCH] = (int *)dwAdrs;
  637. adrs_size[iCH] = rcv_cmdbuf[5];
  638. }
  639. //pokujg=ptr_adrs[0];
  640. snd_cmdbuf[0] = 0x86;
  641. snd_cmdbuf[1] = 0x04;
  642. snd_cmdbuf[2] = rcv_cmdbuf[2];
  643. snd_cmdbuf[3] = 0x00;
  644. snd_cmdbuf[4] = 0x00;
  645. snd_cmdbuf[5] = zop_CalcCheckSum(snd_cmdbuf, 5);
  646. zop_PressSend(6);
  647. return 6;
  648. }
  649. // TraceHALT_Clear
  650. // RE[6]: 07H,04H,id,00H,00H,CS
  651. // TX[6]: 87H,04H,id,00H,00H,CS
  652. static int zop_cmd07(void)
  653. {
  654. uint8 cnt = RCVCMD6 - 1;
  655. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  656. if (rcv_cmdbuf[cnt] != sum)
  657. {
  658. return 0;
  659. }
  660. snd_cmdbuf[0] = 0x87;
  661. snd_cmdbuf[1] = 0x04;
  662. snd_cmdbuf[2] = rcv_cmdbuf[2];
  663. snd_cmdbuf[3] = 0x00;
  664. snd_cmdbuf[4] = 0x00;
  665. snd_cmdbuf[5] = zop_CalcCheckSum(snd_cmdbuf, 5);
  666. zop_PressSend(6);
  667. return 7;
  668. }
  669. // SetTriggerEnvironment
  670. // RE[16]: 08H,0EH,id,00H,TRIG CHANNEL(1),TRIG MODE(1),TRIG TYPE(1),UP LEVEL(4),LO LEVEL(4),CS
  671. // TX[6]: 88H,04H,id,00H,00H,CS
  672. static int zop_cmd08(void)
  673. {
  674. int16 TG_ch = (rcv_cmdbuf[4] & 0x03);
  675. int16 TG_mode = (rcv_cmdbuf[5] & 0x01);
  676. int16 TG_type = (rcv_cmdbuf[6] & 0x07);
  677. int LV_up = zop_SetByteToInt(&rcv_cmdbuf[7]);
  678. int LV_lo = zop_SetByteToInt(&rcv_cmdbuf[11]);
  679. int cnt = RCVCMD16 - 1;
  680. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  681. if (rcv_cmdbuf[cnt] != sum)
  682. {
  683. return 0;
  684. }
  685. ubf_status.bf.trig_normal = 0;
  686. if (TG_mode)
  687. {
  688. ubf_status.bf.trig_normal = 1;
  689. }
  690. ubf_status.bf.ch_trig = TG_ch;
  691. if (TG_ch > ubf_status.bf.ch_trace)
  692. {
  693. TG_ch = ubf_status.bf.ch_trace;
  694. }
  695. ubf_status.bf.type_trig = TG_type;
  696. iTrigLevel = LV_up;
  697. iTrigDelay = LV_lo;
  698. snd_cmdbuf[0] = 0x88;
  699. snd_cmdbuf[1] = 0x04;
  700. snd_cmdbuf[2] = rcv_cmdbuf[2];
  701. snd_cmdbuf[3] = 0x00;
  702. snd_cmdbuf[4] = 0x00;
  703. snd_cmdbuf[5] = zop_CalcCheckSum(snd_cmdbuf, 5);
  704. zop_PressSend(6);
  705. ubf_status.bf.trig_en = 1;
  706. return 8;
  707. }
  708. // SetTraceEnvironment
  709. // RE[9]: 09H,07H,id,00H,DATA LENGTH(1),CHANEEL NUM(1),INTERVEL(2),CS
  710. // TX[6]: 89H,04H,id,00H,00H,CS
  711. static int zop_cmd09(void)
  712. {
  713. union UNION_WORD uword;
  714. uint8 cnt = RCVCMD9 - 1;
  715. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  716. if (rcv_cmdbuf[cnt] != sum)
  717. {
  718. return 0;
  719. }
  720. #if BIGENDIAN
  721. uword.b[1] = rcv_cmdbuf[6];
  722. uword.b[0] = rcv_cmdbuf[7];
  723. #else
  724. uword.b[0] = rcv_cmdbuf[6];
  725. uword.b[1] = rcv_cmdbuf[7];
  726. #endif
  727. ubf_status.bf.interval = uword.w;
  728. snd_cmdbuf[0] = 0x89;
  729. snd_cmdbuf[1] = 0x04;
  730. snd_cmdbuf[2] = rcv_cmdbuf[2];
  731. snd_cmdbuf[3] = 0x00;
  732. snd_cmdbuf[4] = 0x00;
  733. snd_cmdbuf[5] = zop_CalcCheckSum(snd_cmdbuf, 5);
  734. zop_PressSend(6);
  735. return 9;
  736. }
  737. // RE[6]: 0AH,04H,id,00H,CHECK TYPE(1),CS
  738. // TX[6]: 8AH,04H,id,00H,CHECK TYPE(1),CS
  739. static int zop_cmd0A(void)
  740. {
  741. uint8 cnt = RCVCMD6 - 1;
  742. int16 iChkType = rcv_cmdbuf[4];
  743. unsigned char sum = zop_CalcCheckSum(rcv_cmdbuf, cnt);
  744. if (rcv_cmdbuf[cnt] != sum)
  745. {
  746. return 0;
  747. }
  748. // UserTraceHalt
  749. if (iChkType == 0)
  750. {
  751. CMDMONI_WT_TRACEHALT();
  752. }
  753. // UserTraceHalt Clear
  754. if (iChkType == 1)
  755. {
  756. ubf_status.bf.halt_trace = 0;
  757. }
  758. zop_ComCmdCheck((int)rcv_cmdbuf[2], (int)rcv_cmdbuf[4]);
  759. return 10;
  760. }
  761. /*TRACE 发送数据的处理*/
  762. void CMDMONI_WT_CHECKCMD(void)
  763. {
  764. static int8 uiui = 0;
  765. if (! ubf_status.bf.cmd_gettrace)
  766. {
  767. return;
  768. }
  769. {
  770. int s = iRd - iWr;
  771. if (s <= 0)
  772. {
  773. s += SZ_SENDRINGBUF;
  774. }
  775. if (s < 64)
  776. {
  777. return;
  778. }
  779. }
  780. // if(uiui<250)
  781. {
  782. // uiui++;
  783. zop_SetGetTraceData();
  784. iTraceCount++;
  785. if (iTraceCount >= iTraceCntMax)
  786. {
  787. ubf_status.bf.halt_trace = 0;
  788. ubf_status.bf.cmd_gettrace = 0;
  789. }
  790. }
  791. }
  792. extern uint8 fasong;
  793. uint8 txbuff = 0;
  794. /*一般数据发送的处理*/
  795. void CMDMONI_WT_SENDCMD(void)
  796. {
  797. if ((cnt_wt_timeout > 100) || (cnt_wt_timeout2 > 100))
  798. {
  799. CMDMONI_WT_INIT();
  800. cnt_wt_timeout = 0;
  801. cnt_wt_timeout2 = 0;
  802. return;
  803. }
  804. if ((iRd != iWr) && (fasong == 0) && (TI == 0))
  805. {
  806. txbuff = snd_ringbuf[iRd];//while (TI==0){};TI=0;
  807. UT_DR = txbuff;//snd_ringbuf[iRd];//while (TI==0){};TI=0;
  808. fasong = 1;
  809. iRd++;
  810. if (iRd >= SZ_SENDRINGBUF) //
  811. { iRd = 0; }
  812. cnt_wt_timeout2 = 0;
  813. }
  814. }
  815. void CMDMONI_WT_INIT(void)
  816. {
  817. iReceiveCount = 0;
  818. iRd = 0;
  819. iWr = 0;
  820. idy_trace = 0;
  821. idy_copy_trace = 0;
  822. iTraceCount = 0;
  823. iTraceCntMax = 0;
  824. iIntervalCount = 0;
  825. iTraceID = 0;
  826. {
  827. uint8 i;
  828. for (i = 0; i < CH_MAX; i++)
  829. {
  830. ptr_adrs[i] = (int *)DEF_TRACEADDR;
  831. adrs_size[i] = 4;
  832. }
  833. }
  834. ubf_status.ui = 0;
  835. ubf_status.bf.trig_support = 1;
  836. ubf_status.bf.ch_trace = CH_MAX - 1;
  837. ubf_status.bf.len_trace = LEN_TRACE;
  838. }
  839. static unsigned char zop_CalcCheckSum(unsigned char * p, int cnt)
  840. {
  841. uint8 i;
  842. int sum = 0;
  843. for (i = 0; i < cnt; i++)
  844. {
  845. sum += *p++;
  846. }
  847. sum = ~sum + 1;
  848. sum = sum & 0x0FF;
  849. return sum;
  850. }
  851. //uint8 faflag=0;
  852. static void zop_PressSend(int cnt)
  853. {
  854. uint8 i;
  855. for (i = 0; i < cnt; i++)
  856. {
  857. snd_ringbuf[iWr] = snd_cmdbuf[i];
  858. iWr++;
  859. if (iWr >= SZ_SENDRINGBUF)
  860. { iWr = 0; }
  861. }
  862. // faflag=1;
  863. }
  864. // GetTrace
  865. // TX HEAD[7]: 85H,05H,id,00H,Halt?C???f?N?X(2),cs
  866. // TX BODY[?]: 85H,??H,id,FFH,NUM(2),{DATA(4) * (CHANNEL NUM)},CS
  867. static void zop_SetGetTraceData(void)
  868. {
  869. int msk = LengthMask[(ubf_status.bf.len_trace & 0x03)];
  870. union UNION_WORD xdata wd;
  871. union UNION_INT xdata ui;
  872. int iDATA0 = 0;
  873. int iDATA1 = 0;
  874. int iDATA2 = 0;
  875. int iDATA3 = 0;
  876. wd.w = iTraceCount;
  877. snd_cmdbuf[0] = 0x85;
  878. snd_cmdbuf[1] = 0x00;
  879. snd_cmdbuf[2] = iTraceID;
  880. snd_cmdbuf[3] = 0xFF;
  881. #if BIGENDIAN
  882. snd_cmdbuf[5] = wd.b[0];
  883. snd_cmdbuf[4] = wd.b[1];
  884. #else
  885. snd_cmdbuf[5] = wd.b[1];
  886. snd_cmdbuf[4] = wd.b[0];
  887. #endif
  888. switch (ubf_status.bf.ch_trace)
  889. {
  890. case 0:
  891. snd_cmdbuf[1] = 0x09;
  892. {
  893. int iBase = idy_copy_trace;
  894. iDATA0 = buf_trace[iBase + 0];
  895. idy_copy_trace++;
  896. idy_copy_trace &= msk;
  897. }
  898. ui.i = iDATA0;
  899. #if BIGENDIAN
  900. snd_cmdbuf[9] = ui.b[0];
  901. snd_cmdbuf[8] = ui.b[1];
  902. snd_cmdbuf[7] = ui.b[2];
  903. snd_cmdbuf[6] = ui.b[3];
  904. #else
  905. snd_cmdbuf[9] = ui.b[3];
  906. snd_cmdbuf[8] = ui.b[2];
  907. snd_cmdbuf[7] = ui.b[1];
  908. snd_cmdbuf[6] = ui.b[0];
  909. #endif
  910. snd_cmdbuf[10] = zop_CalcCheckSum(snd_cmdbuf, 10);
  911. zop_PressSend(11);
  912. break;
  913. case 1:
  914. snd_cmdbuf[1] = 0x0D;
  915. {
  916. int iBase = (idy_copy_trace + idy_copy_trace);
  917. iDATA0 = buf_trace[iBase + 0];
  918. iDATA1 = buf_trace[iBase + 1];
  919. idy_copy_trace++;
  920. idy_copy_trace &= msk;
  921. }
  922. ui.i = iDATA0;
  923. #if BIGENDIAN
  924. snd_cmdbuf[9] = ui.b[0];
  925. snd_cmdbuf[8] = ui.b[1];
  926. snd_cmdbuf[7] = ui.b[2];
  927. snd_cmdbuf[6] = ui.b[3];
  928. #else
  929. snd_cmdbuf[9] = ui.b[3];
  930. snd_cmdbuf[8] = ui.b[2];
  931. snd_cmdbuf[7] = ui.b[1];
  932. snd_cmdbuf[6] = ui.b[0];
  933. #endif
  934. ui.i = iDATA1;
  935. #if BIGENDIAN
  936. snd_cmdbuf[13] = ui.b[0];
  937. snd_cmdbuf[12] = ui.b[1];
  938. snd_cmdbuf[11] = ui.b[2];
  939. snd_cmdbuf[10] = ui.b[3];
  940. #else
  941. snd_cmdbuf[13] = ui.b[3];
  942. snd_cmdbuf[12] = ui.b[2];
  943. snd_cmdbuf[11] = ui.b[1];
  944. snd_cmdbuf[10] = ui.b[0];
  945. #endif
  946. snd_cmdbuf[14] = zop_CalcCheckSum(snd_cmdbuf, 14);
  947. zop_PressSend(15);
  948. break;
  949. case 2:
  950. snd_cmdbuf[1] = 0x11;
  951. {
  952. int iBase = (idy_copy_trace + idy_copy_trace + idy_copy_trace);
  953. iDATA0 = buf_trace[iBase + 0];
  954. iDATA1 = buf_trace[iBase + 1];
  955. iDATA2 = buf_trace[iBase + 2];
  956. idy_copy_trace++;
  957. idy_copy_trace &= msk;
  958. }
  959. ui.i = iDATA0;
  960. #if BIGENDIAN
  961. snd_cmdbuf[6] = ui.b[0];
  962. snd_cmdbuf[7] = ui.b[1];
  963. snd_cmdbuf[8] = ui.b[2];
  964. snd_cmdbuf[9] = ui.b[3];
  965. #else
  966. snd_cmdbuf[6] = ui.b[3];
  967. snd_cmdbuf[7] = ui.b[2];
  968. snd_cmdbuf[8] = ui.b[1];
  969. snd_cmdbuf[9] = ui.b[0];
  970. #endif
  971. ui.i = iDATA1;
  972. #if BIGENDIAN
  973. snd_cmdbuf[10] = ui.b[0];
  974. snd_cmdbuf[11] = ui.b[1];
  975. snd_cmdbuf[12] = ui.b[2];
  976. snd_cmdbuf[13] = ui.b[3];
  977. #else
  978. snd_cmdbuf[10] = ui.b[3];
  979. snd_cmdbuf[11] = ui.b[2];
  980. snd_cmdbuf[12] = ui.b[1];
  981. snd_cmdbuf[13] = ui.b[0];
  982. #endif
  983. ui.i = iDATA2;
  984. #if BIGENDIAN
  985. snd_cmdbuf[14] = ui.b[0];
  986. snd_cmdbuf[15] = ui.b[1];
  987. snd_cmdbuf[16] = ui.b[2];
  988. snd_cmdbuf[17] = ui.b[3];
  989. #else
  990. snd_cmdbuf[14] = ui.b[3];
  991. snd_cmdbuf[15] = ui.b[2];
  992. snd_cmdbuf[16] = ui.b[1];
  993. snd_cmdbuf[17] = ui.b[0];
  994. #endif
  995. snd_cmdbuf[18] = zop_CalcCheckSum(snd_cmdbuf, 18);
  996. zop_PressSend(19);
  997. break;
  998. case 3:
  999. snd_cmdbuf[1] = 0x15;
  1000. {
  1001. int iBase = (idy_copy_trace + idy_copy_trace + idy_copy_trace + idy_copy_trace);
  1002. iDATA0 = buf_trace[iBase + 0];
  1003. iDATA1 = buf_trace[iBase + 1];
  1004. iDATA2 = buf_trace[iBase + 2];
  1005. iDATA3 = buf_trace[iBase + 3];
  1006. idy_copy_trace++;
  1007. idy_copy_trace &= msk;
  1008. }
  1009. ui.i = iDATA0;
  1010. #if BIGENDIAN
  1011. snd_cmdbuf[6] = ui.b[0];
  1012. snd_cmdbuf[7] = ui.b[1];
  1013. snd_cmdbuf[8] = ui.b[2];
  1014. snd_cmdbuf[9] = ui.b[3];
  1015. #else
  1016. snd_cmdbuf[6] = ui.b[3];
  1017. snd_cmdbuf[7] = ui.b[2];
  1018. snd_cmdbuf[8] = ui.b[1];
  1019. snd_cmdbuf[9] = ui.b[0];
  1020. #endif
  1021. ui.i = iDATA1;
  1022. #if BIGENDIAN
  1023. snd_cmdbuf[10] = ui.b[0];
  1024. snd_cmdbuf[11] = ui.b[1];
  1025. snd_cmdbuf[12] = ui.b[2];
  1026. snd_cmdbuf[13] = ui.b[3];
  1027. #else
  1028. snd_cmdbuf[10] = ui.b[3];
  1029. snd_cmdbuf[11] = ui.b[2];
  1030. snd_cmdbuf[12] = ui.b[1];
  1031. snd_cmdbuf[13] = ui.b[0];
  1032. #endif
  1033. ui.i = iDATA2;
  1034. #if BIGENDIAN
  1035. snd_cmdbuf[14] = ui.b[0];
  1036. snd_cmdbuf[15] = ui.b[1];
  1037. snd_cmdbuf[16] = ui.b[2];
  1038. snd_cmdbuf[17] = ui.b[3];
  1039. #else
  1040. snd_cmdbuf[14] = ui.b[3];
  1041. snd_cmdbuf[15] = ui.b[2];
  1042. snd_cmdbuf[16] = ui.b[1];
  1043. snd_cmdbuf[17] = ui.b[0];
  1044. #endif
  1045. ui.i = iDATA3;
  1046. #if BIGENDIAN
  1047. snd_cmdbuf[18] = ui.b[0];
  1048. snd_cmdbuf[19] = ui.b[1];
  1049. snd_cmdbuf[20] = ui.b[2];
  1050. snd_cmdbuf[21] = ui.b[3];
  1051. #else
  1052. snd_cmdbuf[18] = ui.b[3];
  1053. snd_cmdbuf[19] = ui.b[2];
  1054. snd_cmdbuf[20] = ui.b[1];
  1055. snd_cmdbuf[21] = ui.b[0];
  1056. #endif
  1057. snd_cmdbuf[22] = zop_CalcCheckSum(snd_cmdbuf, 22);
  1058. zop_PressSend(23);
  1059. break;
  1060. }
  1061. }
  1062. void PC_MONITOR_MAIN(void)
  1063. {
  1064. CMDMONI_WT_CHECKCMD();
  1065. }
  1066. void PC_MONITOR_1MS(void)
  1067. {
  1068. {
  1069. CMDMONI_WT_1MS();
  1070. }
  1071. }
  1072. void PC_MONITOR_PWM(void)
  1073. {
  1074. {
  1075. CMDMONI_WT_TRACEWATCH();
  1076. }
  1077. }
  1078. void PC_MONITOR_INTR(void)
  1079. {
  1080. {
  1081. MD_WT_INTR();
  1082. }
  1083. }
  1084. #endif