99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32速成筆記(14)—CAN通信

冬至子 ? 來源:二土電子 ? 作者:二土電子 ? 2023-10-24 15:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、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種幀類型

1.jpg

在上述的幾種幀里,數(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ò)展幀的r0r1是保留位,保留位必須全部以顯性電平發(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)引腳如下

1.jpg

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)體成員如下

1.jpg

2.jpg

波特率 = Fpclk1 / ((CAN_BS1 + CAN_BS2 + 1)* CAN_Prescaler)

  • ? 設(shè)置CAN篩選器(過濾器) 庫函數(shù)也提供了篩選器的配置函數(shù)
void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct)

結(jié)構(gòu)體內(nèi)容如下

1.jpg

2.jpg

  • 選擇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)體成員如下

1.jpg

  • 選擇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)體成員如下

1.jpg

  • ? 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即可。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(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
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32F103做CAN的收發(fā)通信的程序思路與代碼分享

    STM32的標(biāo)識(shí)符屏蔽濾波目的是減少了CPU處理CAN通信的開銷。STM32的過濾器組最多有28個(gè)(互聯(lián)型),但是STM32F103ZET6
    的頭像 發(fā)表于 06-14 16:13 ?1.2w次閱讀
    用<b class='flag-5'>STM32</b>F103做<b class='flag-5'>CAN</b>的收發(fā)<b class='flag-5'>通信</b>的程序思路與代碼分享

    stm32 CAN無法通信

    本帖最后由 alan7lanshui 于 2018-3-16 18:02 編輯 stm32板子,斷電重啟之后,無法進(jìn)行CAN通信,只有在第一次寫入程序時(shí),可以進(jìn)行CAN
    發(fā)表于 08-19 06:26

    STM32奮斗板-CAN通信

    STM32奮斗板-CAN通信DEMO-V3/STM32奮斗板-CAN通信DEMO-V3/CM3/
    發(fā)表于 08-19 06:45

    STM32H743芯片上實(shí)現(xiàn)CAN通信

    1. 摘要本篇筆記主要介紹,在STM32H743芯片上實(shí)現(xiàn)CAN通信,封裝為BSP驅(qū)動(dòng),為之后實(shí)現(xiàn)CAN的高層
    發(fā)表于 08-20 07:41

    求大佬分享Can通信接口學(xué)習(xí)筆記

    求大佬分享Can通信接口學(xué)習(xí)筆記
    發(fā)表于 02-11 07:45

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

    本篇筆記主要介紹,在STM32H743芯片上實(shí)現(xiàn)CAN通信,封裝為BSP驅(qū)動(dòng),為之后實(shí)現(xiàn)CAN的高層通信
    的頭像 發(fā)表于 09-14 14:33 ?1.7w次閱讀
    在<b class='flag-5'>STM32</b>H743芯片上實(shí)現(xiàn)<b class='flag-5'>CAN</b><b class='flag-5'>通信</b>的步驟

    STM32學(xué)習(xí)筆記--CAN

    目錄:一、CAN通信原理1.CAN通信簡介2.CAN通信優(yōu)點(diǎn)3.
    發(fā)表于 11-19 12:21 ?86次下載
    <b class='flag-5'>STM32</b>學(xué)習(xí)<b class='flag-5'>筆記</b>--<b class='flag-5'>CAN</b>

    STM32F103學(xué)習(xí)筆記三 串口通信

    STM32F103學(xué)習(xí)筆記三 串口通信
    發(fā)表于 11-25 09:06 ?71次下載
    <b class='flag-5'>STM32</b>F103學(xué)習(xí)<b class='flag-5'>筆記</b>三   串口<b class='flag-5'>通信</b>

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

    STM32CubMX自學(xué)筆記(七)—CAN通信實(shí)驗(yàn)主要介紹由于項(xiàng)目需求要用到CAN通信協(xié)議,因此
    發(fā)表于 12-04 18:21 ?12次下載
    <b class='flag-5'>STM32</b>CubMX自學(xué)<b class='flag-5'>筆記</b>(七)—<b class='flag-5'>CAN</b><b class='flag-5'>通信</b>實(shí)驗(yàn)

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

    CubeMX STM32實(shí)現(xiàn)CAN通信——數(shù)據(jù)收發(fā)CAN通信CAN協(xié)議CubeMX設(shè)置代碼部分過
    發(fā)表于 12-04 18:36 ?14次下載
    CubeMX <b class='flag-5'>STM32</b>實(shí)現(xiàn)<b class='flag-5'>CAN</b><b class='flag-5'>通信</b>——回環(huán)測試數(shù)據(jù)收發(fā)

    基于STM32F429HAL庫的CAN通信代碼

    基于STM32F429HAL庫的CAN通信代碼* 最近在學(xué)正點(diǎn)原子阿波羅STM32F429開發(fā)板的CAN
    發(fā)表于 12-04 19:06 ?19次下載
    基于<b class='flag-5'>STM32</b>F429HAL庫的<b class='flag-5'>CAN</b><b class='flag-5'>通信</b>代碼

    Can通信接口學(xué)習(xí)筆記

    Can通信接口學(xué)習(xí)筆記
    發(fā)表于 12-08 16:36 ?29次下載
    <b class='flag-5'>Can</b><b class='flag-5'>通信</b>接口學(xué)習(xí)<b class='flag-5'>筆記</b>

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

    說明:這是我的畢業(yè)設(shè)計(jì),基于STM32CAN總線通信節(jié)點(diǎn)設(shè)計(jì)。用的是STM32F103微控制器,LCD1602液晶顯示,MQ-4甲烷氣體傳感器,CTM1050
    發(fā)表于 12-24 19:30 ?50次下載
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>CAN</b>總線<b class='flag-5'>通信</b>節(jié)點(diǎn)控制設(shè)計(jì)(畢設(shè)課設(shè))

    CAN總線學(xué)習(xí)筆記|STM32CAN環(huán)回測試

    CAN基礎(chǔ)知識(shí)介紹文中介紹了CAN協(xié)議的基礎(chǔ)知識(shí),以及STM32F4芯片的CAN控制器相關(guān)知識(shí),下面將通過實(shí)例,利用STM32CubeMX圖
    的頭像 發(fā)表于 01-04 15:23 ?3218次閱讀

    STM32入門學(xué)習(xí)筆記CAN通信實(shí)驗(yàn)1

    CAN是Controller Area Network的縮寫,最初是專門用于汽車網(wǎng)絡(luò)的通信協(xié)議,與485協(xié)議相似,CAN也是一種2線制,采用兩根線的電壓差進(jìn)行數(shù)據(jù)傳輸?shù)膮f(xié)議,隨著CAN
    的頭像 發(fā)表于 02-16 14:37 ?2191次閱讀
    <b class='flag-5'>STM32</b>入門學(xué)習(xí)<b class='flag-5'>筆記</b>之<b class='flag-5'>CAN</b><b class='flag-5'>通信</b>實(shí)驗(yàn)1