一、CAN通信簡介
1.1 CAN簡介
CAN全稱是Controller Area Network,控制器局域網(wǎng)絡(luò),是ISO國際標(biāo)準(zhǔn)化的串行通信協(xié)議。CAN是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。
CAN通信只有兩根信號(hào)線,分別是CAN_H和CAN_L,CAN 控制器根據(jù)這兩根線上的電位差來判斷總線電平??偩€申平分為顯性電平和隱性申平,二者必居其一。發(fā)送方通過使總線電平發(fā)生變化,將消息發(fā)送給接收方。
- ? 2.0V---------邏輯0------顯性電平
- ? 0 V-----------邏輯1------隱性電平
CAN總線遵從“線與”機(jī)制, 顯性電平可以覆蓋隱性電平 。這就導(dǎo)致 只有所有節(jié)點(diǎn)都發(fā)送隱形電平時(shí)總線才處于隱性狀態(tài) 。
CAN通信示意圖
1.2 CAN協(xié)議特點(diǎn)
- ? 多主控 在總線空閑時(shí)所有單元都可以發(fā)送消息。當(dāng)兩個(gè)以上單元發(fā)送消息時(shí),會(huì)根據(jù)標(biāo)識(shí)符(ID)決定發(fā)送的優(yōu)先級(jí)。
- ? 通信速度較快 ,最高可達(dá)1Mbps。 通信距離較遠(yuǎn) 。當(dāng)速度為1Mbps時(shí),傳輸距離小于40m。當(dāng)速度小于500Kbps時(shí),傳輸距離最遠(yuǎn)可達(dá)10Km。
- ? 具有錯(cuò)誤檢測,錯(cuò)誤通知和錯(cuò)誤恢復(fù)功能 。CAN總線上的任意一個(gè)單元都可以檢測錯(cuò)誤,當(dāng)任意一個(gè)單元檢測出錯(cuò)誤時(shí),會(huì)立刻通知其他單元。正在發(fā)送消息的單元一旦檢測出錯(cuò)誤,會(huì)強(qiáng)制結(jié)束當(dāng)前發(fā)送。強(qiáng)制結(jié)束的單元會(huì)不斷重新發(fā)送消息,直到發(fā)送成功。
- ? 故障封閉功能 CAN可以判斷出錯(cuò)誤的類型是總線上暫時(shí)的數(shù)據(jù)錯(cuò)誤還是持續(xù)的數(shù)據(jù)錯(cuò)誤。當(dāng)總線上持續(xù)出現(xiàn)數(shù)據(jù)錯(cuò)誤時(shí),可以將引起故障的單元從總線上隔離出去。
- ? 連接節(jié)點(diǎn)多 理論上連接單元沒有數(shù)量限制,但是連接單元越多,速度就會(huì)越低。
11.3 CAN通信的幀類型
CAN通信有5種幀類型
在上述的幾種幀里,數(shù)據(jù)很和遙控幀有標(biāo)準(zhǔn)幀和擴(kuò)展幀兩種。標(biāo)準(zhǔn)幀有11位ID,擴(kuò)展幀有29位ID。
1.4 數(shù)據(jù)幀結(jié)構(gòu)
CAN通信數(shù)據(jù)幀的構(gòu)成如下
CAN通信數(shù)據(jù)幀結(jié)構(gòu)
- ? 幀起始 表示數(shù)據(jù)幀開始的段,標(biāo)準(zhǔn)幀和擴(kuò)展幀的幀起始都是由1個(gè)位的顯性電平組成。
- ? 仲裁段 表示數(shù)據(jù)幀優(yōu)先級(jí)的段。
仲裁段
RTR是用來表示是否是遠(yuǎn)程幀(遙控幀)。RTR為0是數(shù)據(jù)幀,RTR為1是遠(yuǎn)程幀。擴(kuò)展幀中的IDE是標(biāo)識(shí)符的選擇位,如果為0,使用標(biāo)準(zhǔn)標(biāo)識(shí)符,如果為1,使用擴(kuò)展標(biāo)識(shí)符。擴(kuò)展幀的SRR相當(dāng)于標(biāo)準(zhǔn)幀中的RTR位。 標(biāo)準(zhǔn)幀的ID禁止高七位是隱性電平 。
? 控制段 控制段由6位構(gòu)成,表示數(shù)據(jù)段的字節(jié)數(shù)。
控制段
擴(kuò)展幀的r0和r1是保留位,保留位必須全部以顯性電平發(fā)送。DLC是數(shù)據(jù)的長度碼,數(shù)據(jù)的字節(jié)數(shù)范圍是0~8。IDE是標(biāo)識(shí)符的選擇位,如果為0,使用標(biāo)準(zhǔn)標(biāo)識(shí)符,如果為1,使用擴(kuò)展標(biāo)識(shí)符。? 數(shù)據(jù)段 數(shù)據(jù)段可以包含0~8個(gè)字節(jié)的數(shù)據(jù)。從MSB(最高位)開始傳輸。標(biāo)準(zhǔn)幀和擴(kuò)展幀的數(shù)據(jù)段相同。
? CRC段 CRC段用于校驗(yàn),檢查幀傳輸是否存在錯(cuò)誤。CRC段包含15位CRC序列和1位CRC界定符。標(biāo)準(zhǔn)幀和擴(kuò)展幀的CRC段相同。
CRC段? ACK段 ACK段用來確認(rèn)是否正常接收。由ACK槽和ACK界定符2位組成。標(biāo)準(zhǔn)幀和擴(kuò)展幀的ACK段相同。
ACK段? 幀結(jié)束 由7位隱形電平組成,表示幀的結(jié)束。標(biāo)準(zhǔn)幀和擴(kuò)展幀的幀結(jié)束相同。
11.5 CAN的位時(shí)序
由發(fā)送單元在非同步狀態(tài)下每秒鐘發(fā)送的位數(shù)稱為 位速率 。一個(gè)位可以分成4段。
? 同步段 SS
? 傳播時(shí)間段 PTS
? 相位緩沖段1 PBS1
? 相位緩沖段2 PBS2
上面的這些段由稱為Time Quantum( Tq )的最小時(shí)間單位組成。1個(gè)位分成4個(gè)段,一個(gè)段又分成若干個(gè)Tq,這成為 位時(shí)序 。
位構(gòu)成
采樣點(diǎn)是讀取總線電平,并將讀到的電平作為位值的點(diǎn)。
1.6 CAN的仲裁功能
在總線空閑態(tài),最先開始發(fā)送消息的單元獲得發(fā)送權(quán)。當(dāng)多個(gè)單元同時(shí)開始發(fā)送時(shí),各發(fā)送單元從仲裁段的第一位開始進(jìn)行仲裁。連 續(xù)輸出顯性電平最多的單元可繼續(xù)發(fā)送 。
仲裁過程
二、STM32F1的CAN
2.1 bxCAN簡介
STM32F1芯片自帶bxCAN 控制器 (Basic Extended CAN),即基本擴(kuò)展CAN,可與 CAN 網(wǎng)絡(luò)進(jìn)行交互,它支持 2.0A 和 B 版本的CAN 協(xié)議。STM32F1的bxCAN有以下特點(diǎn)
- ? 支持 CAN 協(xié)議 2.0A 和 20B 主動(dòng)模式
- ? 波特率最高達(dá) 1Mbps
- ? 支持時(shí)間觸發(fā)通信
- ? 具有 3 個(gè)發(fā)送郵箱
- ? 具有 3 級(jí)深度的 2 個(gè)接收 FIFO
- ? 可變的過濾器組(STM32F103ZET6有14個(gè))
bxCAN模塊可以完全自動(dòng)地接收和發(fā)送CAN報(bào)文,且完全支持標(biāo)準(zhǔn)標(biāo)識(shí)符(11位)和擴(kuò)展標(biāo)識(shí)符(29位)。
2.2 bxCAN工作模式
bXCAN有3個(gè)主要的工作模式: 初始化模式 、正常模式和 睡眠模式 。除此之外,還有測試模式,靜默模式,環(huán)回模式。
2.2.1 初始化模式
首先看一下CAN主控制寄存器 (CAN_MCR)的INRQ位。
寄存器介紹CAN_MCR
寄存器CAN_MSR介紹
通過介紹可以直到,想要進(jìn)入初始化模式,軟件先將CAN_MCR的INRQ位置1。然后等待硬件將CAN主狀態(tài)寄存器(CAN_MSR)的INAK位置1。此時(shí)進(jìn)入初始化模式。
當(dāng)bxCAN處于初始化模式時(shí),禁止報(bào)文的接收和發(fā)送,并且CANTX引腳輸出隱性位(高電平)。
2.2.2 正常模式
在初始化完成后,軟件應(yīng)該讓硬件進(jìn)入正常模式,以便正常接收和發(fā)送報(bào)文。繼續(xù)看上面對于CAN主控制寄存器INRQ位的介紹。軟件將INRQ位清0,可以使CAN從初始化模式進(jìn)入正常模式。此時(shí)等待硬件將CAN主狀態(tài)寄存器的INAK位清0即可。
2.2.3 睡眠模式
bxCAN可工作在低功耗的睡眠模式。在該模式下,bxCAN的時(shí)鐘停止了,但軟件仍然可以訪問郵箱寄存器。
寄存器CAN_MSR介紹
可以看出,軟件將CAN主控制寄存器的SLEEP置1,即可請求進(jìn)入睡眠模式。清零該位,退出睡眠模式。另外,如果CAN_MCR寄存器的AWUM位為’1’,一旦檢測到CAN總線的活動(dòng),硬件就自動(dòng)對SLEEP位清’0’來喚醒bxCAN。
2.2.4 靜默模式
將CAN_BTR寄存器的SILM位置’1’,來選擇靜默模式。
寄存器CAN_BTR介紹
在靜默模式下,bxCAN可以正常地接收數(shù)據(jù)幀和遠(yuǎn)程幀,但只能發(fā)出隱性位,而不能真正發(fā)送報(bào)文。如果bxCAN需要發(fā)出顯性位(確認(rèn)位、過載標(biāo)志、主動(dòng)錯(cuò)誤標(biāo)志),那么這樣的顯性位在內(nèi)部被接回來從而可以被CAN內(nèi)核檢測到,同時(shí)CAN總線不會(huì)受到影響而仍然維持在隱性位狀態(tài)。因此,靜默模式通常用于分析CAN總線的活動(dòng),而不會(huì)對總線造成影響-顯性位(確認(rèn)位、錯(cuò)誤幀)不會(huì)真正發(fā)送到總線上。
靜默模式
2.2.5 環(huán)回模式
將CAN_BTR寄存器的LBKM位置’1’,來選擇環(huán)回模式。在環(huán)回模式下,bxCAN把發(fā)送的報(bào)文當(dāng)作接收的報(bào)文并保存(如果可以通過接收過濾)在接收郵箱里。
寄存器CAN_BTR寄存器介紹
環(huán)回模式可用于自測試。為了避免外部的影響,在環(huán)回模式下CAN內(nèi)核忽略確認(rèn)錯(cuò)誤(在數(shù)據(jù)/遠(yuǎn)程幀的確認(rèn)位時(shí)刻,不檢測是否有顯性位)。在環(huán)回模式下,bxCAN在內(nèi)部把Tx輸出回饋到Rx輸入上,而完全忽略CANRX引腳的實(shí)際狀態(tài)。發(fā)送的報(bào)文可以在CANTX引腳上檢測到。
環(huán)回模式
2.3 位時(shí)序和波特率
STM32將每一位分成三段
- ? 同步段 SS
- ? 時(shí)間段1 BS1
- ? 時(shí)間段2 BS2
位時(shí)序
其中tpclk是APB1總線的時(shí)鐘頻率,默認(rèn)為36MHz。
三、CAN配置步驟
- ? 使能CAN時(shí)鐘,將對應(yīng)引腳復(fù)用映射為CAN功能 。STM32F103ZET6只有一個(gè)CAN,對應(yīng)引腳如下
CAN_RX配置為上拉輸入模式,CAN_TX配置為復(fù)用推挽輸出。
- ? 設(shè)置CAN工作模式,波特率等 。庫函數(shù)提供了一個(gè)結(jié)構(gòu)體和一個(gè)函數(shù)來配置。初始化函數(shù)為
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
結(jié)構(gòu)體成員如下
波特率 = Fpclk1 / ((CAN_BS1 + CAN_BS2 + 1)* CAN_Prescaler)
- ? 設(shè)置CAN篩選器(過濾器) 庫函數(shù)也提供了篩選器的配置函數(shù)
void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct)
結(jié)構(gòu)體內(nèi)容如下
- 選擇CAN中斷類型,開啟中斷 庫函數(shù)提供了一個(gè)中斷的配置函數(shù)
void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState)
CAN的中斷類型有很多,這里就不再一一介紹了。
#define IS_CAN_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP0) ||
((IT) == CAN_IT_FF0) || ((IT) == CAN_IT_FOV0) ||
((IT) == CAN_IT_FMP1) || ((IT) == CAN_IT_FF1) ||
((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||
((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||
((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||
((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK))
- ? CAN發(fā)送和接收消息 CAN發(fā)送消息的函數(shù)是
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)
發(fā)送之前需要配置好消息的結(jié)構(gòu)體,消息結(jié)構(gòu)體成員如下
- 選擇CAN中斷類型,開啟中斷 庫函數(shù)提供了一個(gè)中斷的配置函數(shù)
void CAN_ITConfig(CAN_TypeDef* CANx, uint32_t CAN_IT, FunctionalState NewState)
CAN的中斷類型有很多,這里就不再一一介紹了。
#define IS_CAN_IT(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP0) ||
((IT) == CAN_IT_FF0) || ((IT) == CAN_IT_FOV0) ||
((IT) == CAN_IT_FMP1) || ((IT) == CAN_IT_FF1) ||
((IT) == CAN_IT_FOV1) || ((IT) == CAN_IT_EWG) ||
((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF) ||
((IT) == CAN_IT_LEC) || ((IT) == CAN_IT_ERR) ||
((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_SLK))
- ? CAN發(fā)送和接收消息 CAN發(fā)送消息的函數(shù)是
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)
發(fā)送之前需要配置好消息的結(jié)構(gòu)體,消息結(jié)構(gòu)體成員如下
- ? CAN狀態(tài)獲取 庫函數(shù)提供了很多可以獲取CAN狀態(tài)標(biāo)志的函數(shù),比如
uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox)
FlagStatus CAN_GetFlagStatus(CAN_TypeDef* CANx, uint32_t CAN_FLAG);
四、實(shí)戰(zhàn)項(xiàng)目
4.1 CAN初始化
/*
*==============================================================================
*函數(shù)名稱:Drv_Can_Init
*函數(shù)功能:初始化CAN
*輸入?yún)?shù):tsjw:重新同步跳躍寬度(Tsjw);tbs1:BS1長度;tbs2:BS2長度;
brp:Tq大?。籱ode:CAN工作模式
*返回值:無
*備 注:無
*==============================================================================
*/
void Drv_Can_Init (u8 tsjw,u8 tbs1,u8 tbs2,u16 brp,u8 mode)
{
// 結(jié)構(gòu)體定義
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
// 開啟時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // 打開CAN1時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PA端口時(shí)鐘打開
// 初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // PA11 CAN_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉輸入模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // PA12 CAN_TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化CAN
CAN_InitStructure.CAN_TTCM=DISABLE; // 非時(shí)間觸發(fā)通信模式
CAN_InitStructure.CAN_ABOM=DISABLE; // 軟件自動(dòng)離線管理
CAN_InitStructure.CAN_AWUM=DISABLE; // 睡眠模式通過軟件喚醒(清除CAN- >MCR的SLEEP位)
CAN_InitStructure.CAN_NART=ENABLE; // 使用報(bào)文自動(dòng)傳送
CAN_InitStructure.CAN_RFLM=DISABLE; // 報(bào)文不鎖定,新的覆蓋舊的
CAN_InitStructure.CAN_TXFP=DISABLE; // 優(yōu)先級(jí)由報(bào)文標(biāo)識(shí)符決定
CAN_InitStructure.CAN_Mode= mode; //CAN工作模式設(shè)置
CAN_InitStructure.CAN_SJW=tsjw; // 重新同步跳躍寬度(Tsjw)為tsjw+1個(gè)時(shí)間單位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=tbs1; // Tbs1范圍CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=tbs2; // Tbs2范圍CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=brp; //分頻系數(shù)(Fdiv)為brp+1
CAN_Init(CAN1, &CAN_InitStructure); // 初始化CAN1
// 初始化過濾器
CAN_FilterInitStructure.CAN_FilterNumber=0; // 過濾器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; // 掩碼模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; // 32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; // 32位ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; // 32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; // 過濾器0關(guān)聯(lián)到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; // 激活過濾器0
CAN_FilterInit(&CAN_FilterInitStructure); // 過濾器初始化
}
4.2 CAN發(fā)送
/*
*==============================================================================
*函數(shù)名稱:Med_Can_Send_Msg
*函數(shù)功能:發(fā)送報(bào)文
*輸入?yún)?shù):msg:數(shù)據(jù)段指針;len:數(shù)據(jù)長度
*返回值:0:發(fā)送成功;1:發(fā)送失敗
*備 注:固定ID為0x12
*==============================================================================
*/
u8 Med_Can_Send_Msg (u8* msg,u8 len)
{
u8 mbox;
u16 i = 0;
CanTxMsg TxMessage; // 定義發(fā)送報(bào)文結(jié)構(gòu)體
TxMessage.StdId = 0x12; // 標(biāo)準(zhǔn)標(biāo)識(shí)符
TxMessage.ExtId = 0x12; // 擴(kuò)展標(biāo)識(shí)符
TxMessage.IDE = CAN_Id_Standard; // 使用標(biāo)準(zhǔn)標(biāo)識(shí)符
TxMessage.RTR = 0; // 消息類型為數(shù)據(jù)幀,一幀8位
TxMessage.DLC = len;
for(i = 0;i len;i ++)
{
TxMessage.Data[i] = msg[i]; // 填充幀數(shù)據(jù)段
}
mbox = CAN_Transmit(CAN1,&TxMessage); // 發(fā)送報(bào)文
i = 0;
// 等待發(fā)送結(jié)束
while((CAN_TransmitStatus(CAN1,mbox) == CAN_TxStatus_Failed) && (i 0XFFF))
{
i++;
}
// 返回發(fā)送情況
if(i >= 0XFFF)
{
return 1;
}
return 0;
}
4.3 CAN接收
/*
*==============================================================================
*函數(shù)名稱:Med_Can_Receive_Msg
*函數(shù)功能:接收報(bào)文
*輸入?yún)?shù):buf:數(shù)據(jù)緩存區(qū)指針
*返回值:0:沒有接收到數(shù)據(jù);其他:接收數(shù)據(jù)長度
*備 注:無
*==============================================================================
*/
u8 Med_Can_Receive_Msg (u8 *buf)
{
u32 i;
CanRxMsg RxMessage; // 定義接收報(bào)文結(jié)構(gòu)體
// 沒有接收到數(shù)據(jù),直接退出
if( CAN_MessagePending(CAN1,CAN_FIFO0) == 0)
{
return 0;
}
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); // 讀取數(shù)據(jù)
for(i = 0;i RxMessage.DLC;i ++)
{
buf[i] = RxMessage.Data[i];
}
return RxMessage.DLC;
}
4.4 CAN收發(fā)測試
利用按鍵WK UP控制報(bào)文的發(fā)送,按下一次發(fā)送一次報(bào)文。配置CAN波特率為500Kbps,環(huán)回模式。利用串口打印接收數(shù)據(jù)。需要注意的是,STM32只有CAN控制器,想要實(shí)現(xiàn)報(bào)文的收發(fā),需要自己連接CAN收發(fā)器。
首先初始化CAN
// 初始化CAN,500Kbps波特率
Drv_Can_Init(CAN_SJW_1tq,CAN_BS1_9tq,CAN_BS2_8tq,4,CAN_Mode_LoopBack);
然后編寫主程序
u8 gKeyValue = 0; // 獲取按鍵值
u8 gSendData[8] = {'1','2','3','4','5','6','7','8'}; // 發(fā)送內(nèi)容數(shù)組
u8 gReceData[8]; // 接收內(nèi)容數(shù)組
u8 gFlag = 0; // 接收發(fā)送標(biāo)志
int main(void)
{
Med_Mcu_Iint(); // 系統(tǒng)初始化
while(1)
{
gKeyValue = Med_KeyScan();
// WK UP 按下發(fā)送消息
if (gKeyValue == 1)
{
gFlag = Med_Can_Send_Msg(gSendData,8);
// 發(fā)送失敗
if (gFlag)
{
printf ("Send Defeat!rn");
}
else
{
printf ("Send Success!rn");
}
}
// 接收報(bào)文
gFlag = Med_Can_Receive_Msg(gReceData);
// 接收成功
if (gFlag)
{
printf ("Receive Data:%srn",gReceData);
}
}
}
測試結(jié)果如下
測試結(jié)果
4.5 補(bǔ)充說明
上面的CAN收發(fā)測試程序,發(fā)送的內(nèi)容是字符串“12345678”。如果發(fā)送的是數(shù)字12345678。在串口打印接收數(shù)據(jù)時(shí)需要先將接收到的數(shù)據(jù)轉(zhuǎn)換成字符,然后再打印。轉(zhuǎn)換方法很簡單,只需要對接收數(shù)組的每一位加48即可。
-
控制器
+關(guān)注
關(guān)注
114文章
17065瀏覽量
183700 -
CAN通信
+關(guān)注
關(guān)注
5文章
97瀏覽量
18387 -
緩沖器
+關(guān)注
關(guān)注
6文章
2039瀏覽量
46901 -
STM32
+關(guān)注
關(guān)注
2291文章
11026瀏覽量
363775 -
CRC效驗(yàn)
+關(guān)注
關(guān)注
0文章
30瀏覽量
1245
發(fā)布評論請先 登錄
用STM32F103做CAN的收發(fā)通信的程序思路與代碼分享

stm32 CAN無法通信
在STM32H743芯片上實(shí)現(xiàn)CAN通信
在STM32H743芯片上實(shí)現(xiàn)CAN通信的步驟

STM32CubMX自學(xué)筆記(七)—CAN通信實(shí)驗(yàn)

CubeMX STM32實(shí)現(xiàn)CAN通信——回環(huán)測試數(shù)據(jù)收發(fā)

基于STM32F429HAL庫的CAN通信代碼

基于STM32的CAN總線通信節(jié)點(diǎn)控制設(shè)計(jì)(畢設(shè)課設(shè))

CAN總線學(xué)習(xí)筆記|STM32的CAN環(huán)回測試
STM32入門學(xué)習(xí)筆記之CAN通信實(shí)驗(yàn)1

評論