娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

STM32中CAN總線接口發(fā)送和接收數(shù)據(jù)

發(fā)布者:SerendipityGlow最新更新時(shí)間:2024-03-26 來(lái)源: elecfans關(guān)鍵字:STM32  CAN總線接口  發(fā)送  接收數(shù)據(jù) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

☆ 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ò)409c8e00-a4d9-11ec-952b-dac502259ad0.jpg

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ò)

40b0dd9c-a4d9-11ec-952b-dac502259ad0.jpg

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。

40bef288-a4d9-11ec-952b-dac502259ad0.jpg


☆ 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)圖:

40d83a90-a4d9-11ec-952b-dac502259ad0.png圖中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組成。

40f7d45e-a4d9-11ec-952b-dac502259ad0.png


☆ 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ā)。

4110b67c-a4d9-11ec-952b-dac502259ad0.jpg

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ā)情況。程序流程如下圖

4125a906-a4d9-11ec-952b-dac502259ad0.png

本程序設(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í)符段。

如下圖所示。415a97c4-a4d9-11ec-952b-dac502259ad0.png此處重點(diǎn)在于屏蔽寄存器的作用。通過(guò)查閱stm32微控制器參考文檔可以知道。當(dāng)過(guò)濾器工作在屏蔽模式下時(shí)。屏蔽寄存器被置為1的每一位都要求can接收到的數(shù)據(jù)幀標(biāo)識(shí)符段必須和對(duì)應(yīng)的接收緩沖區(qū)標(biāo)識(shí)位相同。否則予以濾除。以本程序?yàn)槔Rc(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總線的波特率。

41791582-a4d9-11ec-952b-dac502259ad0.png

4192b352-a4d9-11ec-952b-dac502259ad0.jpg

程序代碼如下:

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);

 

 

}


關(guān)鍵字:STM32  CAN總線接口  發(fā)送  接收數(shù)據(jù) 引用地址:STM32中CAN總線接口發(fā)送和接收數(shù)據(jù)

上一篇:基于無(wú)操作系統(tǒng)的STM32單片機(jī)開發(fā)
下一篇:stm32f103 uart通信簡(jiǎn)析

推薦閱讀最新更新時(shí)間:2025-06-03 08:29

STM32單片機(jī)串口空閑中斷+DMA接收不定長(zhǎng)數(shù)據(jù)
在上一篇文章STM32單片機(jī)串口空閑中斷接收不定長(zhǎng)數(shù)據(jù)中介紹了利用串口空閑中斷接收不定長(zhǎng)數(shù)據(jù),這種方式有一個(gè)問(wèn)題就是串口每接收到一個(gè)字節(jié)就會(huì)進(jìn)入一次中斷,如果發(fā)送的數(shù)據(jù)比較頻繁,那么串口中斷就會(huì)不停打斷主程序運(yùn)行,影響系統(tǒng)運(yùn)行。那么能不能在串口接收數(shù)據(jù)過(guò)程中不要每接收一個(gè)數(shù)據(jù)中斷一次,只有在一幀數(shù)據(jù)接收結(jié)束完成后只中斷一次? 用串口的空閑中斷加上DMA功能,就可以實(shí)現(xiàn)每幀數(shù)據(jù)接收完成后只中斷一次,而在數(shù)據(jù)接收過(guò)程中,由DMA存儲(chǔ)串口接收到的每個(gè)字節(jié)。 關(guān)于串口的空閑檢測(cè)和DMA在STM32參考手冊(cè)中有詳細(xì)介紹。 下面看如何初始化串口空閑中斷和 DMA。 void uart2_init( u16 baud )
[單片機(jī)]
<font color='red'>STM32</font>單片機(jī)串口空閑中斷+DMA<font color='red'>接收</font>不定長(zhǎng)<font color='red'>數(shù)據(jù)</font>
STM32 USB數(shù)據(jù)發(fā)送完成的識(shí)別方法
1 if (GetEPTxStatus(ENDP1) == EP_TX_NAK) 則認(rèn)為發(fā)送完成了 2 可以在相應(yīng)端點(diǎn)的回調(diào)函數(shù)中,作相應(yīng)的標(biāo)志 void EP1_IN_Callback(void) { sUSB.in = 0; }
[單片機(jī)]
STM32-串口超時(shí)判斷方式接收未知長(zhǎng)度數(shù)據(jù)
usart.c串口中斷處理函數(shù): void USART1_IRQHandler(void) { u8 res; if(USART1- SR&(1 5))//接收到數(shù)據(jù) { res=USART1- DR; if(USART1_Recv_LenCV_LEN) //還可以接收數(shù)據(jù) { TIM3- CNT=0; //計(jì)數(shù)器清空 if(Rec_Over_Flag==0)TIM3_Set(1); //使能定時(shí)器4的中斷 USART1_RX_BUF =res; //記錄接收到的值
[單片機(jī)]
MSP430單片機(jī)在微型低功耗數(shù)據(jù)廣播接收機(jī)中的應(yīng)用
一、 引言 我們獨(dú)立自主開發(fā)了數(shù)據(jù)廣播編碼器和微型低功耗調(diào)頻數(shù)據(jù)廣播接收機(jī),整套系統(tǒng)采用連續(xù)相位頻移鍵控(CPFSK)調(diào)制方式,副載波頻率為72KHz,占用帶寬約16Khz,數(shù)據(jù)傳輸速率4.8KHZ。采用CPFSK調(diào)制方式使接收機(jī)易于實(shí)現(xiàn),與QPSK的調(diào)制方式相比對(duì)相位穩(wěn)定度要求不高,不易受外界溫度噪聲的影響,而且在信號(hào)解調(diào)處理時(shí)實(shí)現(xiàn)低功耗。 由于在發(fā)送端先后進(jìn)行了數(shù)據(jù)編碼、信道調(diào)制、線性調(diào)頻,所以接收設(shè)備要完成信號(hào)逆處理。硬件結(jié)構(gòu)框圖: 二、MSP430單片機(jī)的特點(diǎn)及在接收機(jī)中的應(yīng)用 TI公司MSP430系列單片機(jī)的超低功耗特性(運(yùn)行在1MHz時(shí)鐘條件下工作電流視工作模式不同為0.1-400uA)
[單片機(jī)]
MSP430單片機(jī)在微型低功耗<font color='red'>數(shù)據(jù)</font>廣播<font color='red'>接收</font>機(jī)中的應(yīng)用
泰克“全內(nèi)置”串行數(shù)據(jù)接收機(jī)測(cè)試方案
  泰克日前推出SerialXpress?高級(jí)軟件。這種新軟件為高速串行數(shù)據(jù)接收機(jī)測(cè)試直接合成波形,特別適合測(cè)試SATA、SAS、PCI-Express、HDMI和DisplayPort串行數(shù)據(jù)標(biāo)準(zhǔn)及工作速率在6 Gbps以下的任何其它串行總線技術(shù)。SerialXpress管理這些波形的創(chuàng)建工作,然后在AWG7000系列任意波形發(fā)生器上高速傳送波形。裝有SerialXpress軟件的AWG7000是世界上唯一的用于接收機(jī)極限測(cè)試和BER測(cè)試的全內(nèi)置高速串行數(shù)據(jù)信號(hào)發(fā)生器。使用戶不再需要使用多臺(tái)儀器和復(fù)雜的測(cè)試配置來(lái)進(jìn)行測(cè)試。   3 - 6 Gb/s的下一代高速串行標(biāo)準(zhǔn)縮小了定時(shí)余量,從而要求進(jìn)行從接收機(jī)檢定到輔助傳統(tǒng)發(fā)射機(jī)的測(cè)
[測(cè)試測(cè)量]
泰克“全內(nèi)置”串行數(shù)據(jù)接收機(jī)測(cè)試方案
  泰克日前推出SerialXpress?高級(jí)軟件。這種新軟件為高速串行數(shù)據(jù)接收機(jī)測(cè)試直接合成波形,特別適合測(cè)試SATA、SAS、PCI-Express、HDMI和DisplayPort串行數(shù)據(jù)標(biāo)準(zhǔn)及工作速率在6 Gbps以下的任何其它串行總線技術(shù)。SerialXpress管理這些波形的創(chuàng)建工作,然后在AWG7000系列任意波形發(fā)生器上高速傳送波形。裝有SerialXpress軟件的AWG7000是世界上唯一的用于接收機(jī)極限測(cè)試和BER測(cè)試的全內(nèi)置高速串行數(shù)據(jù)信號(hào)發(fā)生器。使用戶不再需要使用多臺(tái)儀器和復(fù)雜的測(cè)試配置來(lái)進(jìn)行測(cè)試。   3 - 6 Gb/s的下一代高速串行標(biāo)準(zhǔn)縮小了定時(shí)余量,從而要求進(jìn)行從接收機(jī)檢定到輔助傳統(tǒng)發(fā)射機(jī)的測(cè)
[新品]
STM8L101F3P6串口查詢發(fā)送
先說(shuō)幾句,一直都沒(méi)有對(duì)STM8的串口應(yīng)用進(jìn)行總結(jié),最近小結(jié)一下。STM8應(yīng)用庫(kù)來(lái)開發(fā),在基本的串口的應(yīng)用上,我自己的理解現(xiàn)在還很不到位。我本以為STM8的串口也會(huì)有查詢發(fā)送、中斷發(fā)送、查詢接收、中斷接收這樣幾種方法呢~!可事實(shí)上我現(xiàn)在對(duì)于中斷發(fā)送這路模式還沒(méi)太搞明白,與51單片機(jī)的串口工作還是有區(qū)別的。 STM8提供了發(fā)送中斷和發(fā)送完中斷,我自己的理解是,在發(fā)送時(shí)進(jìn)入中斷和發(fā)送一個(gè)字節(jié)完成時(shí)進(jìn)行中斷。這與我大腦中理解的串口中斷還是不一樣的,回頭要繼續(xù)把這里搞明白。 一般情況下,STM8的串口多數(shù)是用查詢發(fā)送,中斷接收,這樣來(lái)做。使用串口前要如下幾點(diǎn): 1.配置TX和RX的GPIO管腳狀態(tài) 2.初始化串口,這里要打開
[單片機(jī)]
STM32F429(HAL庫(kù))_USART串口發(fā)送&接收(使用STM32CubeMX)
一、HAL庫(kù)相關(guān)函數(shù) 1、串口發(fā)送/接收函數(shù) HAL_UART_Transmit();串口輪詢模式發(fā)送,使用超時(shí)管理機(jī)制 HAL_UART_Receive();串口輪詢模式接收,使用超時(shí)管理機(jī)制 HAL_UART_Transmit_IT();串口中斷模式發(fā)送 HAL_UART_Receive_IT();串口中斷模式接收 HAL_UART_Transmit_DMA();串口DMA模式發(fā)送 HAL_UART_Transmit_DMA();串口DMA模式接收 2、串口中斷函數(shù) HA
[單片機(jī)]
STM32F429(HAL庫(kù))_USART串口<font color='red'>發(fā)送</font>&<font color='red'>接收</font>(使用STM32CubeMX)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 开江县| 健康| 桦南县| 甘孜县| 柞水县| 竹溪县| 平山县| 黔东| 土默特左旗| 惠水县| 略阳县| 温宿县| 丹寨县| 大新县| 太白县| 隆昌县| 阳山县| 连平县| 杭锦后旗| 邯郸市| 乌兰浩特市| 山东省| 临泉县| 赤峰市| 彭阳县| 达州市| 虎林市| 伊宁市| 贵港市| 南京市| 汝州市| 鄂尔多斯市| 宣化县| 阳西县| 滦平县| 民县| 内丘县| 西峡县| 渭南市| 德阳市| 黑山县|