soft_can.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. #include "soft_can.h"
  2. #include "rkfifo.h"
  3. #include "chipflash.h"
  4. #include "math.h"
  5. #include "init.h"
  6. #include "string.h"
  7. #include "my_math.h"
  8. #include "timer.h"
  9. #define MAX_FLITER 2
  10. #define MAX_FRAME_DATA 8
  11. #define CAN_TX_FIFO_SIZE 4
  12. #define CAN_RX_FIFO_SIZE 4
  13. typedef struct
  14. {
  15. CAN_TxHeaderTypeDef Txheader;
  16. uint8_t Txdata[MAX_FRAME_DATA];
  17. } Can_Tx;
  18. typedef struct
  19. {
  20. CAN_RxHeaderTypeDef Rxheader;
  21. uint8_t Rxdata[MAX_FRAME_DATA];
  22. } Can_Rx;
  23. static ACK_STATUS ack_status = no_ack;
  24. static CAN_FilterTypeDef hCAN_Filter[MAX_FLITER] = {0};
  25. static Can_Tx can_tx_fifo_buff[CAN_TX_FIFO_SIZE] = {0};
  26. static Can_Rx can_rx_fifo_buff[CAN_RX_FIFO_SIZE] = {0};
  27. static rkfifo_t can_tx_kfifo = {0};
  28. static rkfifo_t can_rx_kfifo = {0};
  29. static Can_Tx _can_tx = {0};
  30. static Can_Rx _can_rx = {0};
  31. FORMAT_CAN2PMU *Get_Tx_Msg(void)
  32. {
  33. return (FORMAT_CAN2PMU *)&_can_tx.Txdata;
  34. }
  35. ACK_STATUS *Get_Ack_Status(void)
  36. {
  37. return &ack_status;
  38. }
  39. void Set_Ack_Status(ACK_STATUS status)
  40. {
  41. ack_status = status;
  42. }
  43. static void Can_Fifo_Init(void)
  44. {
  45. rkfifo_init(&can_tx_kfifo, can_tx_fifo_buff, sizeof(can_tx_fifo_buff), sizeof(Can_Tx));
  46. rkfifo_init(&can_rx_kfifo, can_rx_fifo_buff, sizeof(can_rx_fifo_buff), sizeof(Can_Rx));
  47. }
  48. static void Set_ExtId(uint32_t ExtId)
  49. {
  50. _can_tx.Txheader.ExtId = ExtId;
  51. }
  52. static void Filter_Init(uint8_t index, uint32_t FirstId, uint32_t SecondId)
  53. {
  54. CAN_FilterTypeDef *pfilter = &hCAN_Filter[index];
  55. pfilter->FilterIdHigh = ((FirstId << 3) & HIGH_MASK) >> 16;
  56. pfilter->FilterIdLow = ((FirstId << 3) | CAN_ID_EXT | CAN_RTR_DATA) & LOW_MASK;
  57. pfilter->FilterMaskIdHigh = ((SecondId << 3) & HIGH_MASK) >> 16;
  58. pfilter->FilterMaskIdLow = ((SecondId << 3) | CAN_ID_EXT | CAN_RTR_DATA) & LOW_MASK;
  59. pfilter->FilterFIFOAssignment = CAN_FILTER_FIFO0;
  60. pfilter->FilterBank = index;
  61. pfilter->FilterMode = CAN_FILTERMODE_IDLIST;
  62. pfilter->FilterScale = CAN_FILTERSCALE_32BIT;
  63. pfilter->FilterActivation = ENABLE;
  64. pfilter->SlaveStartFilterBank = index;
  65. HAL_CAN_ConfigFilter(&hcan, pfilter);
  66. }
  67. void CAN_Init(uint32_t ExtId)
  68. {
  69. CAN_TxHeaderTypeDef *p_txhead = &_can_tx.Txheader;
  70. Can_Fifo_Init();
  71. p_txhead->IDE = CAN_ID_EXT;
  72. p_txhead->RTR = CAN_RTR_DATA;
  73. p_txhead->TransmitGlobalTime = ENABLE;
  74. p_txhead->DLC = sizeof(_can_tx.Txdata);
  75. Filter_Init(0, CANRX_ID, CAN_REQ_UPGRADE_ID);
  76. Set_ExtId(ExtId);
  77. HAL_CAN_Start(&hcan);
  78. HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn);
  79. __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_ERROR | CAN_IT_ERROR_WARNING | CAN_IT_ERROR_PASSIVE | CAN_IT_BUSOFF | CAN_IT_LAST_ERROR_CODE);
  80. __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_RX_FIFO0_FULL | CAN_IT_RX_FIFO0_OVERRUN | CAN_IT_TX_MAILBOX_EMPTY);
  81. HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
  82. HAL_CAN_ActivateNotification(&hcan, CAN_IT_TX_MAILBOX_EMPTY);
  83. }
  84. void Can_Tx_Msg(Can_Tx *TxMsg)
  85. {
  86. uint32_t Tx_MailBox;
  87. if (HAL_CAN_GetTxMailboxesFreeLevel(&hcan) != 0)
  88. {
  89. if (HAL_CAN_AddTxMessage(&hcan, &TxMsg->Txheader, TxMsg->Txdata, &Tx_MailBox) != HAL_OK)
  90. {
  91. rkfifo_in(&can_tx_kfifo, &_can_tx, 1);
  92. }
  93. }
  94. else
  95. {
  96. rkfifo_in(&can_tx_kfifo, &_can_tx, 1);
  97. }
  98. }
  99. void CAN1_SCE_IRQHandler()
  100. {
  101. if (__HAL_CAN_GET_FLAG(&hcan, CAN_FLAG_BOF) != RESET)
  102. {
  103. __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
  104. }
  105. if (__HAL_CAN_GET_FLAG(&hcan, CAN_FLAG_EPV) != RESET)
  106. {
  107. __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
  108. }
  109. if (__HAL_CAN_GET_FLAG(&hcan, CAN_FLAG_EWG) != RESET)
  110. {
  111. __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
  112. }
  113. __HAL_CAN_CLEAR_FLAG(&hcan, CAN_FLAG_ERRI);
  114. }
  115. void Write_To_Flash(uint32_t first_flash, uint32_t end_flash, uint8_t *data, uint8_t size)
  116. {
  117. flash_ops->Erase_Flash(first_flash, end_flash);
  118. flash_ops->Write_Flash(first_flash, data, size);
  119. }
  120. static void Write_Check(void)
  121. {
  122. uint32_t tmp = Value_Check;
  123. Write_To_Flash(VALUE_FLASH_Check_Addr, VALUE_FLASH_Check_End, (uint8_t *)&tmp, sizeof(tmp));
  124. }
  125. // 擦除配置
  126. static void Restore_Factory_Setting(void)
  127. {
  128. for (uint8_t i = 0; i < 12; i++)
  129. {
  130. flash_ops->Erase_Flash(CAN_FLASH_BASE + ONE_PARAM_SIZE * i, CAN_FLASH_BASE + ONE_PARAM_SIZE * (i + 1));
  131. }
  132. }
  133. static void Save_GrossWeight(WEIGHING_DEVICE *_device)
  134. {
  135. uint8_t sensor_num_c = 0;
  136. Write_Check();
  137. flash_ops->Erase_Flash(GROSSWEIGHT1_FLASH_BASE, GROSSWEIGHT1_FLASH_END + ONE_PARAM_SIZE);
  138. for (sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  139. {
  140. if (sensor_num_c == _device->sensor_num_mask)
  141. {
  142. continue;
  143. }
  144. struct SENSOR *sensor = _device->sensor[sensor_num_c];
  145. flash_ops->Write_Flash(GROSSWEIGHT1_FLASH_BASE + sensor_num_c * ONE_WORD_SIZE, (uint8_t *)&sensor->GrossWeight, sizeof(sensor->GrossWeight));
  146. }
  147. }
  148. static float Get_Single_Weight(struct SENSOR *sensor, uint32_t buf)
  149. {
  150. return buf * sensor->Scale;
  151. }
  152. static bool Scale_Is_Nan(WEIGHING_DEVICE *_device)
  153. {
  154. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  155. {
  156. if (sensor_num_c == _device->sensor_num_mask)
  157. {
  158. continue;
  159. }
  160. if (isnan(_device->sensor[sensor_num_c]->Scale) == 1)
  161. {
  162. return true;
  163. }
  164. }
  165. return false;
  166. }
  167. static void K_Value_Init(WEIGHING_DEVICE *_device)
  168. {
  169. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  170. {
  171. if (sensor_num_c == _device->sensor_num_mask)
  172. {
  173. continue;
  174. }
  175. _device->sensor[sensor_num_c]->K.f = 112.0f;
  176. }
  177. }
  178. /*校准*/
  179. static bool Auto_Calib(WEIGHING_DEVICE *_device, uint32_t buf)
  180. {
  181. WEIGHING_DEVICE *device = Get_Device_Handle();
  182. //采样10次取平均
  183. uint32_t sum[4] = {0}, data[4] = {0}, err_count = 0;
  184. for(uint8_t i = 0; i < 10; i++)
  185. {
  186. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  187. {
  188. uint32_t temp = 0;
  189. if (sensor_num_c == device->sensor_num_mask)
  190. {
  191. continue;
  192. }
  193. temp = Read_Value(device->sensor[sensor_num_c]);
  194. while (temp== 0)
  195. {
  196. temp = Read_Value(device->sensor[sensor_num_c]);
  197. err_count++;
  198. if (err_count > 10 /*&& device->sensor_num_mask == 4*/)
  199. {
  200. device->sensor[sensor_num_c]->err_flag = true;
  201. device->sensor_num_mask = sensor_num_c;
  202. err_count = 0;
  203. //test 去皮失败
  204. return 0;
  205. }
  206. }
  207. sum[sensor_num_c] += temp;
  208. if(i == 9)
  209. data[sensor_num_c] = sum[sensor_num_c] / 10;
  210. HAL_Delay(13);
  211. }
  212. }
  213. Filter_Value(data);
  214. float allot = 0.f;
  215. float buff[SENSOR_NUM] = {0.f};
  216. //计算总重量
  217. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  218. {
  219. if (sensor_num_c == device->sensor_num_mask)
  220. {
  221. continue;
  222. }
  223. buff[sensor_num_c] = device->sensor[sensor_num_c]->Raw_Value;
  224. allot += buff[sensor_num_c];
  225. }
  226. //计算每个传感器重量占比
  227. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  228. {
  229. if (sensor_num_c == device->sensor_num_mask)
  230. {
  231. continue;
  232. }
  233. device->sensor[sensor_num_c]->Scale = buff[sensor_num_c] / allot;
  234. }
  235. float sum_baseK_weight = 0.0f;
  236. //计算测量K
  237. if (!Scale_Is_Nan(_device))
  238. {
  239. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  240. {
  241. if (sensor_num_c == _device->sensor_num_mask)
  242. {
  243. continue;
  244. }
  245. struct SENSOR *sensor = _device->sensor[sensor_num_c];
  246. //float tmpfloat = (sensor->Real_Variation / Get_Single_Weight(sensor, buf));
  247. if (sensor->Real_Variation < 0)
  248. {
  249. sensor->Real_Variation = fabsf(sensor->Real_Variation);
  250. }
  251. sum_baseK_weight += sensor->Real_Variation / sensor-> base_k ;
  252. //if (tmpfloat <= MAX_K && tmpfloat >= MIN_K)
  253. {
  254. //sensor->K.f = tmpfloat;
  255. }
  256. // else //test
  257. // {
  258. // return false;
  259. // }
  260. }
  261. _device->correct_k = sum_baseK_weight / buf;
  262. Write_To_Flash(K1_VALUE_FLASH_BASE, K1_VALUE_FLASH_END, (uint8_t *)&_device->correct_k, sizeof(_device->correct_k));
  263. return true;
  264. }
  265. return false;
  266. }
  267. /*获取E2指令的K值*/
  268. static float Get_K(FORMAT_RXMSG *msg)
  269. {
  270. uint16_t tmpshort = 0;
  271. float tmpfloat = 0.0f;
  272. memcpy(&tmpshort, &msg->Data, sizeof(tmpshort));
  273. tmpfloat = tmpshort;
  274. if(tmpshort > 1000)
  275. {
  276. tmpfloat = tmpfloat / 10.0f;
  277. }
  278. if (tmpfloat <= MAX_K && tmpfloat >= MIN_K)
  279. {
  280. return (float)tmpfloat;
  281. }
  282. return 112.0f;
  283. }
  284. /*设置E2指令的K值并写入FLASH默认配置,可用到F2指令*/
  285. static void Save_K(FORMAT_RXMSG *msg, uint8_t sensor)
  286. {
  287. WEIGHING_DEVICE *device = Get_Device_Handle();
  288. struct SENSOR *Sensor_tmp = device->sensor[sensor];
  289. uint32_t tmpint = 0;
  290. memcpy(&tmpint, msg->Data, sizeof(tmpint));
  291. Write_Check(); // 写入检验位
  292. /*E2指令才获取K值,F2自动校准使用校准后的K值*/
  293. if (msg->Code == 0xE2)
  294. {
  295. switch (tmpint)
  296. {
  297. case 0x1: //重量标定
  298. Sensor_tmp->base_k = Sensor_tmp->Real_Variation / 1000;
  299. if (Sensor_tmp->base_k >= MAX_K || Sensor_tmp->base_k < MIN_K)
  300. {
  301. Sensor_tmp->base_k = 75.0f;
  302. }
  303. Write_To_Flash(SENSOR1_INIT_VALUE_BASE + sensor * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + sensor * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
  304. break;
  305. case 0x3://指定抛弃第N个传感器
  306. /*指定弃置传感器的话不能改变传感器数量,使用mask作为标志位屏蔽某个传感器*/
  307. device->sensor_num_mask = sensor;
  308. flash_ops->Erase_Flash(SENSOR_NUM_RECORD_BASE, SENSOR_NUM_RECORD_END);
  309. Sensor_tmp->err_flag = false;
  310. flash_ops->Write_Flash(SENSOR_NUM_RECORD_BASE, (uint8_t *)&device->sensor_num_mask, sizeof(device->sensor_num_mask));
  311. return;
  312. case 0x4://恢复使用4个传感器·
  313. // param->sensor_num = SENSOR_NUM;
  314. flash_ops->Erase_Flash(SENSOR_NUM_RECORD_BASE, SENSOR_NUM_RECORD_END);
  315. device->sensor_num_mask = SENSOR_NUM;
  316. flash_ops->Write_Flash(SENSOR_NUM_RECORD_BASE, (uint8_t *)&device->sensor_num_mask, sizeof(device->sensor_num_mask));
  317. break;
  318. case 0x29A:
  319. if (sensor == 3)
  320. {
  321. Restore_Factory_Setting();
  322. NVIC_SystemReset();
  323. }
  324. break;
  325. default:
  326. Sensor_tmp->base_k = Get_K(msg);
  327. Write_To_Flash(SENSOR1_INIT_VALUE_BASE + sensor * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + sensor * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
  328. break;
  329. }
  330. }
  331. //Write_To_Flash(SENSOR1_INIT_VALUE_BASE + sensor * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + sensor * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
  332. }
  333. /*去皮重,重设零点*/
  334. static bool Peeling_Calib(void)
  335. {
  336. WEIGHING_DEVICE *device = Get_Device_Handle();
  337. //采样10次取平均
  338. uint32_t sum[4] = {0}, data[4] = {0}, err_count = 0;
  339. for(uint8_t i = 0; i < 10; i++)
  340. {
  341. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  342. {
  343. uint32_t temp = 0;
  344. if (sensor_num_c == device->sensor_num_mask)
  345. {
  346. continue;
  347. }
  348. temp = Read_Value(device->sensor[sensor_num_c]);
  349. while (temp== 0)
  350. {
  351. temp = Read_Value(device->sensor[sensor_num_c]);
  352. err_count++;
  353. if (err_count > 10 /*&& device->sensor_num_mask == 4*/)
  354. {
  355. device->sensor[sensor_num_c]->err_flag = true;
  356. device->sensor_num_mask = sensor_num_c;
  357. err_count = 0;
  358. //test 去皮失败
  359. return 0;
  360. }
  361. }
  362. sum[sensor_num_c] += temp;
  363. if(i == 9)
  364. data[sensor_num_c] = sum[sensor_num_c] / 10;
  365. HAL_Delay(13);
  366. }
  367. }
  368. Filter_Value(data);
  369. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  370. {
  371. if (sensor_num_c == device->sensor_num_mask)
  372. {
  373. continue;
  374. }
  375. device->sensor[sensor_num_c]->GrossWeight = device->sensor[sensor_num_c]->Raw_Value;
  376. }
  377. Save_GrossWeight(device);
  378. return 1;
  379. }
  380. /*称重校准*/
  381. static void Weight_Calib(FORMAT_RXMSG *msg)
  382. {
  383. uint32_t tmpint;
  384. uint8_t sensor_num_c;
  385. WEIGHING_DEVICE *device = Get_Device_Handle();
  386. memcpy(&tmpint, msg->Data, sizeof(tmpint));
  387. if (false == Auto_Calib(device, tmpint))
  388. {
  389. K_Value_Init(device);
  390. }
  391. Write_Check();
  392. for (sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++)
  393. {
  394. if (sensor_num_c == device->sensor_num_mask)
  395. {
  396. continue;
  397. }
  398. Save_K(msg, sensor_num_c); // 写入FLASH 默认配置
  399. }
  400. }
  401. /*改变CAN通信波特率*/
  402. static void Change_CAN_Baud(FORMAT_RXMSG *msg)
  403. {
  404. uint16_t baudflag;
  405. memcpy(&baudflag, msg->Data, sizeof(baudflag));
  406. if (baudflag != 0x1F4 && baudflag != 0x3E8)
  407. {
  408. return;
  409. }
  410. Write_To_Flash(CAN_FLASH_BASE, CAN_FLASH_END, (uint8_t *)&baudflag, sizeof(baudflag));
  411. HAL_CAN_DeInit(&hcan);
  412. if (baudflag == 0x1F4)
  413. {
  414. MX_CAN_Init(8); // 500K
  415. CAN_Init(CANTX_ID);
  416. }
  417. else
  418. {
  419. MX_CAN_Init(4); // 1000K
  420. CAN_Init(CANTX_ID);
  421. }
  422. }
  423. /*写完flag重启*/
  424. static void Soft_Reset(void)
  425. {
  426. uint8_t buf[8] = {0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7};
  427. Write_To_Flash(RESET_FLASH_BASE, RESET_FLASH_END, buf, sizeof(buf));
  428. __set_FAULTMASK(1); // 软重启,主函数做了读取RCC_FLAG_SFTRST发送应答报文
  429. NVIC_SystemReset(); // 加上bootloader后读取标志位方法不可用,改为读写片内flash();
  430. }
  431. static void Reset_Device_Param(void)
  432. {
  433. Restore_Factory_Setting();
  434. Soft_Reset();
  435. }
  436. uint8_t k_set_num_test = 0;
  437. bool factory_calibration = false;
  438. /*解析PMU消息*/
  439. void Can_Rx_Decode(void)
  440. {
  441. Can_Rx *parse = &_can_rx;
  442. while (rkfifo_out(&can_rx_kfifo, parse, 1) == 1)
  443. {
  444. FORMAT_RXMSG *msg = (FORMAT_RXMSG *)parse->Rxdata;
  445. if (parse->Rxheader.ExtId == CAN_REQ_UPGRADE_ID && msg->Code == WS_ID) // 跳BOOTLOADER并将APP大小写入FLASH
  446. {
  447. buf2int((int *)&ws_info._app_bin_size, (unsigned char *)msg->Data);
  448. Write_Upgrade_Flag();
  449. __set_FAULTMASK(1);
  450. NVIC_SystemReset();
  451. }
  452. switch (parse->Rxdata[0])
  453. {
  454. case 0xF1: // 去皮校准
  455. if(Peeling_Calib() == 1)
  456. ack_status = ack_f1;
  457. else
  458. ack_status = no_ack;
  459. break;
  460. case 0xF2: // 重量校准
  461. Weight_Calib(msg);
  462. ack_status = ack_f2;
  463. break;
  464. case 0xF3: // 更改波特率
  465. Change_CAN_Baud(msg);
  466. break;
  467. case 0xF4: // 恢复出厂设置
  468. {
  469. WEIGHING_DEVICE *device = Get_Device_Handle();
  470. //Reset_Device_Param();
  471. device->correct_k = 1;
  472. Write_To_Flash(K1_VALUE_FLASH_BASE, K1_VALUE_FLASH_END, (uint8_t *)&device->correct_k, sizeof(device->correct_k));
  473. ack_status = ack_f4;
  474. break;
  475. }
  476. case 0xF6: // 软件版本
  477. ack_status = ack_f6;
  478. break;
  479. case 0xE1: // 查询K值
  480. ack_status = ack_e1;
  481. break;
  482. case 0xE2: // 设置K值
  483. Save_K(msg, msg->Num);
  484. ack_status = ack_e2;
  485. k_set_num_test = msg->Num;
  486. Can_Ack_Pmu();
  487. ack_status = ack_e1;
  488. break;
  489. case 0xF5:
  490. break;
  491. case 0xF7:
  492. break;
  493. case 0xE3:
  494. break;
  495. case 0xE4:
  496. break;
  497. case 0xE5:
  498. break;
  499. case 0xE6:
  500. break;
  501. case 0xE7://出厂K标定
  502. {
  503. WEIGHING_DEVICE *device = Get_Device_Handle();
  504. for(uint8_t i = 0; i < 4; i++)
  505. {
  506. struct SENSOR *Sensor_tmp = device->sensor[i];
  507. Sensor_tmp->base_k = Sensor_tmp->Real_Variation / 1000;
  508. if (Sensor_tmp->base_k >= MAX_K || Sensor_tmp->base_k < MIN_K)
  509. {
  510. Sensor_tmp->base_k = 76.0f;
  511. }
  512. Write_To_Flash(SENSOR1_INIT_VALUE_BASE + i * ONE_PARAM_SIZE, SENSOR1_INIT_VALUE_END + i * ONE_PARAM_SIZE, (uint8_t *)&Sensor_tmp->base_k, sizeof(Sensor_tmp->base_k));
  513. }
  514. ack_status = ack_e7;
  515. factory_calibration = true;
  516. break;
  517. }
  518. default:
  519. break;
  520. }
  521. }
  522. Can_Ack_Pmu();
  523. }
  524. static void Can_Txmsg_Init(void)
  525. {
  526. FORMAT_CAN2PMU *msg = (FORMAT_CAN2PMU *)_can_tx.Txdata;
  527. _can_tx.Txheader.ExtId = CANTX_ID;
  528. memset(msg, 0, sizeof(FORMAT_CAN2PMU));
  529. }
  530. static void Can_Ackmsg_Init(FORMAT_ACKMSG *msg)
  531. {
  532. _can_tx.Txheader.ExtId = CAN_ACK_ID;
  533. msg->Code = ack_status;
  534. memset(msg->Data, 0, sizeof(msg->Data));
  535. msg->CRCH = 0xFE;
  536. msg->CRCL = 0xFE;
  537. msg->Num = 0;
  538. }
  539. void Can_Ack_Pmu(void)
  540. {
  541. FORMAT_ACKMSG *msg = (FORMAT_ACKMSG *)_can_tx.Txdata;
  542. if (ack_status == no_ack)
  543. {
  544. return;
  545. }
  546. WEIGHING_DEVICE *device = Get_Device_Handle();
  547. uint16_t tmpshort = 0;
  548. uint32_t tmpint = 0;
  549. Can_Ackmsg_Init(msg);
  550. switch (ack_status)
  551. {
  552. case ack_f1:
  553. case ack_f4:
  554. break;
  555. case ack_f2:
  556. tmpint = device->Weight_current;
  557. memcpy(&msg->Data, &tmpint, sizeof(tmpint));
  558. rkfifo_in(&can_tx_kfifo, &_can_tx, 1);
  559. Can_Txmsg_Init();
  560. ack_status = ack_e1;
  561. return;
  562. case ack_f6:
  563. tmpint = SOFT_VER;
  564. msg->Num = HARD_VER;
  565. memcpy(msg->Data, &tmpint, sizeof(tmpint));
  566. break;
  567. case ack_e1:
  568. for(uint8_t i = 0; i < 4;i++)
  569. {
  570. if( isnan(device->sensor[i]->base_k))
  571. {
  572. device->sensor[i]->base_k = 88;
  573. }
  574. }
  575. tmpshort = (uint16_t)device->sensor[0]->base_k;
  576. memcpy(msg->Data, &tmpshort, sizeof(tmpshort));
  577. tmpshort = (uint16_t)device->sensor[1]->base_k;
  578. memcpy(msg->Data + 2, &tmpshort, sizeof(tmpshort));
  579. msg->Num = 0x01;
  580. rkfifo_in(&can_tx_kfifo, &_can_tx, 1);
  581. tmpshort = ((uint16_t)device->sensor[2]->base_k) & 0x00FF;
  582. memcpy(msg->Data, &tmpshort, sizeof(tmpshort));
  583. tmpshort = ((uint16_t)device->sensor[3]->base_k) & 0xFF;
  584. memcpy(msg->Data + 2, &tmpshort, sizeof(tmpshort));
  585. msg->Num = 0x02;
  586. break;
  587. case ack_e2:
  588. tmpshort = (uint16_t)device->sensor[0]->K.f;
  589. memcpy(msg->Data, &tmpshort, sizeof(tmpshort));
  590. msg->Num = _can_rx.Rxdata[7];
  591. break;
  592. default:
  593. break;
  594. }
  595. ack_status = no_ack;
  596. rkfifo_in(&can_tx_kfifo, &_can_tx, 1);
  597. Can_Txmsg_Init();
  598. }
  599. void can2Pmu_3hz_info(void)
  600. {
  601. WEIGHING_DEVICE *device = Get_Device_Handle();
  602. CAN_TxHeaderTypeDef Txheader;
  603. char Data[8] = {0};
  604. Txheader.ExtId = CANTX_ID2;
  605. Txheader.RTR = CAN_RTR_DATA;
  606. Txheader.IDE = CAN_ID_EXT;
  607. Txheader.DLC = 8;
  608. uint16_t temp = 0;
  609. temp = device->sensor[0]->Real_Weight / 10 ;
  610. memcpy(&Data[0],(uint16_t*)&temp,2);
  611. temp = device->sensor[1]->Real_Weight / 10 ;
  612. memcpy(&Data[2],(int16_t*)&temp,2);
  613. temp = device->sensor[2]->Real_Weight / 10 ;
  614. memcpy(&Data[4],(int16_t*)&temp,2);
  615. temp = device->sensor[3]->Real_Weight / 10 ;
  616. memcpy(&Data[6],(int16_t*)&temp,2);
  617. // if(device->sensor_num_mask == 3)
  618. // {
  619. // Data[6] = 0;
  620. // Data[7] = 0;
  621. // }
  622. uint32_t time2 = HAL_GetTick();
  623. uint32_t TxMailBox0 = 0;
  624. while (HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0 && HAL_GetTick() - time2 < 5)
  625. ;
  626. HAL_CAN_AddTxMessage(&hcan, &Txheader, Data, &TxMailBox0);
  627. }
  628. void CAN2PMU_Send(void)
  629. {
  630. WEIGHING_DEVICE *device = Get_Device_Handle();
  631. static FORMAT_CAN2PMU *msg = (FORMAT_CAN2PMU *)_can_tx.Txdata;
  632. uint32_t tmp = (uint32_t)(fabsf(device->Weight_current));
  633. device->Weight_last = device->Weight_current;
  634. memcpy(msg->Weight, &tmp, sizeof(tmp));
  635. _can_tx.Txheader.ExtId = CANTX_ID;
  636. Can_Tx_Msg(&_can_tx);
  637. }
  638. void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
  639. {
  640. if (hcan->Instance == CAN1)
  641. {
  642. Can_Tx can_tx;
  643. uint32_t mailbox = 0;
  644. if (rkfifo_out(&can_tx_kfifo, &can_tx, 1) == 1)
  645. {
  646. HAL_CAN_AddTxMessage(hcan, &can_tx.Txheader, can_tx.Txdata, &mailbox);
  647. }
  648. }
  649. }
  650. // void CAN_Tx_Empty_Callback(CAN_HandleTypeDef *hcan)
  651. // {
  652. // if (hcan->Instance == CAN1)
  653. // {
  654. // Can_Tx can_tx;
  655. // uint32_t mailbox = 0;
  656. // if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TME0) != RESET)
  657. // {
  658. // if (rkfifo_out(&can_tx_kfifo, &can_tx, 1) == 1)
  659. // {
  660. // HAL_CAN_AddTxMessage(hcan, &can_tx.Txheader, can_tx.Txdata, &mailbox);
  661. // }
  662. // }
  663. // hcan->Instance->TSR = CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2;
  664. // }
  665. // }
  666. void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
  667. {
  668. if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FF0) != RESET)
  669. {
  670. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0);
  671. }
  672. else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0) != RESET)
  673. {
  674. __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
  675. }
  676. if (hcan->Instance == CAN1)
  677. {
  678. Can_Rx can_rx;
  679. HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &can_rx.Rxheader, (uint8_t *)&can_rx.Rxdata);
  680. rkfifo_in(&can_rx_kfifo, &can_rx, 1);
  681. }
  682. }
  683. #if 0
  684. if(fitted_data.Fitted_Count == 0)
  685. {
  686. Set_Fitted_Data(Param,buf);
  687. }
  688. if(fitted_data.Fitted_Count != 0 && fitted_data.Fitted_Count < 8)
  689. {
  690. Set_Fitted_Data(Param,buf);
  691. for(sensor_num_c = 0; sensor_num_c < SENSOR_NUM;sensor_num_c++)
  692. {
  693. Apply_Least_Squares(Param->sensor[sensor_num_c]);
  694. }
  695. }
  696. fitted_data.Fitted_Count++; //count + 1 作为样本数
  697. if(fitted_data.Fitted_Count >= 7)
  698. {
  699. fitted_data.Fitted_Count = 0;
  700. }
  701. #endif
  702. #if 0
  703. void Set_Fitted_Data(WEIGHING_PARAM* param ,uint32_t buf)
  704. {
  705. for(uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM;sensor_num_c++)
  706. {
  707. struct SENSOR* sensor = param->sensor[sensor_num_c];
  708. fitted_data.RealWeight[sensor_num_c][fitted_data.Fitted_Count] = Get_Single_Weight(sensor, buf);
  709. fitted_data.Real_Variation[sensor_num_c][fitted_data.Fitted_Count] = sensor->Real_Variation;
  710. }
  711. }
  712. void Apply_Least_Squares(struct SENSOR* sensor)
  713. {
  714. Least_Squares(fitted_data.Fitted_Count + 1, fitted_data.RealWeight[sensor->Num],fitted_data.Real_Variation[sensor->Num], &sensor->K.f, &sensor->intercept.f);
  715. }
  716. #endif