Uart.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. #include <p33FJ64MC204.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "UART.h"
  5. #include "string.h"
  6. #include "Instrument_EEPROM_Param.h"
  7. #include "IO.h"
  8. #include "command.h"
  9. /**********************************************/
  10. unsigned char g_ucCMD,g_ucUART1_flag,g_ucUART2_flag=0;
  11. unsigned int g_uiUart1_No=0;
  12. unsigned char g_ucUart1_Send_Data[SEND_NUM],g_ucUart1_Receive_Data[RECEIVE_NUM];
  13. unsigned char g_ucUart2_Send_Data[SEND_NUM],g_ucUart2_Receive_Data[RECEIVE_NUM];
  14. unsigned char g_ucHeaderFlag1 = 0;
  15. unsigned char g_ucHeaderFlag2 = 0;
  16. unsigned int g_uiUart2_No=0;
  17. unsigned int uiReceive1_Counter;
  18. unsigned int g_uiLth = 0,g_uiLth2 = 0;
  19. unsigned char g_ucCRC,g_ucCRC2;
  20. unsigned long g_ulRSUM,g_ulRSUM2;
  21. unsigned int g_uiFrmLth;
  22. unsigned char g_BUSY = 0,g_BUSY2 = 0,g_BUSY3=0,g_BUSY4=0;
  23. /*******************************************************************************
  24. * 函数名称:InitUart1
  25. *******************************************************************************/
  26. void InitUart1(void)
  27. {
  28. /****************************************************/
  29. _TRISC6 = 0;
  30. _TRISC8 = 1;
  31. _RP22R = 0x03;
  32. _U1RXR = 0x18;
  33. U1MODEbits.STSEL = 0;
  34. U1MODEbits.PDSEL = 0;
  35. U1MODEbits.BRGH = 0;
  36. U1MODEbits.ABAUD = 0;
  37. U1MODEbits.LPBACK = 0;
  38. U1BRG=259;
  39. U1STAbits.UTXISEL0 = 1;
  40. U1STAbits.UTXISEL1 = 0;
  41. U1STAbits.URXISEL = 0;
  42. IEC0bits.U1TXIE = 0;
  43. IEC0bits.U1RXIE = 1;
  44. U1MODEbits.UARTEN = 1;
  45. U1STAbits.UTXEN = 1;
  46. IPC2bits.U1RXIP = 6;
  47. }
  48. /*******************************************************************************
  49. * 函数名称:InitUart2
  50. *******************************************************************************/
  51. void InitUart2(void)
  52. {
  53. _TRISB8 = 0;
  54. _TRISB9 = 1;
  55. _RP8R = 0x05;
  56. _U2RXR = 0x09;
  57. U2MODEbits.STSEL=0;
  58. U2MODEbits.PDSEL=0;
  59. U2MODEbits.BRGH=0;
  60. U2MODEbits.ABAUD=0;
  61. U2MODEbits.LPBACK=0;
  62. U2BRG=259;
  63. U2STAbits.UTXISEL0=1;
  64. U2STAbits.UTXISEL1=0;
  65. U2STAbits.URXISEL=0;
  66. IEC1bits.U2TXIE=0;
  67. IEC1bits.U2RXIE=1;
  68. U2MODEbits.UARTEN=1;
  69. U2STAbits.UTXEN=1;
  70. IPC7bits.U2RXIP=7;
  71. IPC7bits.U2TXIP=7;
  72. }
  73. /*******************************************************************************
  74. * 函数名称:Uart1Send
  75. *******************************************************************************/
  76. void UART1SEND(char data)
  77. {
  78. U1TXREG = data;
  79. while(!IFS0bits.U1TXIF);
  80. IFS0bits.U1TXIF=0;
  81. }
  82. void UART2SEND(char data)
  83. {
  84. U2TXREG = data;
  85. while(!IFS1bits.U2TXIF);
  86. IFS1bits.U2TXIF=0;
  87. }
  88. void RS1_Ack(unsigned int sendnum)
  89. {
  90. unsigned int i;
  91. for(i=0;i<sendnum;i++)
  92. {
  93. UART1SEND(g_ucUart1_Send_Data[i]);
  94. }
  95. memset(g_ucUart1_Send_Data,0,sendnum*sizeof(unsigned char));
  96. }
  97. void RS2_Ack(unsigned int sendnum)
  98. {
  99. unsigned int i;
  100. for(i=0;i<sendnum;i++)
  101. {
  102. UART2SEND(g_ucUart2_Send_Data[i]);
  103. }
  104. memset(g_ucUart2_Send_Data,0,sendnum*sizeof(unsigned char));
  105. }
  106. /*******************************************************************************
  107. * 函数名称:CalculateSum
  108. *******************************************************************************/
  109. unsigned long int CalculateSum(unsigned char *p,unsigned int num)
  110. {
  111. unsigned int i=0;
  112. unsigned long int uiCheckSum=0;
  113. for(i = 0;i < num;i++)
  114. {
  115. uiCheckSum += *p;
  116. p++;
  117. }
  118. return uiCheckSum;
  119. }
  120. /*******************************************************************************
  121. * 函数名称:CalculateSum
  122. *******************************************************************************/
  123. unsigned int CalculateCharSum(unsigned char *p,unsigned char num)
  124. {
  125. unsigned char i=0;
  126. unsigned int uiCheckSum=0;
  127. for(i = 0;i < num;i ++)
  128. {
  129. uiCheckSum += *p;
  130. p++;
  131. }
  132. return uiCheckSum;
  133. }
  134. /*******************************************************************************
  135. * 函数名称:_U1RXInterrupt
  136. *******************************************************************************/
  137. void __attribute__((__interrupt__,no_auto_psv)) _U1RXInterrupt(void)
  138. {
  139. IFS0bits.U1RXIF = 0;
  140. g_ucUart1_Receive_Data[g_uiUart1_No] = U1RXREG;
  141. if(g_BUSY == 1) return;
  142. if(g_ucHeaderFlag1 == 0)
  143. {
  144. if(g_ucUart1_Receive_Data[g_uiUart1_No] == FRAME_HEAD)
  145. {
  146. g_ucHeaderFlag1 = 1;
  147. g_ucUart1_Receive_Data[0] = FRAME_HEAD;
  148. g_uiUart1_No = 1;
  149. }
  150. else
  151. {
  152. g_BUSY = 0;
  153. }
  154. }
  155. else if(g_ucHeaderFlag1 == 1)
  156. {
  157. g_uiUart1_No++;
  158. }
  159. if(g_uiUart1_No >4)//(FRAME_LTHL_INDEX+1))
  160. {
  161. g_uiLth = g_ucUart1_Receive_Data[FRAME_LTHH_INDEX] ;
  162. g_uiLth = (g_uiLth<<8) + g_ucUart1_Receive_Data[FRAME_LTHL_INDEX];
  163. if(g_uiUart1_No == g_uiLth)
  164. {
  165. g_ulRSUM = CalculateCharSum(g_ucUart1_Receive_Data,g_uiLth-1);
  166. g_ucCRC = (unsigned char)g_ulRSUM;//
  167. if(g_ucCRC == g_ucUart1_Receive_Data[g_uiLth-1])
  168. {
  169. g_ucCMD = g_ucUart1_Receive_Data[FRAME_CMD_INDEX];
  170. g_ulRSUM = 0;
  171. g_uiUart1_No = 0;
  172. g_ucHeaderFlag1 = 0;
  173. if(g_ucCMD==Command_Execution_Status||g_ucCMD==stop)
  174. {
  175. g_BUSY3 = 1;
  176. g_BUSY = 1;
  177. }
  178. else
  179. {
  180. g_ucUART1_flag = 1;
  181. g_BUSY = 1;
  182. }
  183. }
  184. else
  185. {
  186. memset(g_ucUart1_Receive_Data,0,g_uiLth*sizeof(unsigned char));
  187. g_BUSY = 0;
  188. }
  189. }
  190. else if(g_uiUart1_No > g_uiLth)
  191. {
  192. g_uiUart1_No = 0;
  193. g_ucHeaderFlag1 = 0;
  194. g_BUSY = 0;
  195. }
  196. }
  197. }
  198. /*******************************************************************************
  199. * 函数名称:_U2RXInterrupt
  200. *******************************************************************************/
  201. void __attribute__((__interrupt__,no_auto_psv)) _U2RXInterrupt(void)
  202. {
  203. IFS1bits.U2RXIF = 0;
  204. g_ucUart2_Receive_Data[g_uiUart2_No] = U2RXREG;
  205. if(g_BUSY2 == 1) return;
  206. if(g_ucHeaderFlag2 == 0)
  207. {
  208. if(g_ucUart2_Receive_Data[g_uiUart2_No] == FRAME_HEAD)
  209. {
  210. g_ucHeaderFlag2 = 1;
  211. g_ucUart2_Receive_Data[0] = FRAME_HEAD;
  212. g_uiUart2_No = 1;
  213. }
  214. else
  215. {
  216. g_BUSY2 = 0;
  217. }
  218. }
  219. else if(g_ucHeaderFlag2 == 1)
  220. {
  221. g_uiUart2_No++;
  222. }
  223. if(g_uiUart2_No >4)
  224. {
  225. g_uiLth2 = g_ucUart2_Receive_Data[FRAME_LTHH_INDEX] ;
  226. g_uiLth2 = (g_uiLth2<<8) + g_ucUart2_Receive_Data[FRAME_LTHL_INDEX];
  227. if(g_uiUart2_No == g_uiLth2)
  228. {
  229. g_ulRSUM2 = CalculateCharSum(g_ucUart2_Receive_Data,g_uiLth2-1);
  230. g_ucCRC2 = (unsigned char)g_ulRSUM2;//
  231. if(g_ucCRC2 == g_ucUart2_Receive_Data[g_uiLth2-1])
  232. {
  233. g_ucCMD = g_ucUart2_Receive_Data[FRAME_CMD_INDEX];
  234. g_ulRSUM2 = 0;
  235. g_uiUart2_No = 0;
  236. g_ucHeaderFlag2 = 0;
  237. if(g_ucCMD==Command_Execution_Status)
  238. {
  239. g_BUSY4=1;
  240. g_BUSY2 = 1;
  241. }
  242. else
  243. {
  244. g_ucUART2_flag = 1;
  245. g_BUSY2 = 1;
  246. }
  247. //处理代码中...暂不接受指令;
  248. }
  249. else
  250. {
  251. memset(g_ucUart2_Receive_Data,0,g_uiLth2*sizeof(unsigned char));
  252. g_BUSY2 = 0;
  253. }
  254. }
  255. else if(g_uiUart2_No > g_uiLth2)
  256. {
  257. g_uiUart2_No = 0;
  258. g_ucHeaderFlag2 = 0;
  259. g_BUSY2 = 0;
  260. }
  261. }
  262. }
  263. static const unsigned short crc16tab[256]=
  264. {
  265. 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
  266. 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
  267. 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
  268. 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
  269. 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
  270. 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
  271. 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
  272. 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
  273. 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
  274. 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
  275. 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
  276. 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
  277. 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
  278. 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
  279. 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
  280. 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
  281. 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
  282. 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
  283. 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
  284. 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
  285. 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
  286. 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
  287. 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
  288. 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
  289. 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
  290. 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
  291. 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
  292. 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
  293. 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
  294. 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
  295. 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
  296. 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
  297. };
  298. unsigned short crc16_ccitt(unsigned char *buf, int len)
  299. {
  300. register int counter;
  301. register unsigned short crc = 0;
  302. for( counter = 0; counter < len; counter++)
  303. crc = (crc<<8) ^ crc16tab[((crc>>8) ^ *(char *)buf++)&0x00FF];
  304. return crc;
  305. }