UART.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. /********************************************************************************
  2. **** Copyright (C), 2019, Fortior Technology Co., Ltd. ****
  3. ********************************************************************************
  4. File Name : UART.c
  5. Author : Bruce HW&RD
  6. Date : 2019-09-11
  7. Description : .C file function description
  8. Version : 1.0
  9. Function List :
  10. Record :
  11. 1.Date : 2019-09-11
  12. Author : Bruce HW&RD
  13. Modification: Created file
  14. ********************************************************************************/
  15. #include "FU68xx_5.h"
  16. #include <Myproject.h>
  17. //MCUART xdata Uart;
  18. ddatet1 xdata DATA1;
  19. DATE_HUI xdata DATA2_Hui;
  20. uint8 FaultCommuMonCt = 0;
  21. extern int8 xdata UART1_RX_flag;
  22. extern int8 xdata UART1_TX_flag;
  23. extern int8 xdata UART1_Rec_S;
  24. extern int8 UART1_rx_rat_time, UART1_rx_count;
  25. extern uint8 xdata UART1_In_L, UART1_In_H; //
  26. extern int8 xdata UART1_Rx_dat[12];//Á¬ÊÕ8×Ö½Ú
  27. void UART2_Init(void)
  28. {
  29. uint16 bps = 0;
  30. #if (Uart_COMMUNICATION==0)
  31. {
  32. bps = 1200;
  33. }
  34. #elif (Uart_COMMUNICATION==1)
  35. {
  36. bps = 9600;
  37. }
  38. #endif
  39. SetBit(PH_SEL, UART2EN);
  40. /* UART模式 UT2_MOD1,UT2_MOD0为:
  41. 00 模式0,移位寄存器波特率为 系统时钟 /12
  42. 01 模式1,8-bit UART 波特率为 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL]) ) / (UT2_BAUD+1) )
  43. 10 模式2,9-bit UART 波特率为 fcpu_clk / ( 32 – 16* UT2_BAUD[BAUD2_SEL])
  44. 11 模式3,9-bit UART 波特率为 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL])) / (UT2_BAUD+1) ) */
  45. UT2MOD1 = 0; // 9位模式 01
  46. UT2MOD0 = 1;
  47. /* Does not allow multi-thread cpu operation */
  48. /* UT2_SM2 为 0 - 单机通讯为 1 - 多机通讯 */
  49. UT2SM2 = 0;
  50. /* UT2_REN 为 0 - 禁止接收为 1 - 使能接收 */
  51. UT2REN = 1;
  52. UT2RI = 0;
  53. /* Uart2设置中断优先级 */
  54. SetBit(IP3, PSPI_UT21);
  55. ClrBit(IP3, PSPI_UT20);
  56. // UART2CH1, UART2CH0
  57. // 00:P3.6 为 RXD、P3.7 为 TXD(P3.6 为单线模式的输入输出)
  58. // 01:P4.7 为 RXD、P1.2 为 TXD(P1.2 为单线模式的输入输出)
  59. // 1X:P0.1 为 RXD、P0.0 为 TXD(P0.1 为单线模式的输入输出)
  60. ClrBit(PH_SEL1, UART2CH1);
  61. ClrBit(PH_SEL1, UART2CH0);
  62. // 设置波特率 根据 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL]) ) / (UT2_BAUD+1) )计算
  63. UT2_BAUD = 0;
  64. // if (bps > 600)
  65. {
  66. UT2_BAUD |= 1500000 / bps - 1;
  67. }
  68. // else
  69. // {
  70. // SetBit(UT2_BAUD,BAUD2_SEL);
  71. //
  72. // UT2_BAUD |= 750000 / bps - 1;
  73. // }
  74. /* Enable UART2 interrupt */
  75. SetBit(UT2_BAUD, UART2IEN);
  76. }
  77. void UART1_Init(void)
  78. {
  79. #if (Debugg==1)
  80. {
  81. /*工具程序*/
  82. /*工具*/
  83. SetBit(PH_SEL, UART1EN); //p0[6]as UART_RXD; p0[5]as UART_TXD
  84. UT_MOD1 = 0;
  85. UT_MOD0 = 1; //8bit?????UART??
  86. SM2 = 0; //??Mode2?Mode3????
  87. REN = 1; //????
  88. ES0 = 0; //????
  89. SetBit(IP3, PI2C_UT11);
  90. ClrBit(IP3, PI2C_UT10); // 中断优先级别3
  91. // SetBit(UT_BAUD , UART_2xBAUD); //????0-->Disable 1-->Enable
  92. UT_BAUD = 0x9B; //default baudrate:9600-0x9b,1200-0x4E1 00 150000 1D =50000
  93. ES0 = 1; //??/??????
  94. }
  95. #else
  96. {
  97. // /*自己串口*/
  98. SetBit(PH_SEL, UART1EN); //p0[6]as UART_RXD; p0[5]as UART_TXD
  99. UT_MOD1 = 0;
  100. UT_MOD0 = 1; //8bit?????UART??
  101. SM2 = 0; //??Mode2?Mode3????
  102. REN = 1; //????
  103. ES0 = 0; //????
  104. ClrBit(IP3, PI2C_UT11);
  105. ClrBit(IP3, PI2C_UT10); // 中断优先级别3
  106. SetBit(UT_BAUD, UART_2xBAUD); //????0-->Disable 1-->Enable
  107. UT_BAUD = 0x00; //default baudrate:9600-0x9b,1200-0x4E1 00 150000 1D =50000
  108. ES0 = 0; //??/??????
  109. }
  110. #endif
  111. }
  112. char putchar(char c)
  113. {
  114. UT_DR = c;
  115. while (TI == 0) {}; TI = 0;
  116. return c;
  117. }
  118. /* P是PSW程序状态字的一个位,表示奇偶校验位:它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。
  119. 若为奇数,则P=1,否则为0。 运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。*/
  120. //奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。
  121. //偶校验(even parity):让传输的数据(包含校验位)中1的个数为偶数。
  122. // Buf 校验的数据 o_or_e 奇偶方式选择
  123. uint8 even_or_odd(uint8 Buf, uint8 o_or_e)
  124. {
  125. uint8 even_odd = 0, tmpP = 0;
  126. ACC = Buf;
  127. tmpP = P;
  128. if (o_or_e == 0) //偶校验
  129. {
  130. even_odd = (tmpP == 1) ? 1 : 0;
  131. }
  132. else //奇校验
  133. {
  134. even_odd = (tmpP == 1) ? 0 : 1;
  135. }
  136. return even_odd;
  137. }
  138. #if (Uart_Select==Uart_MoNi)
  139. /*数据接收函数*/
  140. void UartRecive(void)
  141. {
  142. Uart.UartReadTemp = RX_BUF ; // 读接收数据
  143. Uart.R_DATA[Uart.UartReadCnt++] = Uart.UartReadTemp;
  144. }
  145. /*数据发送函数*/
  146. void UartSend(void)
  147. {
  148. if (Uart.TxCnt < (TX_LEN1 - 1))
  149. {
  150. Uart.TxCnt++;
  151. TX_BUF = Uart.T_DATA[Uart.TxCnt];
  152. }
  153. else
  154. {
  155. Uart.TxCnt = 0;
  156. Uart.sendflag = 0;
  157. }
  158. }
  159. /*串口数据处理,处理接收到的串口数据,运行于大循环中*/
  160. void UartDealResponse(void)
  161. {
  162. uint8 i;
  163. Uart_Check();//判断接收的数据是否正确
  164. if (Uart.sussf_falg == 1) //数据接收正确且成功
  165. {
  166. Uart.ResponseFlag = 1; //发送延时计时标志位
  167. Uart.UartReadCnt = 0;
  168. Uart.time_shuju = 0;
  169. mcFaultDect.commu_time = 0;
  170. /*提取并转换串口接收数据*/
  171. /*压机速度获取*/
  172. DATA1.DATA12 = Uart.R_DATA[1];
  173. if (DATA1.bf.DATA1_0 == 1)
  174. {
  175. Uart.YaJI_Speed = (uint16) Uart.R_DATA[2] * 60;
  176. if (Uart.R_DATA[2] == 0)
  177. {
  178. Uart.YaJI_Speed = 0;
  179. }
  180. }
  181. else
  182. {
  183. Uart.YaJI_Speed = 0;
  184. }
  185. ConTrolCmd.yajispeed = Uart.YaJI_Speed;
  186. /*4通阀控制*/
  187. if (DATA1.bf.DATA1_1 == 1)
  188. {
  189. ConTrolCmd.sitongfa = 1;
  190. }
  191. else//4通阀关闭
  192. {
  193. ConTrolCmd.sitongfa = 0;
  194. }
  195. /*风机速度获取*/
  196. if (DATA1.bf.DATA1_2 == 1) //室外风机
  197. {
  198. Uart.FengSpeed = (uint16)Uart.R_DATA[3] * 10;
  199. }
  200. else
  201. {
  202. Uart.FengSpeed = 0;
  203. }
  204. ConTrolCmd.fengjispeed = Uart.FengSpeed;
  205. /*电子膨胀阀开度获取*/
  206. if (DATA1.bf.DATA1_6 == 1) //电子膨胀阀
  207. {
  208. Uart.PengZhangFa = Uart.R_DATA[4] + 256;
  209. }
  210. else
  211. {
  212. Uart.PengZhangFa = Uart.R_DATA[4];
  213. }
  214. ConTrolCmd.dianzifakaidu = Uart.PengZhangFa;
  215. /*回传数据*/
  216. for (i = 0; i <= TX_LEN1; i++) //赋值之前先清零
  217. {
  218. Uart.T_DATA[i] = 0;
  219. }
  220. DATA2_Hui.DATA_HUI = 0; //先清零
  221. if (mcSpeedRamp.FlagONOFF == 1)
  222. {
  223. DATA2_Hui.bf.DATA2_0 = 1;
  224. }
  225. if (ConTrolCmd.sitongfa == 1)
  226. {
  227. DATA2_Hui.bf.DATA2_1 = 1;
  228. }
  229. if ( Uart.FengSpeed)
  230. {
  231. DATA2_Hui.bf.DATA2_2 = 1;
  232. }
  233. Uart.PengZhangFa_ACT = bujindianji.Act;
  234. if (bujindianji.Act > 500)
  235. {
  236. DATA2_Hui.bf.DATA2_6 = 1;
  237. Uart.PengZhangFa_ACT = 500 - 256 ; //电子膨胀阀开度
  238. }
  239. else if (bujindianji.Act > 255)
  240. {
  241. DATA2_Hui.bf.DATA2_6 = 1;
  242. Uart.PengZhangFa_ACT = bujindianji.Act - 256 ; //电子膨胀阀开度
  243. }
  244. else
  245. {
  246. DATA2_Hui.bf.DATA2_6 = 0;
  247. Uart.PengZhangFa_ACT = (uint8)bujindianji.Act ; //电子膨胀阀开度
  248. }
  249. cumfault_6();
  250. Uart.T_DATA[0] = TX_ZHENTOU1;
  251. Uart.T_DATA[1] = DATA2_Hui.DATA_HUI;
  252. Uart.T_DATA[2] = S_Value2; //压机速度(rps)
  253. Uart.T_DATA[3] = Fengji_FG.FENJIPINLV2 / 10; //风机转速
  254. Uart.T_DATA[4] = Uart.PengZhangFa_ACT ; //电子膨胀阀开度
  255. Uart.T_DATA[5] = (uint8)(Huan_temp / 5 + 100);
  256. Uart.T_DATA[6] = (uint8)(Guan_temp / 5 + 100);
  257. Uart.T_DATA[7] = (uint8)(Paiqi_temp / 10 + 50);
  258. Uart.T_DATA[8] = 0x00 ; //预留
  259. Uart.T_DATA[9] = FaultCommuMonCt ; //预留
  260. Uart.T_DATA[10] = checkAdd1(Uart.T_DATA, 0, TX_LEN1 - 1);
  261. Uart.TxCnt = 0;
  262. Uart.sussf_falg = 0;
  263. }
  264. if ((Uart.time_cnt > 500 || Uart.time_shuju > 2000) && Uart.sendflag == 0) //16s内读取不到数据清零或2s内校验不成功
  265. {
  266. Uart.UartReadCnt = 0;
  267. Uart.time_shuju = 0;
  268. for (i = 0; i < RX_LEN1; i++)
  269. {
  270. Uart.R_DATA[i] = 0;
  271. }
  272. UART1_RX_flag = 0;
  273. UART1_TX_flag = 0;
  274. UART1_Rec_S = 0;
  275. UART1_rx_count = 0;
  276. UART1_rx_rat_time = 0;
  277. UART1_In_L = 0;
  278. UART1_In_H = 0;
  279. RX_BUF = 0;
  280. for (i = 0; i < 11; i++)
  281. {
  282. UART1_Rx_dat[i] = 0;
  283. }
  284. }
  285. if (Uart.send_delay_time >= 160) //延时160ms发送
  286. {
  287. TX_BUF = Uart.T_DATA[0];
  288. Uart.sendflag = 1;
  289. Uart.TxCnt = 0;
  290. Uart.send_delay_time = 0;
  291. Uart.ResponseFlag = 0;
  292. }
  293. }
  294. /*SUM1求和检验*/
  295. uint8 checkAdd1(uint8 * chCheckAdrr, uint8 chStartAddr, uint8 iCheckCnt)
  296. {
  297. uint8 i;
  298. uint8 iCheckResult = 0;
  299. chCheckAdrr += chStartAddr;
  300. for (i = 0; i < iCheckCnt; i++)
  301. {
  302. iCheckResult += *chCheckAdrr;
  303. chCheckAdrr++;
  304. }
  305. iCheckResult &= 0xff;
  306. return (iCheckResult);
  307. }
  308. /*SUM2求和检验*/
  309. uint8 checkAdd2(uint8 * chCheckAdrr, uint8 chStartAddr, uint8 iCheckCnt)
  310. {
  311. uint8 i;
  312. uint8 iCheckResult = 0;
  313. chCheckAdrr += chStartAddr;
  314. for (i = 0; i < iCheckCnt; i++)
  315. {
  316. iCheckResult += *chCheckAdrr;
  317. chCheckAdrr++;
  318. }
  319. iCheckResult &= 0xff;
  320. return (iCheckResult);
  321. }
  322. void Uart_Check(void)
  323. {
  324. uint8 i = 0;
  325. if (Uart.R_DATA[0] != RX_ZHENTOU1) //针头错误清零
  326. {
  327. UART1_RX_flag = 0;
  328. UART1_TX_flag = 0;
  329. Uart.UartReadCnt = 0;
  330. for (i = 0; i < RX_LEN1; i++)
  331. {
  332. Uart.R_DATA[i] = 0;
  333. }
  334. }
  335. if (Uart.UartReadCnt >= RX_LEN1)
  336. {
  337. Uart.UartReadCnt = 0;
  338. if ((Uart.R_DATA[0] == RX_ZHENTOU1) && (checkAdd2(Uart.R_DATA, 0, (RX_LEN1 - 1)) == Uart.R_DATA[RX_LEN1 - 1])) //将读取的正确数据转换为所用数据,并将所需数据给Uart.T_DATA赋值
  339. {
  340. Uart.sussf_falg = 1;
  341. }
  342. if ((Uart.R_DATA[0] != RX_ZHENTOU1) || (checkAdd2(Uart.R_DATA, 0, RX_LEN1 - 1) != Uart.R_DATA[RX_LEN1 - 1])) //检验不对清零
  343. {
  344. Uart.sussf_falg = 0;
  345. UART1_RX_flag = 0;
  346. UART1_TX_flag = 0;
  347. Uart.UartReadCnt = 0;
  348. for (i = 0; i < RX_LEN1; i++)
  349. {
  350. Uart.R_DATA[i] = 0;
  351. }
  352. }
  353. }
  354. }
  355. void cumfault_6(void)
  356. {
  357. if (((mcFaultSource == FaultHardOVCurrent) || (mcFaultSource == FaultSoftOVCurrent)) && (mcProtectTime.CurrentPretectTimes >= CurrentProtectRestartTimes))
  358. {
  359. FaultCommuMonCt = 4;
  360. }
  361. else if ((mcFaultSource == FaultLossPhase) && (mcProtectTime.LossPHTimes >= PhaseProtectRestartTimes))
  362. {
  363. FaultCommuMonCt = 3;
  364. }
  365. else if ((mcFaultSource == FaultStall) && (mcProtectTime.StallTimes >= StallProtectRestartTimes))
  366. {
  367. FaultCommuMonCt = 3;
  368. }
  369. else if ((mcFaultSource == FaultIbusOffset) && (mcProtectTime.IbusOffsetProtectTimes >= IbusOffsetRestartTimes))
  370. {
  371. FaultCommuMonCt = 4;
  372. }
  373. else if (mcFaultSource == FaultIpmTemp)
  374. {
  375. FaultCommuMonCt = 27;
  376. }
  377. else if (mcFaultSource == FaultUnderVoltage)
  378. {
  379. FaultCommuMonCt = 2;
  380. }
  381. else if (mcFaultSource == FaultOverVoltage)
  382. {
  383. FaultCommuMonCt = 1;
  384. }
  385. else if (mcFaultSource == FaultGuanTempSensor)
  386. {
  387. FaultCommuMonCt = 19;
  388. }
  389. else if (mcFaultSource == FaultHuanTempSensor)
  390. {
  391. FaultCommuMonCt = 20;
  392. }
  393. else
  394. {
  395. FaultCommuMonCt = 0;
  396. }
  397. }
  398. #endif