uart_J.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /**
  2. ******************************************************************************
  3. * @file uart_J.c
  4. * @author
  5. * @version V1.0.0
  6. * @date 23-12-2015
  7. * @brief uart_J function.
  8. ******************************************************************************
  9. *
  10. * COPYRIGHT(c) 2015 STMicroelectronics
  11. *
  12. * Redistribution and use in source and binary forms, with or without modification,
  13. * are permitted provided that the following conditions are met:
  14. * 1. Redistributions of source code must retain the above copyright notice,
  15. * this list of conditions and the following disclaimer.
  16. * 2. Redistributions in binary form must reproduce the above copyright notice,
  17. * this list of conditions and the following disclaimer in the documentation
  18. * and/or other materials provided with the distribution.
  19. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  20. * may be used to endorse or promote products derived from this software
  21. * without specific prior written permission.
  22. *
  23. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  24. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  26. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  27. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  29. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  30. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  31. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  32. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. *
  34. ******************************************************************************
  35. */
  36. /* Includes ------------------------------------------------------------------*/
  37. #include "uart_J.h"
  38. #include "string.h"
  39. #include "usart.h"
  40. #include "canAppl.h"
  41. #include "syspar.h"
  42. #include "bikebrake.h"
  43. #include "bikethrottle.h"
  44. /******************************
  45. *
  46. * Parameter
  47. *
  48. ******************************/
  49. J_OBC2MCInfo_Struct_t J_stOBC2MCInfo;
  50. /******************************
  51. *
  52. * Functions
  53. *
  54. ******************************/
  55. /***************************************************************
  56. Function:
  57. Description: OBC set MC parameter(轮径 电流阈值/功率阈值 限速值)
  58. Call by:
  59. Input Variables: N/A
  60. Output/Return Variables: N/A
  61. Subroutine Call: N/A;
  62. Reference: N/A
  63. ****************************************************************/
  64. void J_OBCSetPara(JOBC_SetInfo_Struct_t obc_setinfo)
  65. {
  66. UWORD SpeedLimitation = 0;
  67. UWORD WheelPerimeter = 0;
  68. /*参数设定*/
  69. /*限速阈值更新*/
  70. SpeedLimitation = (UWORD)(obc_setinfo.Set_Bit.ucSpeedLimitation + 10);
  71. if(MC_UpcInfo.stAssistInfo.uwAssistLimitBikeSpdStart != SpeedLimitation)
  72. {
  73. MC_UpcInfo.stAssistInfo.uwAssistLimitBikeSpdStart = SpeedLimitation;
  74. MC_UpcInfo.stAssistInfo.uwAssistLimitBikeSpdStop = SpeedLimitation + 2;
  75. MC_UpcInfo.stBikeInfo.uwThrottleMaxSpdKmH = SpeedLimitation;
  76. MC_UpcInfo.stBikeInfo.uwSaveFlg = 1;
  77. MC_UpcInfo.stAssistInfo.uwSaveFlg = 1;
  78. cp_stFlg.ParaSaveEEFlg = TRUE;
  79. cp_stFlg.ParaUpdateFlg = TRUE;
  80. cp_stFlg.ParaAInfoUpdateFlg = TRUE;
  81. cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
  82. cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
  83. }
  84. /*轮径*/
  85. /*轮径更新*/
  86. if(obc_setinfo.Set_Bit.ucWheelDiameterCode <= 5)
  87. {
  88. WheelPerimeter = (obc_setinfo.Set_Bit.ucWheelDiameterCode*2 + 16) * 8; //3.14*2.54=7.9756=8
  89. }
  90. else if(obc_setinfo.Set_Bit.ucWheelDiameterCode == 6)
  91. {
  92. WheelPerimeter = 219; //3.14*700mm=2198mm
  93. }
  94. else
  95. {
  96. WheelPerimeter = 223; //3.14*2.54*28
  97. }
  98. if(MC_UpcInfo.stBikeInfo.uwWheelPerimeter != WheelPerimeter)
  99. {
  100. MC_UpcInfo.stBikeInfo.uwWheelPerimeter = WheelPerimeter;
  101. MC_UpcInfo.stBikeInfo.uwSaveFlg = 1;
  102. cp_stFlg.ParaSaveEEFlg = TRUE;
  103. cp_stFlg.ParaUpdateFlg = TRUE;
  104. cp_stFlg.ParaBikeInfoUpdateFlg = TRUE;
  105. cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
  106. }
  107. }
  108. /***************************************************************
  109. Function: ;
  110. Description: Get OBC GearSt and LightControl information
  111. Call by:
  112. Input Variables: N/A
  113. Output/Return Variables: N/A
  114. Subroutine Call: N/A;
  115. Reference: N/A
  116. ****************************************************************/
  117. void J_USART_DataProcess(USART_Buf_TypeDef* ptUartTx, UBYTE* Data)
  118. {
  119. /*数据获取*/
  120. memcpy(&J_stOBC2MCInfo.stCtrlInfo, &Data[1], 1);
  121. memcpy(&J_stOBC2MCInfo.stSetInfo, &Data[2], 1);
  122. /*数据更新*/
  123. if(Data[0] == 0x53)
  124. {
  125. MC_ControlCode.GearSt = MC_GearSt_OFF;//起始符发送 S,此时需控制器停止电机驱动
  126. }
  127. else if(J_stOBC2MCInfo.stCtrlInfo.Ctrl_Bit.Walk == 1)
  128. {
  129. MC_ControlCode.GearSt = MC_GearSt_WALK;
  130. }
  131. else if(J_stOBC2MCInfo.stCtrlInfo.Ctrl_Bit.ucGearSt == 5)
  132. {
  133. MC_ControlCode.GearSt = MC_GearSt_SMART;
  134. }
  135. else if(J_stOBC2MCInfo.stCtrlInfo.Ctrl_Bit.ucGearSt == 4)
  136. {
  137. MC_ControlCode.GearSt = MC_GearSt_Torque_TURBO;
  138. }
  139. else if(J_stOBC2MCInfo.stCtrlInfo.Ctrl_Bit.ucGearSt == 3)
  140. {
  141. MC_ControlCode.GearSt = MC_GearSt_Torque_SPORT;
  142. }
  143. else if(J_stOBC2MCInfo.stCtrlInfo.Ctrl_Bit.ucGearSt == 2)
  144. {
  145. MC_ControlCode.GearSt = MC_GearSt_Torque_NORM;
  146. }
  147. else if(J_stOBC2MCInfo.stCtrlInfo.Ctrl_Bit.ucGearSt == 1)
  148. {
  149. MC_ControlCode.GearSt = MC_GearSt_Torque_ECO;
  150. }
  151. else
  152. {
  153. MC_ControlCode.GearSt = MC_GearSt_OFF;
  154. }
  155. if(J_stOBC2MCInfo.stCtrlInfo.Ctrl_Bit.Light == 1) //大灯
  156. {
  157. MC_ControlCode.LightSwitch = MC_LightSwitch_ON;
  158. }
  159. else
  160. {
  161. MC_ControlCode.LightSwitch = MC_LightSwitch_OFF;
  162. }
  163. MC_RunInfo.GearSt = MC_ControlCode.GearSt; //当前助力档位更新
  164. MC_RunInfo.LightSwitch = MC_ControlCode.LightSwitch; //大灯状态更新
  165. ulOBC_ComTimeOutCount = cp_ulSystickCnt;
  166. //J_OBCSetPara();//参数更新
  167. J_SendData_OBC(ptUartTx,Data[3]);
  168. }
  169. /***************************************************************
  170. Function:
  171. Description: Send Data to OBC
  172. Call by:
  173. Input Variables: N/A
  174. Output/Return Variables: N/A
  175. Subroutine Call: N/A;
  176. Reference: N/A
  177. ****************************************************************/
  178. void J_SendData_OBC(USART_Buf_TypeDef* ptUartTx, UBYTE checkAdjust)
  179. {
  180. UBYTE i = 0;
  181. UBYTE databuf[8] = {0};
  182. UWORD checkxor = 0;
  183. UBYTE datalen = 8;
  184. UWORD Speed = 0;
  185. UBYTE Current = 0, Vlot = 0, errorCode = 0;
  186. /*数据发送*/
  187. if(1 == MC_ErrorCode.ERROR_Bit.Protect_UnderVoltage)
  188. {
  189. Vlot = 0;//欠压
  190. }
  191. else if(MC_RunInfo.SOC == 100)
  192. {
  193. Vlot = 5; //100%
  194. }
  195. else
  196. {
  197. Vlot = (UBYTE)((MC_RunInfo.SOC / 20) + 1);//1:0-19; 2:20-39; 3:40-59; 4:60-79; 5:80-99
  198. }
  199. Current = (UBYTE)(abs(MC_RunInfo.BusCurrent/1000)*3);//电流
  200. if(bikespeed_stFreGetOut.uwLPFFrequencyPu == 0)
  201. {
  202. Speed = 0;
  203. }
  204. else
  205. {
  206. Speed = (UWORD)((SQWORD)(1000 << 20) / bikespeed_stFreGetOut.uwLPFFrequencyPu / FBASE); //车轮转动一圈时间,ms
  207. }
  208. if(1 == MC_ErrorCode.ERROR_Bit.Protect_OverCurrent)
  209. {
  210. errorCode = 0x21;//电流异常
  211. }
  212. else if(1 == MC_ErrorCode.ERROR_Bit.Fault_Throttle)
  213. {
  214. errorCode = 0x22;//转把异常
  215. }
  216. else if(1 == MC_ErrorCode.ERROR_Bit.Fault_PhaseLine)
  217. {
  218. errorCode = 0x23;//电机缺相
  219. }
  220. else if(1 == MC_ErrorCode.ERROR_Bit.Fault_HallSensor)
  221. {
  222. errorCode = 0x24;//电机霍尔异常
  223. }
  224. /*else if(0)
  225. {
  226. errorCode = 0x25;//刹车异常
  227. }*/
  228. databuf[0] = 0x46;//'F'
  229. databuf[1] = Vlot;
  230. databuf[2] = Current;
  231. databuf[3] = (UBYTE)((Speed & 0xFF00)>>8);
  232. databuf[4] = (UBYTE)(Speed & 0xFF);
  233. databuf[5] = checkAdjust;
  234. databuf[6] = errorCode;
  235. for(i=1; i<(datalen-1); i++)
  236. {
  237. checkxor ^= databuf[i];
  238. }
  239. databuf[datalen-1] = checkxor;
  240. for(i=0; i<datalen; i++)
  241. {
  242. UART_PutChar(ptUartTx, databuf[i]);
  243. }
  244. }
  245. /***************************************************************
  246. Function:
  247. Description: Get Uart Data following the protocol
  248. Call by:
  249. Input Variables: N/A
  250. Output/Return Variables: N/A
  251. Subroutine Call: N/A;
  252. Reference: N/A
  253. ****************************************************************/
  254. void J_USART_RxData_Process(USART_Buf_TypeDef* ptUartTx, UBYTE* buf, UWORD dataCount)
  255. {
  256. static UBYTE Data[255];
  257. //UWORD Cmd, ID;
  258. UWORD i;
  259. UBYTE CheckXorResult=0, CheckXorData=0;
  260. if(dataCount == 6)
  261. {
  262. if((buf[0] == 0x46) || (buf[0] == 0x53))//帧头'F' 'S'
  263. {
  264. if(buf[dataCount-1] == 0x0D)//帧尾
  265. {
  266. for(i=0; i<dataCount; i++)//数据
  267. {
  268. Data[i] = buf[i];
  269. }
  270. CheckXorData = buf[dataCount-2];//异或校验
  271. for(i = 1; i<(dataCount-2); i++)
  272. {
  273. CheckXorResult ^= Data[i];
  274. }
  275. if(CheckXorData == CheckXorResult)// 校验和正常
  276. {
  277. J_USART_DataProcess(ptUartTx, &Data[0]);
  278. }
  279. }
  280. }
  281. }
  282. }
  283. /************************ (C) END OF FILE *********************************/