| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- #include "can_link.h"
- #include <string.h>
- #include "soft_can.h"
- #include "rkfifo.h"
- //fdcan1 外设消息
- void HAL_FDCAN_RxFifo0Callback( FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifoITs )
- {
- //测试受干扰时can数据长度会出错,导致HAL_FDCAN_GetRxMessage接收超过8个字节
- uint8_t canRxData[64] = {0};
- FDCAN_RxHeaderTypeDef RxHeader = {0};
- //FIFO收到新数据
- if ( ( RxFifoITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE ) != RESET )
- {
- //清空rxfifo,每次只保留最新一个。
- do
- {
- /* Retreive Rx messages from RX FIFO0 */
- HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO0, &RxHeader, canRxData );
- }
- while ( HAL_FDCAN_GetRxFifoFillLevel( hfdcan, FDCAN_RX_FIFO0 ) >= 1 );
- short len = CanGetHalDataLengthToDec( RxHeader.DataLength );
- if ( RxHeader.IdType == FDCAN_EXTENDED_ID )
- {
- if (len >8)
- return;
- switch(RxHeader.Identifier)
- {
- //其余消息直接转发
- default:
- Can_Txmsg_Target_Init(RxHeader.Identifier, canRxData);
- can_send(&hfdcan2);
- break;
-
- }
-
- }
- }
-
- //CAN数据丢失中断
- if ( ( RxFifoITs & FDCAN_IT_RX_FIFO0_MESSAGE_LOST ) != RESET )
- {
- /* Retreive Rx messages from RX FIFO0 */
- HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO0, &RxHeader, canRxData );
- }
- }
- //fdcan2 PMU消息
- void HAL_FDCAN_RxFifo1Callback( FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifoITs )
- {
- //测试受干扰时can数据长度会出错,导致HAL_FDCAN_GetRxMessage接收超过8个字节
- uint8_t canRxData[64] = {0};
- FDCAN_RxHeaderTypeDef RxHeader = {0};
- //FIFO收到新数据
- if ( ( RxFifoITs & FDCAN_IT_RX_FIFO1_NEW_MESSAGE ) != RESET )
- {
- //上电初始化时有可能外设CAN有数据,fifo设置的可保存32组数据,导致RXFIFO累积,程序正常后读取数据一直读取之前的。
- //清空rxfifo,每次只保留最新一个。
- do
- {
- /* Retreive Rx messages from RX FIFO0 */
- HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO1, &RxHeader, canRxData );
- }
- while ( HAL_FDCAN_GetRxFifoFillLevel( hfdcan, FDCAN_RX_FIFO1 ) >= 1 );
-
- short len = CanGetHalDataLengthToDec( RxHeader.DataLength );
- //扩展帧
- if ( RxHeader.IdType == FDCAN_EXTENDED_ID )
- {
- if (len >8)
- return;
- switch(RxHeader.Identifier)
- {
- case WEIGHT_MSG_ID:
- {
- Can_Rx can_rx;
- memcpy(&can_rx.Rxheader , &RxHeader,sizeof(RxHeader));
- memcpy(&can_rx.Rxdata, canRxData, 8);
- rkfifo_in(&can_rx_kfifo, &can_rx, 1);
- }
- break;
- case PUMP_MSG_ID:
- {
- short pwm;
- memcpy(&pwm, canRxData, 2);
- PUMP1_PWM_CONTROL(pwm);
-
- memcpy(&pwm, &canRxData[2], 2);
- PUMP2_PWM_CONTROL(pwm);
- }
- break;
- case SPRAY_MSG_ID:
- {
- short pwm;
- memcpy(&pwm, canRxData, 2);
- SPRAY1_PWM_CONTROL(pwm);
-
- memcpy(&pwm, &canRxData[2], 2);
- SPRAY2_PWM_CONTROL(pwm);
- }
- break;
- //其余消息直接转发
- default:
- Can_Txmsg_Target_Init(RxHeader.Identifier, canRxData);
- can_send(&hfdcan1);
- break;
-
-
- }
- }
- }
-
- //CAN数据丢失中断
- if ( ( RxFifoITs & FDCAN_IT_RX_FIFO1_MESSAGE_LOST ) != RESET )
- {
- /* Retreive Rx messages from RX FIFO0 */
- HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO1, &RxHeader, canRxData );
- }
- }
- uint32_t CanGetHalDataLengthToDec( uint32_t DataLength )
- {
- uint32_t dataLen = 0;
- if ( DataLength <= FDCAN_DLC_BYTES_8 )
- {
- dataLen = DataLength;
- }
- else if ( DataLength == FDCAN_DLC_BYTES_12 )
- {
- dataLen = 12;
- }
- else if ( DataLength == FDCAN_DLC_BYTES_16 )
- {
- dataLen = 16;
- }
- else if ( DataLength == FDCAN_DLC_BYTES_20 )
- {
- dataLen = 20;
- }
- else if ( DataLength == FDCAN_DLC_BYTES_24 )
- {
- dataLen = 24;
- }
- else if ( DataLength == FDCAN_DLC_BYTES_32 )
- {
- dataLen = 32;
- }
- else if ( DataLength == FDCAN_DLC_BYTES_48 )
- {
- dataLen = 48;
- }
- else if ( DataLength == FDCAN_DLC_BYTES_64 )
- {
- dataLen = 64;
- }
- return dataLen;
- }
- uint32_t CanSetDecToHalDataLength( uint32_t dataLen )
- {
- uint32_t DataLength = FDCAN_DLC_BYTES_0;
- if ( dataLen <= 8 )
- {
- DataLength = dataLen;
- }
- else if ( dataLen == 12 )
- {
- DataLength = FDCAN_DLC_BYTES_12;
- }
- else if ( dataLen == 16 )
- {
- DataLength = FDCAN_DLC_BYTES_16;
- }
- else if ( dataLen == 20 )
- {
- DataLength = FDCAN_DLC_BYTES_20;
- }
- else if ( dataLen == 24 )
- {
- DataLength = FDCAN_DLC_BYTES_24;
- }
- else if ( dataLen == 32 )
- {
- DataLength = FDCAN_DLC_BYTES_32;
- }
- else if ( dataLen == 48 )
- {
- DataLength = FDCAN_DLC_BYTES_48;
- }
- else if ( dataLen == 64 )
- {
- DataLength = FDCAN_DLC_BYTES_64;
- }
- return DataLength;
- }
- void can_recv_HD_ESC_msg(uint8_t *recv_buf, uint32_t len, uint32_t id)
- {
- uint8_t TypeID = 0;
- //uint8_t SerOrMsg = (id & HD_CANID_SNM_MASK) >> HD_CANID_SNM_POS; // 广播帧OR服务帧
- //uint8_t SrcNodeID = (id & HD_CANID_SRCNODE_MASK) >> HD_CANID_SRCNODE_POS;
- uint8_t buff[8];
- memcpy(buff,recv_buf,8);
- uint8_t finish_cnt = 0;
-
- }
|