Przeglądaj źródła

MCU工程更新canfd驱动,优化canfd开启TDC时,在总线负载较高的情况下偶发发送数据帧错误的问题。

helen 2 tygodni temu
rodzic
commit
13dac44606

+ 11 - 1
amt630hv160-mcu/amt630hv160-mcu-iram/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_canfd.c

@@ -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);

+ 11 - 1
amt630hv160-mcu/amt630hv160-mcu-sram-nos/src/ArkmicroFiles/libcpu-amt630hv160/source/amt630hv160_canfd.c

@@ -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];
 
 
@@ -955,12 +956,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);
@@ -1059,6 +1066,9 @@ int iCanWrite(CanPort_t *cap, CanMsg* messages, int nmsgs, TickType_t xBlockTime
 	int count = 0;
 	int count = 0;
 
 
 	while (nmsgs--) {
 	while (nmsgs--) {
+		if (brs_state[cap->id] == 0) {
+			msgs->BRS = 0;
+		}
 		if (msgs->TxMode == XMIT_PTB_MODE) {
 		if (msgs->TxMode == XMIT_PTB_MODE) {
 			cap->tx_done = 0;
 			cap->tx_done = 0;
 			CAN_PTB_Tran(cap->pcan, msgs);
 			CAN_PTB_Tran(cap->pcan, msgs);