|
@@ -157,6 +157,7 @@ ListItem_t canStbTxListItem[CAN_NUM][CAN_STB_TX_BUF_NUM];
|
|
|
|
|
|
|
|
static CanPort_t *pxCanPort[CAN_NUM] = {NULL};
|
|
static CanPort_t *pxCanPort[CAN_NUM] = {NULL};
|
|
|
static CAN_InitTypeDef CanInitValue[CAN_NUM];
|
|
static CAN_InitTypeDef CanInitValue[CAN_NUM];
|
|
|
|
|
+static int brs_state[CAN_NUM];
|
|
|
static CAN_FilterInitTypeDef CanFilterInitValue[CAN_NUM][CAN_FILTER_MAX];
|
|
static CAN_FilterInitTypeDef CanFilterInitValue[CAN_NUM][CAN_FILTER_MAX];
|
|
|
static u8 nCanFilterEnable[CAN_NUM][CAN_FILTER_MAX];
|
|
static u8 nCanFilterEnable[CAN_NUM][CAN_FILTER_MAX];
|
|
|
|
|
|
|
@@ -1082,12 +1083,18 @@ void vCanInit(CanPort_t *cap, CanTimInit_t *TimInit, CanMode_t mode)
|
|
|
|
|
|
|
|
CAN_InitStructure.BitTiming = canfd_baud_param_tab[TimInit->Bps];
|
|
CAN_InitStructure.BitTiming = canfd_baud_param_tab[TimInit->Bps];
|
|
|
CAN_InitStructure.DataBitTiming = canfd_baud_param_tab[TimInit->DatBps];
|
|
CAN_InitStructure.DataBitTiming = canfd_baud_param_tab[TimInit->DatBps];
|
|
|
- CAN_InitStructure.tdc_en = TimInit->tdc_en;
|
|
|
|
|
|
|
+ CAN_InitStructure.tdc_en = 0; // 开启TDC,在总线负载较高时,发送可能偶尔出现错误帧。TDC不影响帧的接收。
|
|
|
CAN_InitStructure.sspoff = TimInit->sspoff;
|
|
CAN_InitStructure.sspoff = TimInit->sspoff;
|
|
|
CAN_InitStructure.FD_En = 1;
|
|
CAN_InitStructure.FD_En = 1;
|
|
|
CAN_InitStructure.Mode = mode;
|
|
CAN_InitStructure.Mode = mode;
|
|
|
|
|
|
|
|
CanInitValue[cap->id] = CAN_InitStructure;
|
|
CanInitValue[cap->id] = CAN_InitStructure;
|
|
|
|
|
+ // 由于关闭了TDC,速度超过1M时,开启BRS可能不稳定
|
|
|
|
|
+ if (TimInit->DatBps < CANFD1MBaud) {
|
|
|
|
|
+ brs_state[cap->id] = 0;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ brs_state[cap->id] = 1;
|
|
|
|
|
+ }
|
|
|
if (cap->id == CAN_ID0){
|
|
if (cap->id == CAN_ID0){
|
|
|
MCU_SYSCTRL->V6_RST_CTL &= ~(1 << 0);
|
|
MCU_SYSCTRL->V6_RST_CTL &= ~(1 << 0);
|
|
|
TIMER_Udelay(10);
|
|
TIMER_Udelay(10);
|
|
@@ -1229,6 +1236,9 @@ int iCanWrite(CanPort_t *cap, CanMsg* messages, int nmsgs, TickType_t xBlockTime
|
|
|
portENTER_CRITICAL();
|
|
portENTER_CRITICAL();
|
|
|
if(!listLIST_IS_EMPTY(txFreeList)) {
|
|
if(!listLIST_IS_EMPTY(txFreeList)) {
|
|
|
ListItem_t *item = listGET_HEAD_ENTRY(txFreeList);
|
|
ListItem_t *item = listGET_HEAD_ENTRY(txFreeList);
|
|
|
|
|
+ if (brs_state[cap->id] == 0) {
|
|
|
|
|
+ msgs->BRS = 0;
|
|
|
|
|
+ }
|
|
|
memcpy((void*)listGET_LIST_ITEM_VALUE(item), msgs, sizeof(CanMsg));
|
|
memcpy((void*)listGET_LIST_ITEM_VALUE(item), msgs, sizeof(CanMsg));
|
|
|
uxListRemove(item);
|
|
uxListRemove(item);
|
|
|
vListInsertEnd(txSendList, item);
|
|
vListInsertEnd(txSendList, item);
|