☆ CAN協(xié)議基礎(chǔ)知識(shí)
I2C.SPI總線多用于短距離傳輸,協(xié)議簡(jiǎn)單,數(shù)據(jù)量少,主要用于IC之間的通訊,而 CAN 總線則不同,CAN(Controller Area Network) 總線定義了更為優(yōu)秀的物理層、數(shù)據(jù)鏈路層,并且擁有種類豐富、簡(jiǎn)繁不一的上層協(xié)議。與I2C、SPI有時(shí)鐘信號(hào)的同步通訊方式不同,CAN通訊并不是以時(shí)鐘信號(hào)來(lái)進(jìn)行同步的,它是一種異步通訊,只具有CAN_High和CAN_Low兩條信號(hào)線,共同構(gòu)成一組差分信號(hào)線,以差分信號(hào)的形式進(jìn)行通訊。
CAN物理層的形式主要分為閉環(huán)總線及開環(huán)總線網(wǎng)絡(luò)兩種,一個(gè)適合于高速通訊,一個(gè)適合于遠(yuǎn)距離通訊。CAN閉環(huán)通訊網(wǎng)絡(luò)是一種遵循ISO11898標(biāo)準(zhǔn)的高速、短距離網(wǎng)絡(luò),它的總線最大長(zhǎng)度為40m,通信速度最高為1Mbps,總線的兩端各要求有一個(gè)
“120歐”的電阻來(lái)做阻抗匹配,以減少回波反射。
☆ 閉環(huán)總線網(wǎng)絡(luò)
CAN開環(huán)總線網(wǎng)絡(luò)是遵循ISO11519-2標(biāo)準(zhǔn)的低速、遠(yuǎn)距離網(wǎng)絡(luò),它的最大傳輸距離為1km,最高通訊速率為125kbps,兩根總線是獨(dú)立的、不形成閉環(huán),要求每根總線上各串聯(lián)有一個(gè)“2.2千歐”的電阻。
☆ 開環(huán)總線網(wǎng)絡(luò)
CAN總線上可以掛載多個(gè)通訊節(jié)點(diǎn),節(jié)點(diǎn)之間的信號(hào)經(jīng)過(guò)總線傳輸,實(shí)現(xiàn)節(jié)點(diǎn)間通訊。由于CAN通訊協(xié)議不對(duì)節(jié)點(diǎn)進(jìn)行地址編碼,而是對(duì)數(shù)據(jù)內(nèi)容進(jìn)行編碼,所以網(wǎng)絡(luò)中的節(jié)點(diǎn)個(gè)數(shù)理論上不受限制,只要總線的負(fù)載足夠即可,可以通過(guò)中繼器增強(qiáng)負(fù)載。
CAN通訊節(jié)點(diǎn)由一個(gè)CAN控制器及CAN收發(fā)器組成,控制器與收發(fā)器之間通過(guò)CAN_Tx及CAN_Rx信號(hào)線相連,收發(fā)器與CAN總線之間使用CAN_High及CAN_Low信號(hào)線相連。其中CAN_Tx及CAN_Rx使用普通的類似TTL邏輯信號(hào),而CAN_High及CAN_Low是一對(duì)差分信號(hào)線,使用比較特別的差分信號(hào)。當(dāng)CAN節(jié)點(diǎn)需要發(fā)送數(shù)據(jù)時(shí),控制器把要發(fā)送的二進(jìn)制編碼通過(guò)CAN_Tx線發(fā)送到收發(fā)器,然后由收發(fā)器把這個(gè)普通的邏輯電平信號(hào)轉(zhuǎn)化成差分信號(hào),通過(guò)差分線CAN_High和CAN_Low線輸出到CAN總線網(wǎng)絡(luò)。而通過(guò)收發(fā)器接收總線上的數(shù)據(jù)到控制器時(shí),則是相反的過(guò)程,收發(fā)器把總線上收到的CAN_High及CAN_Low信號(hào)轉(zhuǎn)化成普通的邏輯電平信號(hào),通過(guò)CAN_Rx輸出到控制器中。
☆ 差分信號(hào)
差分信號(hào)又稱差模信號(hào),與傳統(tǒng)使用單根信號(hào)線電壓表示邏輯的方式有區(qū)別,使用差分信號(hào)傳輸時(shí),需要兩根信號(hào)線,這兩個(gè)信號(hào)線的振幅相等,相位相反,通過(guò)兩根信號(hào)線的電壓差值來(lái)表示邏輯0和邏輯1。
相對(duì)于單信號(hào)線傳輸?shù)姆绞剑褂貌罘中盘?hào)傳輸具有如下優(yōu)點(diǎn):
抗干擾能力強(qiáng),當(dāng)外界存在噪聲干擾時(shí),幾乎會(huì)同時(shí)耦合到兩條信號(hào)線上,而接收端只關(guān)心兩個(gè)信號(hào)的差值,所以外界的共模噪聲可以被完全抵消。
能有效抑制它對(duì)外部的電磁干擾,同樣的道理,由于兩根信號(hào)的極性相反,他們對(duì)外輻射的電磁場(chǎng)可以相互抵消,耦合的越緊密,泄放到外界的電磁能量越少。
時(shí)序定位精確,由于差分信號(hào)的開關(guān)變化是位于兩個(gè)信號(hào)的交點(diǎn),而不像普通單端信號(hào)依靠高低兩個(gè)閾值電壓判斷,因而受工藝,溫度的影響小,能降低時(shí)序上的誤差,同時(shí)也更適合于低幅度信號(hào)的電路。
由于差分信號(hào)線具有這些優(yōu)點(diǎn),所以在USB協(xié)議、485協(xié)議、以太網(wǎng)協(xié)議及CAN協(xié)議的物理層中,都使用了差分信號(hào)傳輸。
☆ CAN協(xié)議中的差分信號(hào)
CAN協(xié)議中對(duì)它使用的CAN_High及CAN_Low表示的差分信號(hào)做了規(guī)定。以高速CAN協(xié)議為例,當(dāng)表示邏輯1時(shí)(隱性電平),CAN_High和CAN_Low線上的電壓均為2.5v,即它們的電壓差V H -V L =0V;而表示邏輯0時(shí)(顯性電平),CAN_High的電平為3.5V,CAN_Low線的電平為1.5V,即它們的電壓差為V H -V L =2V。
☆ CAN 總線的特點(diǎn)
CAN 總線網(wǎng)絡(luò)是一種真正的多主機(jī)網(wǎng)絡(luò),在總線處于空閑狀態(tài)時(shí),任何一個(gè)節(jié)點(diǎn)單元都可以申請(qǐng)成為主機(jī),向總線發(fā)送消息。其原則是:最先訪問(wèn)總線的節(jié)點(diǎn)單元可以獲得總線的控制權(quán);多個(gè)節(jié)點(diǎn)單元同時(shí)嘗試獲取總線的控制權(quán)時(shí),將發(fā)生仲裁事件,具有高優(yōu)先級(jí)的節(jié)點(diǎn)單元將獲得總線控制權(quán)。
CAN 協(xié)議中,所有的消息都以固定的數(shù)據(jù)格式打包發(fā)送。兩個(gè)以上的節(jié)點(diǎn)單元同時(shí)發(fā)送信息時(shí),根據(jù)節(jié)點(diǎn)標(biāo)識(shí)符(常稱為 ID,亦打包在固定的數(shù)據(jù)格式中)決定各自優(yōu)先級(jí)關(guān)系,所以 ID 并非表示數(shù)據(jù)發(fā)送的目的地址,而是代表著各個(gè)節(jié)點(diǎn)訪問(wèn)總線的優(yōu)先級(jí)。如此看來(lái),CAN 總線并無(wú)類似其他總線“地址”的概念,在總線上增加節(jié)點(diǎn)單元時(shí),連接在總線的其他節(jié)點(diǎn)單元的軟硬件都不需要改變。
CAN 總線的通信速率和總線長(zhǎng)度有關(guān),在總線長(zhǎng)度小于 40m 的場(chǎng)合中,數(shù)據(jù)傳輸速率可以達(dá)到 1Mbps,而即便總線長(zhǎng)度上升至 1000m,數(shù)據(jù)的傳輸速率仍可達(dá)到 50Kbps,無(wú)論在速率還是傳輸距離都明顯優(yōu)于常見的 RS232、RS485 和 I2C 總線。
對(duì)于總線錯(cuò)誤,CAN 總線有錯(cuò)誤檢測(cè)功能、錯(cuò)誤通知功能、錯(cuò)誤恢復(fù)功能三種應(yīng)對(duì)措施,分別應(yīng)對(duì)于下面三點(diǎn)表述:所有的單元節(jié)點(diǎn)都可以自動(dòng)檢測(cè)總線上的錯(cuò)誤;檢測(cè)出錯(cuò)誤的節(jié)點(diǎn)單元會(huì)立刻將錯(cuò)誤通知給其他節(jié)點(diǎn)單元;若正在發(fā)送消息的單元檢測(cè)到當(dāng)前總線發(fā)生錯(cuò)誤,則立刻強(qiáng)制取消當(dāng)前發(fā)送,并不斷反復(fù)發(fā)送此消息至成功為止。
CAN 總線上的每個(gè)節(jié)點(diǎn)都可以通過(guò)判斷得出,當(dāng)前總線上的錯(cuò)誤是暫時(shí)的錯(cuò)誤(如瞬間的強(qiáng)干擾)還是持續(xù)的錯(cuò)誤(如總線斷裂)。當(dāng)總線上發(fā)生持續(xù)錯(cuò)誤時(shí),引起故障的節(jié)點(diǎn)單元會(huì)自動(dòng)脫離總線。
CAN 總線上的節(jié)點(diǎn)數(shù)量在理論上沒(méi)有上限,但在實(shí)際上受到總線上的時(shí)間延時(shí)及電氣負(fù)載的限制。降低最大通信速率,可以增加節(jié)點(diǎn)單元的連接數(shù);反之,減少節(jié)點(diǎn)單元的連接數(shù),則最大通信速率可以提高。
CAN總線的數(shù)據(jù)通信是以數(shù)據(jù)幀的格式進(jìn)行的,而數(shù)據(jù)幀又是由位場(chǎng)組成的,其中每一個(gè)位又被劃分為四段.即SS(SYNC SEG),PTS(PROP SEG--傳播時(shí)間段),PBS1(PHASE SEG1--相位緩沖段1),PBS2(PHASE SEG1--相位緩沖段2).
數(shù)據(jù)幀的結(jié)構(gòu)圖:
圖中D表示顯性電平,R表示隱形電平.ID:高位在前,低位在后。基本ID,禁止高7位都為隱性,即不能:ID=1111111XXXX。RTR,遠(yuǎn)程請(qǐng)求位。0,數(shù)據(jù)幀;1, 遠(yuǎn)程幀;SRR,替代遠(yuǎn)程請(qǐng)求位。設(shè)置為1(隱性電平);IDE,標(biāo)識(shí)符選擇位。0,標(biāo)準(zhǔn)標(biāo)識(shí)符;1,擴(kuò)展標(biāo)識(shí)符;r0,r1:保留位。必須以顯現(xiàn)電平發(fā)送,但是接收可以是隱性電平。DLC:數(shù)據(jù)長(zhǎng)度碼。0~8,表示發(fā)送/接收的數(shù)據(jù)長(zhǎng)度(字節(jié))。IDE,標(biāo)識(shí)符選擇位。0,標(biāo)準(zhǔn)標(biāo)識(shí)符;1,擴(kuò)展標(biāo)識(shí)符; ☆ 位時(shí)序分解
為了實(shí)現(xiàn)位同步,CAN協(xié)議把每一個(gè)數(shù)據(jù)位的時(shí)序分解成SS段、PTS段、PBS1段、PBS2段,這四段的長(zhǎng)度加起來(lái)即為一個(gè)CAN數(shù)據(jù)位的長(zhǎng)度。分解后最小的時(shí)間單位是Tq,而一個(gè)完整的位由8~25個(gè)Tq組成。
☆ STM32中的CAN接口
STM32的芯片中具有bxCAN控制器 (Basic Extended CAN),它支持CAN協(xié)議2.0A和2.0B標(biāo)準(zhǔn)。該CAN控制器支持最高的通訊速率為1Mb/s;可以自動(dòng)地接收和發(fā)送CAN報(bào)文,支持使用標(biāo)準(zhǔn)ID和擴(kuò)展ID的報(bào)文;外設(shè)中具有3個(gè)發(fā)送郵箱,發(fā)送報(bào)文的優(yōu)先級(jí)可以使用軟件控制,還可以記錄發(fā)送的時(shí)間;具有2個(gè)3級(jí)深度的接收FIFO,可使用過(guò)濾功能只接收或不接收某些ID號(hào)的報(bào)文;可配置成自動(dòng)重發(fā);不支持使用DMA進(jìn)行數(shù)據(jù)收發(fā)。
1. CAN控制內(nèi)核2. CAN發(fā)送郵箱3. CAN接收FIFO
4. 驗(yàn)收篩選器
STM32有兩組CAN控制器,其中CAN1是主設(shè)備,框圖中的“存儲(chǔ)訪問(wèn)控制器”是由CAN1控制的,CAN2無(wú)法直接訪問(wèn)存儲(chǔ)區(qū)域,所以使用CAN2的時(shí)候必須使能CAN1外設(shè)的時(shí)鐘。
STM32至少配備一個(gè)bxCAN(basic extend can )控制器,支持2.0A和2.0B協(xié)議,最高數(shù)據(jù)傳輸速率可達(dá)1M bps,支持11位標(biāo)準(zhǔn)幀格式和29位擴(kuò)展幀格式的接收和發(fā)送,具備三個(gè)發(fā)送郵箱和兩個(gè)接收FIFO,此wa此外還有三級(jí)可編程濾波器,STM32的bxCAN非常適應(yīng)CAN總線網(wǎng)絡(luò)y網(wǎng)絡(luò)應(yīng)用發(fā)展需求,其主要主要特征如下 :
支持CAN協(xié)議2.0A和2.0B主動(dòng)模式
波特率最高可達(dá)1Mbps
支持時(shí)間觸發(fā)通訊功能
數(shù)據(jù)發(fā)送特性:具備三個(gè)發(fā)送郵箱;發(fā)送報(bào)文的優(yōu)先級(jí)可以通過(guò)軟件配置,可記錄發(fā)送時(shí)間的時(shí)間戳。
數(shù)據(jù)接收特性:具備三級(jí)深度和兩個(gè)接收FIFO;具備可變的過(guò)濾器組,具備可編程標(biāo)識(shí)符列表,可配置FIFO溢出處理方式,記錄接收時(shí)間的時(shí)間戳報(bào)文管理:中斷可屏蔽;郵箱單獨(dú)占有一塊地址空間,便于提高軟件效率。本文的實(shí)驗(yàn)設(shè)計(jì)將利用STM32 的bxCAN控制器的環(huán)回工作模式,實(shí)現(xiàn)bxCAN控制器的自收發(fā)過(guò)程,并使用串口設(shè)備跟蹤監(jiān)視數(shù)據(jù)收發(fā)情況。程序流程如下圖
本程序設(shè)計(jì)主要圍繞bxCAN控制器的初始化初始化配置展開,其要點(diǎn)羅列如下:
1. 初始化RCC寄存器,配置PLL輸出72MHZ時(shí)鐘,APB1總線頻率為36MHZ,分別打開CAN,GPIO和USART1的設(shè)備時(shí)鐘。
2. 設(shè)置CAN的Tx引腳(即PA12)為復(fù)用推挽模式,并設(shè)置Rx引腳(即PA1)為上拉輸入模式,其中三個(gè)重要的參數(shù)如下配置:
CAN_InitStructure.CAN_SJW配置為CAN_SJW_1tq;CAN_InitStructure.CAN_BS1配置為CAN_BS1_8tq;CAN_InitStructure.CAN_BS2配置為CAN_BS2_7tq;
3. 最后分頻數(shù)配置為5,配置接受接受緩沖區(qū)標(biāo)識(shí)符為0x00AA0000,配置過(guò)濾器為32位屏蔽位模式,過(guò)濾器屏蔽標(biāo)識(shí)符為0x00FF0000.
4. 初始化USART設(shè)備
5. 使用擴(kuò)展幀shu幀數(shù)據(jù)格式,ID為0xAA,數(shù)據(jù)長(zhǎng)度長(zhǎng)度為8
STM32的CAN控制器設(shè)計(jì)的重點(diǎn)集中在CAN寄存器組的初始化過(guò)程中,而CAN初始化的重點(diǎn)在于波特率的設(shè)置,過(guò)濾器的設(shè)置和位時(shí)序的設(shè)置,以下作詳細(xì)敘述。
(1)CAN波特率的計(jì)算
計(jì)算波特率是任何一種總線的zhon重要內(nèi)容之一,CAN總線也不例外.從STM32微控制器的官方參考手冊(cè)里可以查找到關(guān)于CAN波特率的計(jì)算公式如下.
通過(guò)配置位時(shí)序寄存器CAN_BTR的TS1[3:0]及TS2[2:0]寄存器位設(shè)定BS1及BS2段的長(zhǎng)度后,就可以確定每個(gè)CAN數(shù)據(jù)位的時(shí)間:
BS1段時(shí)間:
T S1 =Tq x (TS1[3:0] + 1),
BS2段時(shí)間:
T S2 = Tq x (TS2[2:0] + 1),
一個(gè)數(shù)據(jù)位的時(shí)間:
T 1bit =1Tq+T S1 +T S2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)= N Tq
其中單個(gè)時(shí)間片的長(zhǎng)度Tq與CAN外設(shè)的所掛載的時(shí)鐘總線及分頻器配置有關(guān),CAN1和CAN2外設(shè)都是掛載在APB1總線上的,而位時(shí)序寄存器CAN_BTR中的BRP[9:0]寄存器位可以設(shè)置CAN外設(shè)時(shí)鐘的分頻值 ,所以:
Tq = (BRP[9:0]+1) x T PCLK其中的PCLK指APB1時(shí)鐘,默認(rèn)值為36MHz。
最終可以計(jì)算出CAN通訊的波特率:
BaudRate = 1/N Tq程序設(shè)計(jì)要點(diǎn)中強(qiáng)調(diào)的三個(gè)重要參數(shù),其實(shí)是can總線物理層中所要求的位時(shí)序。共三個(gè)階段,分別為SJW,BS1和BS2階段,這三個(gè)階段的時(shí)間長(zhǎng)度都是以長(zhǎng)度為tq的時(shí)間單元為單位的。這樣可以逐步計(jì)算出CAN總線的波特率。因此要點(diǎn)提示中所要求的參數(shù),實(shí)際上將CAN的波特率設(shè)置為450kdps。
過(guò)濾器的設(shè)置
can總線沒(méi)有所謂地址的概念。總線上的每個(gè)報(bào)文都可以被各個(gè)節(jié)點(diǎn)接收。這是一種典型的廣播式網(wǎng)絡(luò)。在實(shí)際應(yīng)用中。某個(gè)節(jié)點(diǎn)往往只希望接收到特定類型的數(shù)據(jù), 這就要借助過(guò)濾器來(lái)實(shí)現(xiàn)。顧名思義,過(guò)濾器的作用就是把節(jié)點(diǎn)不希望接收到的數(shù)據(jù)過(guò)濾掉。只將希望接收到的數(shù)據(jù)給予通行。
stm32的CAN控制器,提供14個(gè)過(guò)濾器。可以設(shè)置為屏蔽模式和列表模式對(duì)can總線上的報(bào)文進(jìn)行過(guò)濾。當(dāng)節(jié)點(diǎn)希望接收到一種報(bào)文時(shí)。可以用屏蔽位模式對(duì)can總線上的報(bào)文進(jìn)行過(guò)濾。反之,當(dāng)節(jié)點(diǎn)希望接受到單一類型報(bào)文時(shí)。則應(yīng)該配置為列表模式。本機(jī)程序中使用了32位的屏蔽位模式。
下面僅對(duì)這種模式進(jìn)行解析。can控制器的每個(gè)過(guò)濾器都具備一個(gè)寄存器。稱為屏蔽寄存器。其中標(biāo)識(shí)符寄存器的每一位都有屏蔽寄存器的每一位所對(duì)應(yīng)。事實(shí)上,這也對(duì)應(yīng)著can數(shù)據(jù)。事實(shí)上,這也對(duì)應(yīng)著看標(biāo)準(zhǔn)數(shù)據(jù)幀中的標(biāo)識(shí)符段。
如下圖所示。此處重點(diǎn)在于屏蔽寄存器的作用。通過(guò)查閱stm32微控制器參考文檔可以知道。當(dāng)過(guò)濾器工作在屏蔽模式下時(shí)。屏蔽寄存器被置為1的每一位都要求can接收到的數(shù)據(jù)幀標(biāo)識(shí)符段必須和對(duì)應(yīng)的接收緩沖區(qū)標(biāo)識(shí)位相同。否則予以濾除。以本程序?yàn)槔Rc(diǎn)中要求將節(jié)點(diǎn)接收緩沖標(biāo)識(shí)符配置為0x00AA0000。過(guò)濾器屏蔽標(biāo)識(shí)符為0x00FF0000。該節(jié)點(diǎn)接收到的數(shù)據(jù)幀的標(biāo)識(shí)符段的位[23:16],必須和接收緩沖區(qū)標(biāo)識(shí)符中的[23:16]匹配。否則予以濾除。但若滿足了這一條件而即便如下的位不匹配。則該數(shù)據(jù)幀仍不會(huì)被濾除。正如本程序而言。即can接口僅僅接收標(biāo)識(shí)符段的位[23:16]為0xAA的數(shù)據(jù)幀.
根據(jù)can總線物理層的要求。can總線的波特率和傳輸距離成反比關(guān)系。傳輸距離變化時(shí),要根據(jù)位時(shí)序來(lái)調(diào)整can總線的波特率。
程序代碼如下:
void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE)
}
void GPIO_for_can_and_uart_Config(void)
{
/*定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*設(shè)置can的RX--pa.11引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*設(shè)置can的TX--pa.12引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*設(shè)置usart1 的RX 腳 -PA.10為父浮空輸入腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Can_Config(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFIM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=5;
CAN_Init(CAN1,&CAN_InitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x00AA<<3;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00FF<<3;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
void main(void)
{
u8 TransmitMailbox=0;
CanTxMsg TxMessage;
CanRxMsg RxMessage;
RCC_Config();
GPIO_for_can_and_uart_Config();
USART_Config();
Can_Config();
TxMessage.ExtId=0x00aa0000;
TxMessage.RTR=CAN_RTR_Data;
TxMessage.IDE=CAN_ID_EXT;
TxMessage.DLC=8;
TxMessage.Data[0]=0x00;
TxMessage.Data[1]=0x12;
TxMessage.Data[2]=0x34;
TxMessage.Data[3]=0x56;
TxMessage.Data[4]=0x78;
TxMessage.Data[5]=0xab;
TxMessage.Data[6]=0xcd;
TxMessage.Data[7]=0xef;
TransmitMailbox=CAN_Transmit(CAN1,&TxMessage);
while((CAN_TransmitStatus(CAN1,TransmitMailbox))!=CANTXOK);
printf('rnThe CAN has send data :0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,rn',
TxMessage.Data[0],TxMessage.Data[1],TxMessage.Data[2],TxMessage.Data[3],
TxMessage.Data[4],TxMessage.Data[5],TxMessage.Data[6],TxMessage.Data[7],);
while((CAN_MessagePending(CAN1,CAN_FIFO0)==0));
RxMessage.StdId=0x00;
RxMessage.IDE=CAN_ID_EXT;
RxMessage.DLC=0;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x12;
RxMessage.Data[2]=0x34;
RxMessage.Data[3]=0x56;
RxMessage.Data[4]=0x78;
RxMessage.Data[5]=0xab;
RxMessage.Data[6]=0xcd;
RxMessage.Data[7]=0xef;
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
printf('rnThe CAN has received data :0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,rn',
RxMessage.Data[0],RxMessage.Data[1],RxMessage.Data[2],RxMessage.Data[3],
RxMessage.Data[4],RxMessage.Data[5],RxMessage.Data[6],RxMessage.Data[7],);
while(1);
}
上一篇:基于無(wú)操作系統(tǒng)的STM32單片機(jī)開發(fā)
下一篇:stm32f103 uart通信簡(jiǎn)析
推薦閱讀最新更新時(shí)間:2025-06-03 08:29



設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無(wú)刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無(wú)線智能控制器的設(shè)計(jì)
- 基于PTR2000的無(wú)線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無(wú)人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 使用 Aimtec 的 AM3G-0505SH30Z 的參考設(shè)計(jì)
- 瀚文分離小板
- FS26安全SBC編程插座板
- STP16CPC26低壓16位恒流LED灌電流驅(qū)動(dòng)器典型應(yīng)用電路
- LTC3119EUFD 12V、2MHz 寬輸入穩(wěn)壓器的典型應(yīng)用電路
- 用于 48V、500W 電動(dòng)自行車/踏板車的 LTC2992CDE 功率監(jiān)視器的典型應(yīng)用
- SI53154-EVB,用于 PoE 無(wú)線接入點(diǎn)的 100 至 210MHz 時(shí)鐘發(fā)生器的評(píng)估板
- LTC3642IDD-5 正負(fù)降壓轉(zhuǎn)換器的典型應(yīng)用電路
- TA8256H 6W x 3ch 音頻功率放大器典型應(yīng)用
- PD70101EVB6FC、基于 PD70101 的 IEEE802.3 Type 1 PD 評(píng)估板控制 5V/1.2A 輸出隔離反激轉(zhuǎn)換器以實(shí)現(xiàn)最小 PSE 功耗
- 瑞薩電子推出32位RX671 MCU,實(shí)現(xiàn)高性能和高能效
- 先楫半導(dǎo)體:HPM6000系列RISC-V通用MCU產(chǎn)品填國(guó)內(nèi)高端MCU空白
- MWC2022:永別了!一代安卓機(jī)皇退場(chǎng) 高管確認(rèn)
- 數(shù)字萬(wàn)用表測(cè)量電容的四個(gè)小方法
- 高壓差分探頭的三大重要指標(biāo)
- 韓國(guó)撤回就日本限制半導(dǎo)體材料出口向WTO所提申訴
- 尼得科機(jī)床在中國(guó)開啟齒輪機(jī)床和刀具的一站式供應(yīng)
- Rambus提升GDDR6帶寬,以應(yīng)對(duì)邊緣計(jì)算挑戰(zhàn)
- 華為余承東:鴻蒙智能駕駛領(lǐng)先行業(yè),2026年實(shí)現(xiàn)L4自動(dòng)駕駛
- 深圳發(fā)布全國(guó)首個(gè)全域開放自動(dòng)駕駛技術(shù)指引
- 接近L4級(jí) 無(wú)人駕駛特斯拉Model Y上路測(cè)試
- 緊急自動(dòng)靠邊停車系統(tǒng)AEP是如何工作的?
- 整合智能戰(zhàn)線,奇瑞智能化轉(zhuǎn)型走向輔助駕駛和座艙的大一統(tǒng)
- 香港科技大學(xué)開發(fā)出新型F3T傳感器 為機(jī)器人觸覺感知帶來(lái)突破
- 研究人員開發(fā)鋰沉積行為調(diào)控策略 提高全固態(tài)電池的性能和循環(huán)壽命
- 億緯鋰能瞄準(zhǔn)2026,布局全固態(tài)電池生產(chǎn)工藝突破
- 人形機(jī)器人產(chǎn)業(yè)標(biāo)準(zhǔn)互認(rèn)計(jì)劃啟動(dòng);地瓜機(jī)器人完成1億美元的A輪融資
- 中國(guó)廠商主導(dǎo)全球新能源汽車電池市場(chǎng),寧德時(shí)代穩(wěn)居首位
- 從機(jī)器人技術(shù)壁壘到共享工廠看埃夫特的智能化之路
- 三星高管:未來(lái)幾月將發(fā)布多款A(yù)R和VR產(chǎn)品
- 兆易創(chuàng)新首款自有品牌DRAM產(chǎn)品正式發(fā)布
- iOS 13 將開放 iPhone 更多 NFC 功能
- 大聯(lián)大品佳集團(tuán)推出基于Audiowise PAU1818的TWS藍(lán)牙耳機(jī)方案
- 索尼新名字啟用
- 索尼官宣將在4月14日公布下一代Xperia手機(jī)
- 示波器探頭基本知識(shí)
- 抖動(dòng)測(cè)量-示波器基礎(chǔ)知識(shí)
- 飛思卡爾s12系列CAN波特率計(jì)算
- Android手機(jī)DIY活動(dòng)即將開始!(在北郵啊)
- 基于Proteus的MSP430單片機(jī)仿真實(shí)例5-16個(gè)花樣燈控制
- 關(guān)于保險(xiǎn)絲的選用原則,大家也來(lái)談?wù)剘~
- 職場(chǎng)人必讀的文字--只花10分鐘影響你一輩子!
- USCI 的UART超級(jí)終端人機(jī)交互
- pxa270 flash eboot
- TI中國(guó)嵌入式教育者會(huì)議
- 讓struct飛一會(huì)兒
- 奇特發(fā)明:空中漂浮裝置問(wèn)世
- 寧波中緯現(xiàn)場(chǎng):巨虧拖累比亞迪的芯片項(xiàng)目真實(shí)狀況