《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 業界動態 > 汽車ECU標定系統CAN驅動模塊的實現

汽車ECU標定系統CAN驅動模塊的實現

2016-05-26

1  前言

        標定是指根據整車的各種性能要求(如動力性、經濟性、排放及輔助功能等),來調整、優化和確定整車上各ECU(如發動機、AT等各子系統 ECU)控制參數的控制算法。標定系統主要是由上位機和底層ECU這二部分組成,因此,上位機和底層ECU的通信方式對整個標定系統的性能起到了至關重要的作用。目前,一般的標定系統都是采用基于串行口的點對點的通信方式,這種通信方式容易實現,但存在著通信速度較慢、可靠性較低等缺陷。這里我們采用的是CAN總線的通信方式,相對串口通信,基于CAN總線的通信方式具有通信可靠[1]、傳輸速度快、可實現在線編程等優點。

2  總體設計

       CAN通信可視為系統的一個I/O字符流設備[3],它在完成普通收發功能的同時,還要能實現驅動程序必備的設備無關性。即驅動程序應將系統所有的硬件特性封裝起來,為使用該設備的應用程序提供與硬件無關的、通用的編程接口,應用層程序編寫人員無需了解設備的原理,即可順利實現對設備的控制,通過該設備實現可靠的數據交換。另外,針對CAN通信和嵌入式系統的實時性要求,該驅動程序要求收發數據代碼可靠,延遲短,占用系統時間短,中斷執行時間短,關閉中斷時間短,并在收發錯誤和發生異常情況時,向應用程序匯報。另外,該驅動程序需要監控CAN控制器的工作狀態,在出現致命錯誤和脫離總線時,為CAN模塊復位,并向系統匯報。

圖1 驅動程序總體結構圖

       基于以上需求分析,結合其他OS中實現I/O串行設備的驅動方案及CAN的總線要求特點,設計總體驅動程序結構如圖1。   

3  CAN驅動模塊的實現

       基于以上總體設計框架,首先定義一個CAN類來封裝CAN通信中的數據結構和函數,最下面一層為中斷級程序,中斷處理程序在每次CAN控制器完成收發時,喚醒驅動程序,進行下一步工作。在中斷處理程序中,根據不同的中斷向量來確定當前發生的是發送完成中斷還是接受完成中斷,并完成相應工作。中間一層為底層驅動程序,底層驅動程序主要是通過對CAN控制器寄存器的讀寫,完成對CAN端口的配置和狀態檢測等工作,同時為設備無關軟件和用戶程序提供接口。在這一層中,必須要建立一個環狀緩沖結構,該緩沖由一個接收環狀緩沖區和一個發送環狀緩沖區組成,其數據結構如下代碼所示,對于每個環狀緩沖區,設計了一個存入指針指向下一個待存入CANMsg的存入地址,一個讀出指針指向緩沖區下一個待取出的(最舊的)CANMsg的地址,一個計數器記錄目前緩沖區中有多少個CANMsg待取出,一個信號量,用于與應用程序交換消息。接收環狀緩沖區用于緩沖接收到的總線消息,等待應用程序處理,發送環狀緩沖區用于緩沖應用程序發送出的消息,等待發送中斷程序來處理。

typedef struct{   //環形緩沖區的數據結構

INT16U   RingBufRxCtr;       //接收計數器

OS_EVENT *RingBufRxSem;    //信號量

CAN_msg  *RingBufRxInPtr;    //接收緩沖區的存入指針

CAN_msg  *RingBufRxOutPtr;  //接收緩沖區的讀出指針

CAN_msg  RingBufRx[CAN_RX_BUF_SIZE];  //接收緩沖區的消息存儲

INT16U   RingBufTxCtr;  //發送計數器

OS_EVENT *RingBufTxSem;

CAN_msg  *RingBufTxInPtr;    //發送緩沖區的存入指針

CAN_msg  *RingBufTxOutPtr;  //發送緩沖區的讀出指針

CAN_msg  RingBufTx[CAN_TX_BUF_SIZE];  //發送緩沖區的消息存儲

}CAN_RING_BUF;

 3.1 底層驅動

       底層驅動模塊為我們應用程序提供了接收和發送消息的接口函數。

圖2  CAN接收消息

       當接收消息時[3],如圖2所示,應用程序在信號量處等待;收到一個消息后,ISR從串行端口讀入消息,將其存入環型緩沖區。然后ISR發出信號量,通知在等待串口數據的任務已收到一個消息。等待任務收到信號量后,進入就緒狀態,準備被OS調度器激活。當內核調度該任務運行時,該任務從環狀緩沖區中取出消息,完成接收消息的過程。

void CAN_GetMsg(CAN_msg *msg){

INT8U   oserr;

OS_CPU_SR cpu_sr;

CAN_RING_BUF *pbuf;

pbuf = &ringbuf;

OSSemPend(pbuf->RingBufRxSem,0,&oserr);   //等待信號量

OS_ENTER_CRITICAL();//關中斷

pbuf->RingBufRxCtr--;//接收計數器減1

CopyMsg(pbuf->RingBufRxOutPtr++,msg); //從環形緩沖區中取出信號量         

if(pbuf->RingBufRxOutPtr==&pbuf->RingBufRx[CAN_RX_BUF_SIZE]) {pbuf->RingBufRxOutPtr= &pbuf->RingBufRx[0];

//如果環形緩沖區的讀出指針達到緩沖區的最末端,將其改為指向緩沖區的首地址  }

OS_EXIT_CRITICAL();  //開中斷,允許CPU響應中斷   }

        發送CAN消息與接受消息類似。后臺進程將欲發送的消息幀存儲于發送環狀緩沖區中。當CAN端口準備發送一幀消息時,產生一個中斷,CAN消息從緩沖區中取出,并由ISR輸出[4]。但其中出現了一個問題:CAN端口只能在發送上一個數據結束的時候才會產生一個中斷,這個產生中斷的時刻與我們需要執行中斷任務的時間是不一致的。解決這個問題的方法就是,禁止發送端中斷使能直到需要再發送消息為止。在系統啟動時,禁止發送中斷,發送一個啟動消息幀,這時發送完成中斷標志位已經被置位,但由于發送中斷使能位為低,所以無法發生中斷,系統繼續執行。當需發送第一個消息時,將該消息放入發送環狀緩沖區,然后運行發送中斷,這時,上一次發送消息完成中斷產生,發送該消息。在發送消息結束時,若發送環狀緩沖區中有其他數據需要發送,則清中斷源,等待該消息發送完成中斷產生,來發送下一個消息,若沒有其他數據需要被發送,則直接禁止發送中斷,將該消息發送完成時產生的中斷保留到下一次有消息需要發送時發生。

圖3  CAN發送消息

       發送消息的方法如圖3。當發送環狀緩沖區已滿時,信號量作為指示,暫停發送任務。發送消息時,任務等待信號量。如果環狀緩沖區未滿,則任務繼續向環狀緩沖區存儲欲發送的消息。如果存儲的消息是緩沖區第一個字節,則發送中斷允許,中斷程序準備啟動。CAN發送ISR從環行緩沖區中取出最舊的消息,同時發送信號量,通知發送任務,表明環狀緩沖區有空間接收另外的消息,接著ISR將消息從發送到總線上。其實現代碼如下所示:

void CAN_PutMsg(CAN_msg *msg) {

INT8U oserr;

OS_CPU_SR cpu_sr;

CAN_RING_BUF *pbuf;

pbuf = &ringbuf;

OSSemPend(pbuf->RingBufTxSem, 0, &oserr);   //等待信號量

OS_ENTER_CRITICAL();//關中斷

pbuf->RingBufTxCtr++;   //發送計數器加1

CopyMsg(msg, pbuf->RingBufTxInPtr++);  //將消息放入環形緩沖區

if(pbuf->RingBufTxInPtr==&pbuf->RingBufTx[CAN_TX_BUF_SIZE]) {pbuf->RingBufTxInPtr=&pbuf->RingBufTx[0];

     }

if (pbuf->RingBufTxCtr==1) {

     CAN_TxIntEn();//為環形緩沖區的第一則消息,開發送中斷

     }

     OS_EXIT_CRITICAL();

}

3.2 中斷服務程序

       根據前面談到發送和接收消息的軟件結構,在CAN初始化時就要求CAN的接收中斷處入開啟狀態,而發送中斷僅僅是在發送緩沖區里面有了第一則消息后再開啟的,因此在這里設計兩個接口函數,CAN.TxIntEn()和CAN.TxIntDis(),分別將發送屏蔽位置1(允許發送完成中斷)和置0(禁止發送完成中斷)。

圖4  發送接收中斷程序流程圖

        中斷級程序的核心就是CANRX_ISR()和CANTX_ISR(),它們由初始化時對該模塊的中斷設置寄存器設置的中斷級別。如圖4所示,若為接收完成中斷,則清除中斷源,將接收到的消息放入接收緩沖區;將該消息存入接收緩沖區存入指針所指向的地址,將該指針向下移動,接收緩沖區計數器加1,并發出信號量通知應用程序有新的消息已經接收到,若有任務正在等待CAN上的新消息,則該任務進入就緒狀態等待OS的調度。若為發送完成中斷,則將發送緩沖區的待發送消息讀出;將有待發送消息且優先級最高的一個中讀取最舊的消息(緩沖區取出指針所指向的消息),發送緩沖區計數器減1,發出信號量通知應用程序有一個消息被發出,并匯報當前發送緩沖區的狀態;還應判斷是否為最后一個待發送的消息,若不是,則清除中斷源并將消息發送到總線上,若是最后一個,則禁止發送完成中斷后發送該消息,將這個發送完成中斷保留到應用程序下一次發送消息的時候允許并產生。

3.3 應用

       該驅動程序的應用,如下代碼所示,這里使用的是uCOS-II,首先定義一個CAN消息對象(msg)和一個環狀緩沖區數據結構(CANRingBuf),在主程序中,初始化OS以后調用Ringbuf_Init()函數初始化環形緩存區,然后調用CAN_Init()函數初始化CAN端口。在啟動OS后,用戶就可用在任何任務中調用CAN_PutMsg(CAN_msg *msg)和CAN_GetMsg(CAN_msg *msg)發送和接收總線消息了。

CAN_msg msg;

CAN_RING_BUF CANRingBuf;

void main(void) { 

OSInit();

Ringbuf_Init();

CAN_Init();

/* Creat task1 */

       OSStart();    }

void task1 (void * data)

{     CAN_PutMsg(&msg);

CAN_GettMsg(&msg);

}

4  結束語

       通過改變芯片總線頻率、CAN通信速率這樣多次反復不斷的調試,此CAN驅動在實時操作系統上運行穩定可靠,未出現數據丟失,較好的實現了上位機與ECU的通信,因此,具有很強的實用價值。


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美精品久久久久久久| 中文国产成人精品久久一| 国自产拍偷拍福利精品免费一| 亚洲国产日韩一区二区| 亚洲国产精品va| 欧美日韩国产免费观看| 欧美激情第五页| 欧美国产日韩a欧美在线观看| 国产区精品在线观看| 国产亚洲欧美一区二区| 久久久久久久久久久一区| 欧美视频在线观看一区| 欧美一级久久久| 国产精品视频你懂的| 亚洲欧洲在线观看| 国产毛片精品视频| 在线亚洲免费| 国产农村妇女精品一区二区| 亚洲黄色在线视频| 欧美在线亚洲| 欧美怡红院视频一区二区三区| 欧美一级精品大片| 国产欧美三级| 1000精品久久久久久久久| 曰韩精品一区二区| 欧美91精品| 最近中文字幕日韩精品| 在线观看一区视频| 欧美一级在线视频| 国产酒店精品激情| 久久永久免费| 亚久久调教视频| 欧美大香线蕉线伊人久久国产精品| 精品av久久707| 欧美午夜精品理论片a级大开眼界| 在线播放不卡| 国语自产精品视频在线看8查询8| 国产精品视频yy9299一区| 欧美视频专区一二在线观看| 国外成人免费视频| 欧美一区二区在线免费播放| 激情成人中文字幕| 亚洲影院色无极综合| 欧美午夜精品久久久久久久| 国产精品一二三四| 久久久www成人免费无遮挡大片| 国产欧美精品在线| 国产伦精品一区二区三区高清| 午夜精品久久久久久99热软件| 久久国产精品久久国产精品| 亚洲人成啪啪网站| 欧美手机在线视频| 欧美在线免费观看亚洲| 久久久一区二区三区| 久久久www成人免费精品| 国产欧美日韩一区二区三区| 国产精品麻豆欧美日韩ww| 欧美成人精品激情在线观看| 久热精品视频| 欧美日韩亚洲在线| 午夜欧美精品| 91久久香蕉国产日韩欧美9色| 久久久久成人精品免费播放动漫| 欧美韩日一区二区三区| 欧美特黄a级高清免费大片a级| 欧美伦理91i| 激情成人av在线| 亚洲综合好骚| 日韩亚洲欧美高清| 久久久水蜜桃av免费网站| 亚洲激情网址| 欧美另类在线观看| 国产欧美综合一区二区三区| 欧美高清视频一二三区| 国产一区二区福利| 亚洲一区二区三区四区五区黄| 一区二区毛片| 欧美不卡视频一区发布| 亚洲黄色性网站| 久久中文字幕导航| 亚洲第一精品影视| 午夜精品国产更新| 国产一区二区视频在线观看| 久久综合狠狠综合久久激情| 亚洲国产精品久久久久秋霞不卡| 影音先锋亚洲精品| 尤物九九久久国产精品的分类| 亚洲男人的天堂在线aⅴ视频| 亚洲三级视频在线观看| 欧美伊人久久久久久久久影院| 亚洲国产中文字幕在线观看| 在线观看亚洲视频啊啊啊啊| 久久一日本道色综合久久| 欧美日本成人| 一本色道久久88综合日韩精品| 欧美人与性禽动交情品| 欧美中日韩免费视频| 国产一区深夜福利| 欧美国产一区二区在线观看| 国产日本亚洲高清| 国产精品99久久不卡二区| 欧美一区二区三区视频在线| 一本色道久久综合亚洲精品按摩| 精品成人一区二区三区四区| 久久精品国产亚洲高清剧情介绍| 欧美va亚洲va香蕉在线| 欧美在线一区二区三区| 亚洲无线一线二线三线区别av| 欧美成人一区二区三区在线观看| 国产精品色婷婷| 久久国产视频网| 国产三区精品| 亚洲欧美激情诱惑| 久久精品国产亚洲一区二区三区| 久久99在线观看| 欧美一区二区三区在线观看| 国产午夜精品美女毛片视频| 欧美日韩八区| 欧美精品导航| 国内精品久久久久久| 久久综合久久美利坚合众国| 欧美日韩国产首页| 国产精品伦子伦免费视频| 欧美色中文字幕| 欧美好吊妞视频| 国产精品视频yy9299一区| 国产精品乱子久久久久| 国产欧美日韩不卡免费| 一区二区欧美在线观看| 国产亚洲网站| 欧美日韩另类一区| 欧美成人有码| 国产精品久久久久久久久婷婷| 欧美女激情福利| 男女激情久久| 宅男噜噜噜66国产日韩在线观看| 91久久久久| 亚洲欧洲另类国产综合| 日韩一级视频免费观看在线| 国产精品久久久久久影院8一贰佰| 欧美在线一区二区三区| 欧美护士18xxxxhd| 国产欧美综合一区二区三区| 亚洲高清不卡| 久久免费视频在线| 国产精品av久久久久久麻豆网| 亚洲美女啪啪| 伊甸园精品99久久久久久| 亚洲精品在线电影| 欧美激情精品久久久六区热门| 美女视频一区免费观看| 欧美日韩大片一区二区三区| 久久久久女教师免费一区| 欧美体内she精视频在线观看| 亚洲一区二区三区777| 亚洲在线成人精品| 久久久亚洲成人| 亚洲精品人人| 久久狠狠一本精品综合网| 夜夜狂射影院欧美极品| 欧美日韩亚洲一区二| 美乳少妇欧美精品| 中国成人黄色视屏| 在线视频一区观看| 在线亚洲观看| 国产精品va在线| 欧美成人精品一区二区| 亚洲第一久久影院| 欧美成人精品高清在线播放| 这里只有精品丝袜| 一本色道久久综合狠狠躁的推荐| 亚洲一区二区在| 欧美日韩国产色站一区二区三区| 激情成人av在线| 国产欧美日韩另类视频免费观看| 一本色道久久综合亚洲精品高清| 欧美尤物一区| 欧美精品亚洲| 欧美午夜www高清视频| 欧美成人第一页| 亚洲欧美另类综合偷拍| 亚洲婷婷综合久久一本伊一区| 久久精品道一区二区三区| 久久精品99无色码中文字幕| 欧美激情一区二区三区四区| 欧美伊久线香蕉线新在线| 亚洲日韩视频| 国产精品免费看| 性视频1819p久久| 欧美黄色成人网| 亚洲欧美另类久久久精品2019| 欧美日韩妖精视频| 亚洲美女精品久久| 国产日韩欧美夫妻视频在线观看| 亚洲电影视频在线| 99国产精品国产精品毛片| 性久久久久久久久久久久| 欧美精品二区三区四区免费看视频| 午夜日韩在线观看| 久久动漫亚洲| 亚洲精品乱码久久久久久黑人| 欧美一区二区在线观看| 久久久午夜视频| 1769国内精品视频在线播放| 亚洲国产精品欧美一二99| 欧美二区乱c少妇| 亚洲午夜久久久久久久久电影院| 国产精品久久久久9999高清| 欧美在线免费播放| 欧美不卡三区| 久久久久一区二区三区| 国产一区二区欧美| 一区二区视频免费完整版观看| 欧美成人资源| 影音欧美亚洲| 欧美一区二区在线免费播放| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲黄色免费网站| 在线日韩av片| 国产精品中文字幕在线观看| 久久精品二区亚洲w码| 欧美精品一区三区在线观看| 一区二区免费在线观看| 亚洲免费影视第一页| 欧美视频官网| 欧美精品国产| 欧美猛交免费看| 亚洲视频中文字幕| 国产精品理论片| 国产精品影音先锋| 国产亚洲福利| 9色国产精品| 欧美刺激性大交免费视频| 欧美粗暴jizz性欧美20| 久久久久久久久久码影片| 欧美一级理论性理论a| 亚洲欧美日韩在线观看a三区| 欧美亚州一区二区三区| 国产亚洲精品久久飘花| 亚洲男人av电影| 久久久久久久久久看片| 国产精品中文在线| 美女精品视频一区| 欧美亚洲一区三区| 国产日本欧美一区二区三区| 久久综合狠狠综合久久综合88| 久久综合国产精品台湾中文娱乐网| 欧美亚洲在线| 国产精品久线观看视频| 国产精品人成在线观看免费| 一区二区亚洲精品国产| 久久青青草原一区二区| ●精品国产综合乱码久久久久| 久久久久久久一区| 欧美日韩一卡| 麻豆久久精品| 国产一区二区三区电影在线观看| 亚洲精品一区二区三| 久久国产精品一区二区三区四区| 国产精品久久久久99| 影音先锋久久资源网| 国产日韩欧美在线| 国产一区二区三区四区老人| 久久精品免费看| 亚洲国产综合在线看不卡| 欧美华人在线视频| 一区二区福利| 久久久久看片| 亚洲日韩视频| 一区二区三区四区国产精品| 亚洲精品在线一区二区| 亚洲经典自拍| 日韩视频在线观看一区二区| 亚欧美中日韩视频| 欧美高清视频| 久久精品视频免费| 亚洲欧美日韩久久精品| 在线观看欧美日本| 国产视频一区在线| 国产日韩欧美不卡在线| 午夜性色一区二区三区免费视频| 久久精品青青大伊人av| 99精品欧美| 欧美伊人久久大香线蕉综合69| 亚洲综合色激情五月| 欧美精品一区二区三| 国产美女一区二区| 一区二区三区波多野结衣在线观看| 欧美一区二区大片| 先锋资源久久| 一本色道久久88综合亚洲精品ⅰ| 亚洲日韩视频| 亚洲欧美www| 久久夜色精品国产亚洲aⅴ| 亚洲夫妻自拍| 国内免费精品永久在线视频| 国产精品热久久久久夜色精品三区| 最新中文字幕一区二区三区| 国产色综合天天综合网| 久久精选视频| 亚洲欧洲偷拍精品| 99pao成人国产永久免费视频| 一区二区三区视频观看| 国产一区二区久久| 99热免费精品| 免费在线欧美黄色| 男人插女人欧美| 亚洲欧美欧美一区二区三区| 亚洲欧美另类在线观看| 久久夜色精品国产欧美乱极品| 亚洲国产专区校园欧美| 欧美成人免费大片| 亚洲欧美日韩国产中文| 黄色一区二区三区| 国产自产女人91一区在线观看| 久久丁香综合五月国产三级网站| 亚洲美女av网站| 久久免费偷拍视频| 欧美伦理一区二区| 国产在线精品一区二区夜色| 欧美成人一区二区三区| 欧美精品福利在线| 日韩一级精品视频在线观看| 久久尤物视频| 欧美日韩国产首页在线观看| 一本一道久久综合狠狠老精东影业| 亚洲第一精品电影| 一本色道久久综合狠狠躁篇的优点|