在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32實現簡單的CAN通訊過程

開山師傅 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-03-02 08:58 ? 次閱讀

CAN通訊在車輛工程中用的非常廣泛,本文將基于stm32實現簡單的can通訊過程。

首先了解一下CAN通訊的主要特點:

1、 數據通信沒有主從之分,任意一個節點可以向任何其他(一個或多個)節點發起數據通信,靠各個節點信息優先級先后順序來決定通信次序。

2、 支持時間觸發通信功能, 發送報文的優先級可軟件配置。多個節點同時發起通信時,優先級低的避讓優先級高的,不會對通信線路造成擁塞。

3、 CAN 是一種多主總線,通信介質可以是雙絞線、同軸電纜或光導纖維。通信距離最遠可達10KM(速率低于5Kbps),速率可達到1Mbps(通信距離小于40M)。

4、 CAN 總線采用了多主競爭式總線結構,具有多主站運行和分散仲裁的串行總線以及廣播通信的特點。

5、 FIFO(First Input First Output),即先進先出隊列,溢出處理方式可配置

基于STM32實現簡單的CAN通訊過程can通訊拓撲結構

下面我們將根據stm32 嵌入式系統

話不多說,直接上代碼:

can.h代碼如下:

#ifndef __CAN_H
#define __CAN_H	 
#include "sys.h"	 


//CAN接收RX0中斷使能
#define CAN_RX0_INT_ENABLE	1		//0,不使能;1,使能.								    
										 							 				    
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode);//CAN初始化
 
u8 Can_Send_Msg(u8* msg,u8 len);						//發送數據

u8 Can_Receive_Msg(u8 *buf);							//接收數據
#endif

can.c代碼如下:

#include "can.h"
#include "led.h"
#include "delay.h"
#include "usart.h"

//CAN初始化
//tsjw:重新同步跳躍時間單元.范圍:CAN_SJW_1tq~ CAN_SJW_4tq
//tbs2:時間段2的時間單元.   范圍:CAN_BS2_1tq~CAN_BS2_8tq;
//tbs1:時間段1的時間單元.   范圍:CAN_BS1_1tq ~CAN_BS1_16tq
//brp :波特率分頻器.范圍:1~1024;  tq=(brp)*tpclk1
//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
//mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回環模式;
//Fpclk1的時鐘在初始化的時候設置為36M,如果設置CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);
//則波特率為:36M/((8+9+1)*4)=500Kbps
//返回值:0,初始化OK;
//    其他,初始化失敗; 
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{ 
	GPIO_InitTypeDef 		GPIO_InitStructure; 
	CAN_InitTypeDef        	CAN_InitStructure;
	CAN_FilterInitTypeDef  	CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE 
	NVIC_InitTypeDef  		NVIC_InitStructure;
#endif

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA時鐘	                   											 

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1時鐘	

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽
	GPIO_Init(GPIOA, &GPIO_InitStructure);			//初始化IO

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//上拉輸入
	GPIO_Init(GPIOA, &GPIO_InitStructure);			//初始化IO

	//CAN單元設置
	CAN_InitStructure.CAN_TTCM=DISABLE;			//非時間觸發通信模式  
	CAN_InitStructure.CAN_ABOM=DISABLE;			//軟件自動離線管理	 
	CAN_InitStructure.CAN_AWUM=DISABLE;			//睡眠模式通過軟件喚醒(清除CAN->MCR的SLEEP位)
	CAN_InitStructure.CAN_NART=ENABLE;			//禁止報文自動傳送 
	CAN_InitStructure.CAN_RFLM=DISABLE;		 	//報文不鎖定,新的覆蓋舊的  
	CAN_InitStructure.CAN_TXFP=DISABLE;			//優先級由報文標識符決定 
	CAN_InitStructure.CAN_Mode= mode;	        //模式設置: mode:0,普通模式;1,回環模式; 
	//設置波特率
	CAN_InitStructure.CAN_SJW=tsjw;				//重新同步跳躍寬度(Tsjw)為tsjw+1個時間單位  CAN_SJW_1tq	 CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
	CAN_InitStructure.CAN_BS1=tbs1; 			//Tbs1=tbs1+1個時間單位CAN_BS1_1tq ~CAN_BS1_16tq
	CAN_InitStructure.CAN_BS2=tbs2;				//Tbs2=tbs2+1個時間單位CAN_BS2_1tq ~	CAN_BS2_8tq
	CAN_InitStructure.CAN_Prescaler=brp;        //分頻系數(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=0x18F1;	//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關聯到FIFO0
	CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活過濾器0

	CAN_FilterInit(&CAN_FilterInitStructure);			//濾波器初始化
	
#if CAN_RX0_INT_ENABLE 
	CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);				//FIFO0消息掛號中斷允許.		    

	NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主優先級為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次優先級為0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
#endif
	return 0;
}   
 
#if CAN_RX0_INT_ENABLE	//使能RX0中斷
//中斷服務函數			    
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  	CanRxMsg RxMessage;
	int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
	for(i=0;i<8;i++)
	printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);
}
#endif

//can發送一組數據(固定格式:ID為0X12,標準幀,數據幀)	
//len:數據長度(最大為8)				     
//msg:數據指針,最大為8個字節.
//返回值:0,成功;
//		 其他,失敗;
u8 Can_Send_Msg(u8* msg,u8 len)
{	
	u8 mbox;
	u16 i=0;
	CanTxMsg TxMessage;
	TxMessage.StdId=0x123;			// 標準標識符 
	TxMessage.ExtId=0x18f10155;			// 設置擴展標示符 ID
	TxMessage.IDE=CAN_Id_Extended; 	// 擴展幀CAN_Id_Extended 標準幀CAN_Id_Standard
	TxMessage.RTR=CAN_RTR_Data;		// 數據幀
	TxMessage.DLC=len;				// 要發送的數據長度
	for(i=0;i=0XFFF)return 1;
	return 0;	 
}
//can口接收數據查詢
//buf:數據緩存區;	 
//返回值:0,無數據被收到;
//		 其他,接收的數據長度;
u8 Can_Receive_Msg(u8 *buf)
{		   		   
 	u32 i;
	CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;		//沒有接收到數據,直接退出 
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//讀取數據	
    for(i=0;i<8;i++)
    buf[i]=RxMessage.Data[i];  
	return RxMessage.DLC;	
};i++)>

所用的函數為標準庫函數,需要更換引腳需要根據相關的芯片手冊進行配置相關的引腳,這里也不做贅述,后面會講到如何根據數據手冊看芯片資料。只要配置好這兩個函數就可以完成數據發送和接收。
審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • CAN
    CAN
    +關注

    關注

    57

    文章

    2773

    瀏覽量

    464465
  • 通訊
    +關注

    關注

    9

    文章

    915

    瀏覽量

    35105
  • 總線
    +關注

    關注

    10

    文章

    2904

    瀏覽量

    88442
收藏 人收藏

    評論

    相關推薦

    HTTP網絡通訊過程

    的 OSI 模型。 OSI ?是一種理論下的模型,而? TCP/IP ?已被廣泛使用,成為網絡互聯事實上的標準。 2. HTTP 網絡通訊過程 示例:簡單的網絡拓撲模型 詳解:當鍵入網址到網頁顯示的
    的頭像 發表于 01-20 09:07 ?109次閱讀
    HTTP網絡<b class='flag-5'>通訊</b><b class='flag-5'>過程</b>

    EE-227:ADSP-21992 DSP的CAN配置過程

    電子發燒友網站提供《EE-227:ADSP-21992 DSP的CAN配置過程.pdf》資料免費下載
    發表于 01-14 17:18 ?0次下載
    EE-227:ADSP-21992 DSP的<b class='flag-5'>CAN</b>配置<b class='flag-5'>過程</b>

    快速了解CAN通訊原理及應用

    一張圖看懂CAN總線的原理 圖1 CAN通信原理 參考上圖,簡單來說CAN總線就如兩根黃線,通信的原理就好比開一個電話會議,大家都同時撥進來,然后有各種不同的狀態,比如:一個人說話,其
    的頭像 發表于 11-19 10:16 ?856次閱讀
    快速了解<b class='flag-5'>CAN</b><b class='flag-5'>通訊</b>原理及應用

    如何檢測can通訊電路的好壞

    CAN(Controller Area Network)是一種基于總線通信的局域網技術,廣泛應用于汽車電子、工業控制等領域。在實際應用中,CAN通訊電路的好壞對整個系統的穩定性和可靠性具有重要
    的頭像 發表于 06-16 09:42 ?3611次閱讀

    STM32F103用CAN調試器接到該板子后給其發消息,調試器會顯示總線數據錯誤的原因?

    項目里有個CAN收發相關的板子,用的是STM32F103芯片。在與上位機的CAN交互過程中經常會出現通訊錯誤的情況,表現在上位機發送報文后沒
    發表于 05-27 07:42

    PLC與CAN通訊設備如何搭配使用呢?

    PLC與CAN通訊設備的搭配使用,主要取決于具體的應用場景和需求。
    的頭像 發表于 05-11 10:39 ?701次閱讀

    MACH網關 SENT-ETH數據讀取與控制(CAN通訊

    ? Mach SAE J2716 SENT 網關模塊,廠家的軟件只支持了canlib32.dll,但是網關開放的通訊協議可以讓其他CAN卡通過CAN報文順利地使用它。 配置網關CAN
    的頭像 發表于 04-29 16:36 ?544次閱讀
    MACH網關 SENT-ETH數據讀取與控制(<b class='flag-5'>CAN</b><b class='flag-5'>通訊</b>)

    stm32f429 can1通訊使用hal發送數據不穩定怎么解決?

    stm32f429 can1通訊,使用hal庫配置工程,發送數據不穩定,發送幾十個包才有一倆正常發送,但是使用標準庫就可以正常發送數據,也很穩定,研究兩天了也沒有解決,這是什么問題呢。
    發表于 04-02 06:04

    兩片STM32CAN接口,可以直接用TX與RX引腳連接正常通訊嗎?

    兩片 STM32CAN接口,可以直接用TX與RX引腳連接(不接CAN收發器芯片)正常通訊
    發表于 04-01 07:38

    STM32F103的CAN通訊過程中,一條總線上有幾個不同波特率的設備,可以在CAN通訊前修改波特率嗎?

    STM32F103的CAN通訊過程中,一條總線上有幾個不同波特率的設備,可以在CAN通訊前修改
    發表于 03-26 06:35

    使用STM32F042單片機做的CAN通訊,運行一段時間后通訊異常的原因?

    使用STM32F042單片機做的CAN通訊,運行一段時間后發現通訊異常,當通訊異常時,重新下載程序后通訊
    發表于 03-15 07:11

    STM32cubeProg做stm32h745xi芯片ISP升級時,連接不到設備怎么解決?

    環境配置 st開發板stm32h745xi-disco,CAN通訊接口 + can上位機;軟件為stm32cubeprog; 需要
    發表于 03-14 06:56

    使用STM32F103R8T6+ENC28J60+LWIP作網絡通訊CAN發送失敗了怎么解決?

    你好:使用STM32F103R8T6+ENC28J60+LWIP作網絡通訊,現在遇到一個問題:使用CUDE建立的MDK工程,在調試網絡部分之前,CAN收發正常。在移植完LWIP 2.1.3之后,網絡
    發表于 03-13 06:52

    STM32F407的CAN通訊接收長數據,用keil調試時每次進中斷FIFO就已經數據溢出了怎么解決?

    我想使用STM32F407的CAN通訊來接收六維力傳感器的力信息,但是這個信息長度有31個字節,當STM32發送請求力信息的命令時,傳感器采集卡一次性就發出4幀的數據幀,使接收FIFO
    發表于 03-12 07:55

    Mini CAN Unit小型CAN總線通訊單元

    技術,CAN總線能夠實現穩定通信,適應長距離傳輸和嘈雜環境的要求。MiniCANUnitMiniCANUnit是一款小型CAN總線通訊單元,采用了TJA1051T
    的頭像 發表于 02-19 12:47 ?554次閱讀
    Mini <b class='flag-5'>CAN</b> Unit小型<b class='flag-5'>CAN</b>總線<b class='flag-5'>通訊</b>單元
    主站蜘蛛池模板: 国产色秀视频 | 国产成人av在线 | 成人欧美精品一区二区不卡 | 女人被男人免费播放网站 | 欧美一区二区三区免费看 | 亚洲va国产日韩欧美精品色婷婷 | 一级大片免费观看 | 国产亚洲美女精品久久久2020 | 亚洲免费一区二区 | 日本三级人妇 | 国产一区美女 | 午夜影院404 | 啪啪伊人网 | 亚洲国产成+人+综合 | 最刺激黄a大片免费观看 | 婷婷五月天.com | 欧美一级黄色片视频 | av网址在线看| 97影院午夜午夜伦不卡 | 日本黄页视频 | 成 黄 色 激 情视频网站 | 视频三区 | 月夜免费观看高清在线完整 | 高清色视频 | 久久视频精品线视频在线网站 | 伊人丁香婷婷综合一区二区 | 欧美大狠狠大臿蕉香蕉大视频 | 激情文学综合丁香 | 免费观看黄网站 | 天天干天天舔天天射 | 日韩特黄毛片 | 伊在线视频 | 国产三级久久久精品三级 | www.四虎影院.con | 67xxxxxx日本| 美女三级网站 | 亚洲狠狠婷婷综合久久久图片 | 在线三区 | 久操资源在线 | 日本xxxx色视频在线观看免 | 夜夜偷影视 |