2025-06-25 08:43:24 +08:00

162 lines
3.9 KiB
C

/*******************************************************************************
* the includes
******************************************************************************/
#include "CanDrv.h"
#include <stdio.h>
#include "Uart2CanDiagApp.h"
#include <string.h>
#include "CherryRB/chry_ringbuffer.h"
/*******************************************************************************
* the defines
******************************************************************************/
#define TEST_ID 0x222
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
extern CAN_HandleTypeDef hcan1;
static CAN_TxHeaderTypeDef txhead;
static uint32_t TxMailbox = CAN_TX_MAILBOX0;
static uint16_t respID = 0,phyID = 0;
static chry_ringbuffer_t rb;
static uint8_t mempool[64];
static uint8_t FlagRbErr,FlagGetFC;
/*******************************************************************************
* the const
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
uint8_t CanDrv_Init(void)
{
txhead.StdId = TEST_ID;
txhead.IDE = CAN_ID_STD;
txhead.RTR = CAN_RTR_DATA;
txhead.TransmitGlobalTime = DISABLE;
txhead.DLC = 8;
HAL_CAN_Start(&hcan1);
CanDrv_SetFilter(0x777,0);//for test
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
if(0 != chry_ringbuffer_init(&rb, mempool, 64))
{
printf("err:can rb init\n");
}
return 0;
}
uint8_t CanDrv_Txmsg(uint16_t id,uint8_t * data)
{
txhead.StdId = id;
HAL_StatusTypeDef ret = HAL_CAN_AddTxMessage(&hcan1,&txhead,data,&TxMailbox);
//printf("ret=%d",ret);
return ret;
}
uint8_t txtestdata[8] = {1,2,3,4,5,6,7,8};
void CanDrv_Test()
{
CanDrv_Txmsg(TEST_ID,txtestdata);
}
uint8_t CanDrv_GetCANTxEmpty(void)
{
uint32_t ret = HAL_CAN_IsTxMessagePending(&hcan1,CAN_TX_MAILBOX0|CAN_TX_MAILBOX1|CAN_TX_MAILBOX2);
if (ret == 0)
{ //空闲
return 1;
}
return 0;
}
//中断函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
CAN_RxHeaderTypeDef rxmsg;
uint8_t data[8];
HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&rxmsg,data);
if (rxmsg.StdId >= 0x600)
{
//printf("get id:0x%03x",rxmsg.StdId);
if (respID == rxmsg.StdId)
{
uint32_t len = chry_ringbuffer_write(&rb, data, 8);
if (len != 8)
{
FlagRbErr = 1;
printf("err:ring buf write\n");
}
}
}
}
uint8_t CanDrv_SetFilter(uint16_t id,uint8_t bank)
{
CAN_FilterTypeDef filter;
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterIdHigh = id << 5; // 注意:标准 ID 要左移 5 位
filter.FilterMaskIdHigh = 0x7FF << 5;
filter.FilterFIFOAssignment = CAN_RX_FIFO0;
filter.FilterBank = bank;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterActivation = CAN_FILTER_ENABLE;
HAL_CAN_ConfigFilter(&hcan1,&filter);
return 0;
}
void CanDrv_SetDiagID(uint16_t pid,uint16_t rid)
{
CanDrv_SetFilter(rid,1);
respID = rid;
phyID = pid;
}
uint8_t CanDrv_isGetFC(void)
{
uint8_t ret = 0;
ret = FlagGetFC;
FlagGetFC = 0;
return ret;
}
void CanDrv_MsgRecvTask(void)
{
uint8_t data[8];
uint32_t len = chry_ringbuffer_read(&rb, data, 8);
if (len)
{
if (len == 8)
{
//缓冲区中有数据
U2CD_PackDiagMsg(data);
}
else
{
FlagRbErr = 1;
}
}
}