91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

基于STM32實現(xiàn)簡單的CAN通訊過程

開山師傅 ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-03-02 08:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

4、 CAN 總線采用了多主競爭式總線結(jié)構(gòu),具有多主站運(yùn)行和分散仲裁的串行總線以及廣播通信的特點。

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

基于STM32實現(xiàn)簡單的CAN通訊過程can通訊拓?fù)浣Y(jié)構(gòu)

下面我們將根據(jù)stm32 嵌入式系統(tǒng)

話不多說,直接上代碼:

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);						//發(fā)送數(shù)據(jù)

u8 Can_Receive_Msg(u8 *buf);							//接收數(shù)據(jù)
#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,回環(huán)模式;
//Fpclk1的時鐘在初始化的時候設(shè)置為36M,如果設(shè)置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;	//復(fù)用推挽
	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單元設(shè)置
	CAN_InitStructure.CAN_TTCM=DISABLE;			//非時間觸發(fā)通信模式  
	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;			//優(yōu)先級由報文標(biāo)識符決定 
	CAN_InitStructure.CAN_Mode= mode;	        //模式設(shè)置: mode:0,普通模式;1,回環(huán)模式; 
	//設(shè)置波特率
	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;        //分頻系數(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=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關(guān)聯(lián)到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;     // 主優(yōu)先級為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次優(yōu)先級為0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
#endif
	return 0;
}   
 
#if CAN_RX0_INT_ENABLE	//使能RX0中斷
//中斷服務(wù)函數(shù)			    
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發(fā)送一組數(shù)據(jù)(固定格式:ID為0X12,標(biāo)準(zhǔn)幀,數(shù)據(jù)幀)	
//len:數(shù)據(jù)長度(最大為8)				     
//msg:數(shù)據(jù)指針,最大為8個字節(jié).
//返回值:0,成功;
//		 其他,失敗;
u8 Can_Send_Msg(u8* msg,u8 len)
{	
	u8 mbox;
	u16 i=0;
	CanTxMsg TxMessage;
	TxMessage.StdId=0x123;			// 標(biāo)準(zhǔn)標(biāo)識符 
	TxMessage.ExtId=0x18f10155;			// 設(shè)置擴(kuò)展標(biāo)示符 ID
	TxMessage.IDE=CAN_Id_Extended; 	// 擴(kuò)展幀CAN_Id_Extended 標(biāo)準(zhǔn)幀CAN_Id_Standard
	TxMessage.RTR=CAN_RTR_Data;		// 數(shù)據(jù)幀
	TxMessage.DLC=len;				// 要發(fā)送的數(shù)據(jù)長度
	for(i=0;i=0XFFF)return 1;
	return 0;	 
}
//can口接收數(shù)據(jù)查詢
//buf:數(shù)據(jù)緩存區(qū);	 
//返回值:0,無數(shù)據(jù)被收到;
//		 其他,接收的數(shù)據(jù)長度;
u8 Can_Receive_Msg(u8 *buf)
{		   		   
 	u32 i;
	CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;		//沒有接收到數(shù)據(jù),直接退出 
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//讀取數(shù)據(jù)	
    for(i=0;i<8;i++)
    buf[i]=RxMessage.Data[i];  
	return RxMessage.DLC;	
};i++)>

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    59

    文章

    3065

    瀏覽量

    472721
  • 通訊
    +關(guān)注

    關(guān)注

    9

    文章

    945

    瀏覽量

    36531
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    3040

    瀏覽量

    91653
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之I2C通訊協(xié)議的物理層和協(xié)議層簡介

    I2C通訊協(xié)議(Inter-Integrated Circuit)是由 Philips公司開發(fā)的,由于它引腳少,硬件實現(xiàn)簡單,可擴(kuò)展性強(qiáng),不需要USART、CAN
    的頭像 發(fā)表于 01-21 10:10 ?3362次閱讀
    瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之I2C<b class='flag-5'>通訊</b>協(xié)議的物理層和協(xié)議層簡介

    PXB-6020(D):讓CAN通訊更靈活,Modbus接入更簡單

    在現(xiàn)代工業(yè)和儲能系統(tǒng)中,CAN通訊接口數(shù)量有限,常常限制了系統(tǒng)的擴(kuò)展和設(shè)備接入。如何在不增加成本的情況下,實現(xiàn)更多設(shè)備的靈活接入?本文將介紹一款高效、可靠的解決方案,輕松解決接口瓶頸問題。背景在
    的頭像 發(fā)表于 11-27 11:38 ?288次閱讀
    PXB-6020(D):讓<b class='flag-5'>CAN</b><b class='flag-5'>通訊</b>更靈活,Modbus接入更<b class='flag-5'>簡單</b>

    EtherNet/IP轉(zhuǎn)CAN協(xié)議轉(zhuǎn)換網(wǎng)關(guān)實現(xiàn)基恩士PLC與CAN協(xié)議的IO卡通訊的配置案例

    EtherNet/IP 對 4 組進(jìn)口CAN總線 IO 卡(德國 Helmholz CAN-IO-32 系列,每卡 32 點,共 128 點混合 I/O)進(jìn)行實時 數(shù)據(jù)交互 ,實現(xiàn)液壓夾緊、真空
    的頭像 發(fā)表于 11-04 10:49 ?489次閱讀
    EtherNet/IP轉(zhuǎn)<b class='flag-5'>CAN</b>協(xié)議轉(zhuǎn)換網(wǎng)關(guān)<b class='flag-5'>實現(xiàn)</b>基恩士PLC與<b class='flag-5'>CAN</b>協(xié)議的IO卡<b class='flag-5'>通訊</b>的配置案例

    AT32F系列 CAN通訊模式使用

    AT32F系列 CAN通訊模式使用本帖子演示AT32F系列_CAN通訊模式的使用方法。注:本應(yīng)用筆記對應(yīng)的代碼是基于雅特力提供的V2.x.x 板級支持包(BSP)而開發(fā),對于其他版本B
    發(fā)表于 10-20 16:29

    CAN通訊失敗的常見原因

    通過這種由外至內(nèi)、從硬件到軟件的逐層排查,我能夠高效地定位并解決絕大多數(shù)CAN通訊故障。
    的頭像 發(fā)表于 10-14 15:15 ?1478次閱讀

    基恩士PLC使用EtherNet/IP協(xié)議通過EtherNet/IP轉(zhuǎn)CAN協(xié)議轉(zhuǎn)換網(wǎng)關(guān)與CAN協(xié)議IO卡通訊案例

    痛點: 首先是 協(xié)議兼容性障礙 ?;魇縋LC采用EtherNet/IP協(xié)議進(jìn)行數(shù)據(jù)傳輸,而現(xiàn)場IO卡均基于CAN總線協(xié)議設(shè)計,兩種協(xié)議在數(shù)據(jù)幀結(jié)構(gòu)、傳輸機(jī)制和地址映射方式上存在本質(zhì)差異,導(dǎo)致直接通訊無法實現(xiàn)。這種"語言不通"的
    的頭像 發(fā)表于 09-25 14:24 ?619次閱讀
    基恩士PLC使用EtherNet/IP協(xié)議通過EtherNet/IP轉(zhuǎn)<b class='flag-5'>CAN</b>協(xié)議轉(zhuǎn)換網(wǎng)關(guān)與<b class='flag-5'>CAN</b>協(xié)議IO卡<b class='flag-5'>通訊</b>案例

    CAN 接口的“老炮”本色:ARMxy BL410 工業(yè)通訊全攻略

    深圳市鋇錸技術(shù)有限公司ARMxy系列BL410控制器,內(nèi)置工業(yè)級CAN接口,支持多節(jié)點廣播、強(qiáng)抗干擾與高實時性,適用于儲能系統(tǒng)BMS、AGV、變頻器組網(wǎng)等復(fù)雜環(huán)境。配合RS485、LAN等多接口組合,實現(xiàn)設(shè)備到云的穩(wěn)定高速通訊
    的頭像 發(fā)表于 08-12 09:35 ?807次閱讀

    6軸步進(jìn)電機(jī)驅(qū)動+STM32F767+485+CAN+網(wǎng)口+12輸入輸出原理圖

    6軸步進(jìn)電機(jī)驅(qū)動+STM32F767+485+CAN+網(wǎng)口+12路輸入輸出 原理圖?步進(jìn)電機(jī)驅(qū)動方案TMC5160
    發(fā)表于 06-27 16:18 ?0次下載

    如何解決CAN通訊故障?原因分析與解決方法全攻略

    在日常工作中,我們經(jīng)常收到客戶的反饋,他們表示CAN卡無法正常通訊,這給工作帶來了諸多不便。今天,就讓我們深入探討一下導(dǎo)致CAN通訊失敗的常見原因,以及相應(yīng)的解決方法。單個
    的頭像 發(fā)表于 06-16 11:39 ?2025次閱讀
    如何解決<b class='flag-5'>CAN</b><b class='flag-5'>通訊</b>故障?原因分析與解決方法全攻略

    Profinet轉(zhuǎn)CAN網(wǎng)關(guān)模塊對實現(xiàn)西門子PLC與CAN變頻器協(xié)同通信的助力研究

    在智能物流倉儲系統(tǒng)中,AGV等設(shè)備的通訊網(wǎng)絡(luò)穩(wěn)定性和實時性至關(guān)重要。通過Profinet轉(zhuǎn)CAN網(wǎng)關(guān),可以實現(xiàn)中控系統(tǒng)(如西門子PLC,支持ProFiNet協(xié)議)與伺服驅(qū)動器(支持CAN
    的頭像 發(fā)表于 06-09 14:59 ?876次閱讀
    Profinet轉(zhuǎn)<b class='flag-5'>CAN</b>網(wǎng)關(guān)模塊對<b class='flag-5'>實現(xiàn)</b>西門子PLC與<b class='flag-5'>CAN</b>變頻器協(xié)同通信的助力研究

    一分鐘帶你簡單了解,CAN總線在汽車電子測試中的作用#CAN #CANoe #汽車電子

    CAN
    北匯信息POLELINK
    發(fā)布于 :2025年04月07日 15:01:53

    CAN報文流程解析

    CAN報文流程解析,直流充電樁上的CAN通訊解析過程
    發(fā)表于 03-24 14:03 ?10次下載

    如何使用ZPS-CANFD觀察CAN數(shù)據(jù)鏈路層的工作過程

    CAN總線在數(shù)據(jù)鏈路層中的應(yīng)用是其通信協(xié)議中的關(guān)鍵部分、它負(fù)責(zé)在物理層之上實現(xiàn)數(shù)據(jù)的可靠傳輸。致遠(yuǎn)第二代CAN總線分析儀ZPS-CANFD,除了可以完成CAN、CANFD總線物理層的一
    的頭像 發(fā)表于 03-18 11:38 ?1006次閱讀
    如何使用ZPS-CANFD觀察<b class='flag-5'>CAN</b>數(shù)據(jù)鏈路層的工作<b class='flag-5'>過程</b>

    使用STM32H7的FDCAN通訊,為什么CAN1會收到CAN2的幀ID,CAN2也會收到CAN1的?

    使用STM32H7的FDCAN通訊,請問為什么CAN1會收到CAN2的幀ID,CAN2也會收到CAN
    發(fā)表于 03-14 10:33