1 .波特率計算方法:
BaudRate=APB1CLK/分頻係數/(1+BS1+BS2).
此處:36M/12/(1+3+2)=500k.
2. MCU Specific Package 單片機的具體方案,常見的MSP是指和MCU相關的初始化。
3.CAN標準標識符 0到0x7FF,擴展標識符0到0x3FFFF.CAN 控制器根據兩根線上的電位差來判斷總線電平。總線電平分爲顯性電平和隱性電平,顯性爲0,隱性爲1,總線是:與的關係,所以顯性具有優先性,顯性強於隱性。發送方通過使總線電平發生變化,將消息發送給接收方。
4.FIFO存儲器,一種先進先出的雙口數據緩存器,其中一個輸入口,另一個口是輸出口。First In First Out,相比於普通存儲器優點是沒有外部讀寫地址線,使用簡單;缺點是隻能順序寫入,順序讀出。其數據地址由內部讀寫指針自動加1完成,並非普通存儲器那樣由地址線決定讀取或寫入某個指定的地址。
5.CAN總線的協議、幀的結構、相關的時序即差分信號的仲裁//CAN mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,迴環模式;
6.CAN特點:
6.1) 多主控制。在總線空閒時,所有單元都可以發送消息(多主控制),而兩個以上的單元同時開始發送消息時,根據標識符(Identifier 以下稱爲 ID)決定優先級。ID 並不是表示發送的目的地址,而是表示訪問總線的消息的優先級。兩個以上的單元同時開始發送消息時,對各消息 ID 的每個位進行逐個仲裁比較。仲裁獲勝(被判定爲優先級最高)的單元可繼續發送消息,仲裁失利的單元則立刻停止發送而進行接收工作。
6.2) 系統的柔軟性。與總線相連的單元沒有類似於“地址”的信息。因此在總線上增加單元時,連接在總線上的其它單元的軟硬件及應用層都不需要改變。
6.3) 通信速度較快,通信距離遠。最高 1Mbps(距離小於 40M),最遠可達 10KM(速率低於 5Kbps)。
6.4) 具有錯誤檢測、錯誤通知和錯誤恢復功能。所有單元都可以檢測錯誤(錯誤檢測功能),檢測出錯誤的單元會立即同時通知其他所有單元(錯誤通知功能),正在發送消息的單元一旦檢測出錯誤,會強制結束當前的發送。強制結束髮送的單元會不斷反覆地重新發送此消息直到成功發送爲止(錯誤恢復功能)。
6.5) 故障封閉功能。CAN 可以判斷出錯誤的類型是總線上暫時的數據錯誤(如外部噪聲等)還是持續的數據錯誤(如單元內部故障、驅動器故障、斷線等)。由此功能,當總線上發生持續數據錯誤時,可將引起此故障的單元從總線上隔離出去。
6.6) 連接節點多。CAN 總線是可同時連接多個單元的總線。可連接的單元總數理論上是沒有限制的。但實際上可連接的單元數受總線上的時間延遲及電氣負載的限制。降低通信速度,可連接的單元數增加;提高通信速度,則可連接的單元數減少。正是因爲 CAN 協議的這些特點,使得 CAN 特別適合工業過程監控設備的互連,因此,越來越受到工業界的重視,並已公認爲最有前途的現場總線之一。
6.7)CAN 協議經過 ISO 標準化後有兩個標準:ISO11898 標準和 ISO11519-2 標準。其中 ISO11898是針對通信速率爲 125Kbps~1Mbps 的高速通信標準,而 ISO11519-2 是針對通信速率爲 125Kbps
7.CAN常見的數據幀
7.1數據幀、遙控幀、錯誤幀、過載幀、幀間隔,數據幀和遙控幀有標準格式和擴展格式兩種格式。標準格式有 11 個位的標識符(ID),擴展格式有 29 個位的 ID。
| 幀類型| 幀用途|
| 數據幀 | 用於發送單元向接收單元傳送數據的幀|
| 遙控幀 | 用於接收單元向具有相同 ID 的發送單元請求數據的幀|
| 錯誤幀 | 用於當檢測出錯誤時向其它單元通知錯誤的幀|
| 過載幀 | 用於接收單元通知其尚未做好接收準備的幀|
| 間隔幀 | 用於將數據幀及遙控幀與前面的幀分離開來的幀|
7.2主要介紹數據幀:
(1) 幀起始。表示數據幀開始的段。
(2) 仲裁段。表示該幀優先級的段。
(3) 控制段。表示數據的字節數及保留位的段。
(4) 數據段。數據的內容,一幀可發送 0~8 個字節的數據。
(5) CRC 段。檢查幀的傳輸錯誤的段。
(6) ACK 段。表示確認正常接收的段。
(7) 幀結束。表示數據幀結束的段。
圖中 D 表示顯性電平,R 表示隱形電平(下同)。
7.3幀起始,這個比較簡單,標準幀和擴展幀都是由 1 個位的顯性電平表示幀起始。仲裁段,表示數據優先級的段,標準幀和擴展幀格式在本段有所區別
標準格式的 ID 有 11 個位。從 ID28 到 ID18 被依次發送。禁止高 7 位都爲隱性(禁止設定:ID=1111111XXXX)。擴展格式的 ID 有 29 個位。基本 ID 從 ID28 到 ID18,擴展 ID 由ID17 到 ID0 表示。基本 ID 和標準格式的 ID 相同。禁止高 7 位都爲隱性(禁止設定:基本ID=1111111XXXX)。其中 RTR 位用於標識是否是遠程幀(0,數據幀;1,遠程幀),IDE 位爲標識符選擇位(0,使用標準標識符;1,使用擴展標識符),SRR 位爲代替遠程請求位,爲隱性位,它代替了標準幀中的 RTR 位。
7.4控制段,由 6 個位構成,表示數據段的字節數。標準幀和擴展幀的控制段稍有不同
上圖中,r0 和 r1 爲保留位,必須全部以顯性電平發送,但是接收端可以接收顯性、隱性及任意組合的電平。DLC 段爲數據長度表示段,高位在前,DLC 段有效值爲 0~8,但是接收方接收到 9~15 的時候並不認爲是錯誤。數據段,該段可包含 0~8 個字節的數據。從最高位(MSB)開始輸出,標準幀和擴展幀在這個段的定義都是一樣的。
CRC 段,該段用於檢查幀傳輸錯誤。由 15 個位的 CRC 順序和 1 個位的 CRC 界定符(用於分隔的位)組成,標準幀和擴展幀在這個段的格式也是相同的。
此段 CRC 的值計算範圍包括:幀起始、仲裁段、控制段、數據段。接收方以同樣的算法計算 CRC 值並進行比較,不一致時會通報錯誤。ACK 段,此段用來確認是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 個位組成。標準幀和擴展幀在這個段的格式也是相同的。
發送單元的 ACK,發送 2 個位的隱性位,而接收到正確消息的單元在 ACK 槽(ACK Slot)發送顯性位,通知發送單元正常接收結束,這個過程叫發送 ACK/返回 ACK。發送 ACK 的是在既不處於總線關閉態也不處於休眠態的所有接收單元中,接收到正常消息的單元(發送單元不發送 ACK)。所謂正常消息是指不含填充錯誤、格式錯誤、CRC 錯誤的消息。
幀結束,這個段也比較簡單,標準幀和擴展幀在這個段格式一樣,由 7 個位的隱性位組成。
8.由發送單元在非同步的情況下發送的每秒鐘的位數稱爲位速率。一個位可分爲 4 段。
同步段(SS)
傳播時間段(PTS)
相位緩衝段 1(PBS1)
相位緩衝段 2(PBS2)
這些段又由可稱爲 Time Quantum(以下稱爲 Tq)的最小時間單位構成。1 位分爲 4 個段,每個段又由若干個 Tq 構成,這稱爲位時序。1 位由多少個 Tq 構成、每個段又由多少個 Tq 構成等,可以任意設定位時序。通過設定位時序,多個單元可同時採樣,也可任意設定採樣點。
9 STM32 自帶的是 bxCAN,即基本擴展 CAN。它支持 CAN 協議 2.0A 和 2.0B。它的設計目標是,以最小的 CPU 負荷來高效處理大量收到的報文。它也支持報文發送的優先級要求(優先級特性可軟件配置)。
STM32 的 bxCAN 的主要特點有:
支持 CAN 協議 2.0A 和 2.0B 主動模式
波特率最高達 1Mbps
支持時間觸發通信
具有 3 個發送郵箱
具有 3 級深度的 2 個接收 FIFO
可變的過濾器組(最多 28 個)
10CAN 發送流程爲:程序選擇 1 個空置的郵箱(TME=1)設置標識符(ID),數據長度和發送數據設置 CAN_TIxR 的 TXRQ 位爲 1,請求發送郵箱掛號(等待成爲最高優先級)預定發送(等待總線空閒)發送郵箱空置。
11.CAN 接收流程爲:FIFO 空收到有效報文掛號_1(存入 FIFO 的一個郵箱,這個由硬件控制,我們不需要理會)收到有效報文掛號_2收到有效報文掛號_3收到有效報文溢出。
void MX_CAN_Init(void)
{
hcan.Instance = CAN1;//CAN1
/****************************
BaudRate=APB1CLK/分頻係數/(1+BS1+BS2).
此處:36M/12/(1+3+2)=500k.
*****************************/
hcan.Init.Prescaler = 12;//預分頻器,指定時間長度在1~1024之間
hcan.Init.Mode = CAN_MODE_NORMAL;//正常模式
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;//重新同步跳躍寬度爲個時間單位
hcan.Init.TimeSeg1 = CAN_BS1_3TQ;//時間段 1 佔用 3 個時間單位
hcan.Init.TimeSeg2 = CAN_BS2_2TQ;//時間段 2 佔用 2 個時間單位
hcan.Init.TimeTriggeredMode = DISABLE;//禁用時間觸發通信模式
hcan.Init.AutoBusOff = DISABLE;//禁用總線自動關閉
hcan.Init.AutoWakeUp = DISABLE;//禁用自動喚醒
hcan.Init.AutoRetransmission = DISABLE;//禁用自動重傳
hcan.Init.ReceiveFifoLocked = DISABLE;//禁用接收自動鎖定
hcan.Init.TransmitFifoPriority = DISABLE;//禁用傳輸FIFO優先級
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}
}
void CAN1_Config(void)
{
CAN_FilterTypeDef CAN_FilterType;
CAN_FilterType.FilterBank=0;//設置過濾器0
CAN_FilterType.FilterIdHigh = 0x0000;//32位ID高位,CAN_FilterIdHigh和CAN_FilterIdLow組合成一個32位寄存器,用來存儲將要過濾的ID
CAN_FilterType.FilterIdLow = 0x0000;//32位ID 地位
CAN_FilterType.FilterMaskIdHigh= 0x0000;//32位MASK高位,CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow組合成一個32位寄存器,用來表示這個ID的哪些位
CAN_FilterType.FilterMaskIdLow = 0x0000;//32位MASK低位
CAN_FilterType.FilterFIFOAssignment = CAN_RX_FIFO0;//FIFO0
CAN_FilterType.FilterMode=CAN_FILTERMODE_IDMASK;///標識符屏蔽模式
CAN_FilterType.FilterActivation = ENABLE;//激活過濾器0
CAN_FilterType.FilterScale = CAN_FILTERSCALE_32BIT;//32位過濾器
CAN_FilterType.SlaveStartFilterBank =14;//單CAN設置無用
if(HAL_CAN_ConfigFilter(&hcan,&CAN_FilterType)!=HAL_OK)
{
Error_Handler();
}
if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING)!=HAL_OK)
{
Error_Handler();
}
if(HAL_CAN_Start(&hcan)!=HAL_OK)
{
Error_Handler();
}
}