汽車嵌入式開發(fā),很多時候,想學一些東西(eg:CANFD),但又不知道如何下手,這應該是大多數(shù)剛入行工程師的苦惱。目前項目上,CANFD的使用已經(jīng)很普遍,而單純閱讀芯片手冊,可能無法透徹的理解CANFD,如果想透徹的理解CANFD,結合目標板去實踐是不二選擇。
官網(wǎng)的MCMCAN_FD_1_KIT_TC375_LK工程用的回環(huán)模式,并不能真實發(fā)送/接收報文,本文基于官網(wǎng)工程做了二次開發(fā),希望此Demo可以助力大家高效學習CANFD。
本文環(huán)境:TC375開發(fā)板+Tasking編譯器。
1、TC375 CANFD實現(xiàn)注意事項
本文對實現(xiàn)過程中的幾處細節(jié),展開討論。 (一)Transceiver的使能 按照手冊描述,Transceiver型號為TLE9251V,Transceiver的使能需要拉低P20.6,使其進入Normal工作模式。

對應的代碼實現(xiàn)如下:
void GPIO_init(void)
{
IfxPort_setPinMode(&MODULE_P20, 6, IfxPort_Mode_outputPushPullGeneral);
IfxPort_setPinLow(&MODULE_P20, 6);
}
(二)CAN_H、CAN_L Pin配置
代碼實現(xiàn)如下:
IFX_CONST IfxCan_Can_Pins Can0PortInfo = {
.txPin = &IfxCan_TXD00_P20_8_OUT,
.txPinMode = IfxPort_OutputMode_pushPull,
.rxPin = &IfxCan_RXD00B_P20_7_IN,
.rxPinMode = IfxPort_InputMode_pullUp,
.padDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1
};
(三)波特率設置
配置代碼如下:
.baudRate = {
.baudrate = 500000,
.samplePoint = 8000,
.syncJumpWidth = 2000,
.prescaler = 0,
.timeSegment1 = 3,
.timeSegment2 = 10
},
.fastBaudRate = {
.baudrate = 2000000,
.samplePoint = 8000,
.syncJumpWidth = 2000,
.prescaler = 1,
.timeSegment1 = 3,
.timeSegment2 = 10,
.tranceiverDelayOffset = 0
},
如上,設置Normal段速率為500Kbps,Data段速率為2000Kbps,采樣點均設置80%。
(四)接收過濾配置
配置代碼實現(xiàn)如下所示:
.filterConfig = {
.messageIdLength = IfxCan_MessageIdLength_standard,
.standardListSize = 0,
.extendedListSize = 0,
.rejectRemoteFramesWithStandardId = 0,
.rejectRemoteFramesWithExtendedId = 0,
.standardFilterForNonMatchingFrames = IfxCan_NonMatchingFrame_acceptToRxFifo0,
.extendedFilterForNonMatchingFrames = IfxCan_NonMatchingFrame_acceptToRxFifo0
},
g_mcmcan.canFilter.number = 2;
g_mcmcan.canFilter.elementConfiguration = IfxCan_FilterElementConfiguration_storeInRxFifo0;
g_mcmcan.canFilter.type = IfxCan_FilterType_range;
g_mcmcan.canFilter.id1 = 0x166;
g_mcmcan.canFilter.id2 = 0x168;
g_mcmcan.canFilter.rxBufferOffset = IfxCan_RxBufferId_0;
(五)接收報文過濾實現(xiàn) 本文可以接收報文的范圍為:0x166~0x168。 代碼實現(xiàn):
void IfxCan_Can_setStandardFilter(IfxCan_Can_Node *node, IfxCan_Filter *filter)
{
/* enable configuration change CCCR.CCE = 1, CCCR.INIT = 1 */
IfxCan_Node_enableConfigurationChange(node->node);
Ifx_CAN_STDMSG *standardFilterElement = ((uint32*)(node->messageRAM.baseAddress + node->messageRAM.standardFilterListStartAddress));
standardFilterElement->S0.B.SFID2 = filter->id2;
/* First ID of standard ID filter element. */
standardFilterElement->S0.B.SFID1 = filter->id1;
/* 001B Store in Rx FIFO 0 if filter matches */
standardFilterElement->S0.B.SFEC = 0x01;
/* 00B Range filter from SF1ID to SF2ID (SF2ID ≥ SF1ID) */
standardFilterElement->S0.B.SFT = 0x00;
/* Defines how received messages with 11-bit IDs that do not match any
* element of the filter list are treated. (0x03)11B Reject */
node->node->GFC.B.ANFS = 0x03;
/* disable configuration change CCCR.CCE = 0, CCCR.INIT = 0 */
IfxCan_Node_disableConfigurationChange(node->node);
}
CAN報文的接收過濾主要設置兩部分:
1、Global Filter Configuration
主要配置GFC寄存器,本文對Standard幀進行過濾處理,如果與設置的接收范圍不匹配,則Rejet,設置GFC寄存器的ANFS位域,如下所示:

2、Standard Message ID Filter處理 標準CAN報文的ID過濾處理,即:設置每個郵箱過濾報文的范圍或者指定一幀或者兩幀CANID,如下所示:

注意:Standard Message 0并不是一個具體的寄存器,而是CAN模塊專用的RAM區(qū),由實現(xiàn)者根據(jù)需要配置所使用的SRAM大小和起始地址。
而CAN模塊SRAM區(qū)的切割要按照手冊要求劃分,如下所示:

如上的過濾設置好以后,CAN Controller即按如下流程進行標準CAN FD報文的接收。

如上圖,當接收設置了過濾以后,會對接收到的報文進行匹配,如果匹配則接收。當然,也可以不配置接收過濾,任意一幀報文均接收,但是,這樣會增加CPU的開銷。
2、CANFD對應的CAN_H、CAN_L波形
在500Kbps/2000Kbps通信速率下,一幀64Byte數(shù)據(jù)長度的CANFD報文(CANID 0x55),數(shù)據(jù)內(nèi)容0x55或者0xAA,大概需要320us,如下所示:

利用示波器的Decode功能,對CAN報文進行解碼,示例如下:

對應發(fā)送的報文如下所示,CAN ID = 0x55,可以對應如上的解析。

提示:本文使用的示波器不能解析CANFD,只能解析CAN,如上圖,僅僅對Normal段的解析有效。 (一)一幀CAN報文的傳輸用時
如下圖,一幀報文傳輸用時是一個范圍,統(tǒng)計如下所示:

注釋:上圖來源群內(nèi)小伙伴的分享,具體出處不詳,此處分享做學習使用。 解釋:為了確保數(shù)據(jù)傳輸?shù)目煽?,CAN在傳輸數(shù)據(jù)時,每5個相同位會插入一個反向位,也就是位填充(bit stuffing),eg:000001B,這里的1就是因為傳輸?shù)?超過5個時,插入的反向位。所以,由于一幀CAN報文傳輸數(shù)據(jù)的變化,所以,一幀CAN報文傳輸用時會在一個范圍內(nèi)動態(tài)變化,如果CAN ID是0x555(10101010101B)或者0xAA(00010101010B),同時,數(shù)據(jù)段數(shù)據(jù)都是0x55或者0xAA,則這幀報文幾乎不用額外插入反向位,因此用時更短。如果傳輸?shù)臄?shù)據(jù)是0x00(00000000B)或者0xFF(11111111B),則需要插入大量的反向位,因此,傳輸用時更長。
-
嵌入式
+關注
關注
5192文章
20274瀏覽量
331709 -
CAN
+關注
關注
59文章
3043瀏覽量
472093 -
編譯器
+關注
關注
1文章
1672瀏覽量
51234 -
TriCore
+關注
關注
0文章
15瀏覽量
12080 -
CANFD
+關注
關注
0文章
105瀏覽量
5862
原文標題:基于Tricore的CANFD入門工程
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
開發(fā)者分享:輕松搞起CANFD
玩轉(zhuǎn)先楫CANFD外設系列之一:輕松搞起CANFD
基于Tricore的CANFD入門工程
評論