soft_can.c 23 KB

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