亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于嵌入式操作系統(tǒng)VxWorks的I2C總線驅(qū)動設(shè)計※*

        2015-09-12 06:42:40盧慧慧袁玉湘
        關(guān)鍵詞:驅(qū)動程序字節(jié)寄存器

        盧慧慧,袁玉湘

        (國網(wǎng)智能電網(wǎng)研究院 電工新材料及微電子研究所,北京102211)

        盧慧慧(工程師),主要研究方向為嵌入式軟件、信號處理等;袁玉湘(高級工程師),主要研究方向為集成電路、嵌入式軟件。

        引 言

        近幾年,嵌入式系統(tǒng)在很多領(lǐng)域都得到了廣泛應(yīng)用。VxWorks是Wind River公司開發(fā)的嵌入式操作系統(tǒng),具有高性能、可高度裁減等特點,能夠支持多種微處理器,如PowerPC、X86、ARM、MIPS等。隨著我國經(jīng)濟的快速發(fā)展,電力需求快速增長。在電力系統(tǒng)中考慮到通信方式的多元化要求以及智能電網(wǎng)發(fā)展的不確定性,要保證系統(tǒng)開發(fā)的可持續(xù)性及可擴展性,電能質(zhì)量監(jiān)測、智能電網(wǎng)調(diào)度、繼電保護等電力行業(yè)場景需要高實時性、高可靠度的操作系統(tǒng)來保證通信的實時性和可靠性。在此背景下,嵌入式實時操作系統(tǒng)VxWorks在電力系統(tǒng)中得到了廣泛的應(yīng)用。同時硬件和軟件之間的聯(lián)系是通過驅(qū)動實現(xiàn)的,那么驅(qū)動就具有非常重要的作用。

        I2C(Inter Integrated Circuit)總線是飛利浦公司于20世紀80年代開發(fā)的一種“電路板級”的總線結(jié)構(gòu)。它是一種同步通信形式,具有接口線少、控制方式簡單、通信速率較高等優(yōu)點[3],使得I2C總線在電力通信中得到廣泛的應(yīng)用,如應(yīng)用在電力通信網(wǎng)監(jiān)控系統(tǒng)中,既能簡化系統(tǒng)接口,又能使系統(tǒng)易于擴展[4]。在主從通信模式中,I2C總線可以同時連接上多個I2C從設(shè)備,并且通過設(shè)備地址來識別具體的通信對象。

        本文通過對龍芯公司LS232 內(nèi)核的龍芯1B 芯片分析研究,提出了在VxWorks操作系統(tǒng)下進行I2C 總線及設(shè)備驅(qū)動程序的設(shè)計方案。

        1 I 2C總線通信協(xié)議及龍芯1B芯片介紹

        I2C總線用串行數(shù)據(jù)(Serial Data,SDA)和串行時鐘(Serial Clock,SCL)兩條線在總線和設(shè)備之間進行信息傳遞,在設(shè)備間進行串行通信或者雙向數(shù)據(jù)傳送。對每個芯片來說,每條線既是輸入線,又是輸出線[5]。

        I2C總線遵從同步串行傳輸協(xié)議,即每一位在串行發(fā)送時都是由時鐘SCL 的邊沿進行同步,總線上傳送的每一幀數(shù)據(jù)都是一個字節(jié)。在每個數(shù)據(jù)包前都有一個地址,用來指示由哪個器件來接收該數(shù)據(jù)。I2C主控制器和I2C設(shè)備是I2C 總線體系結(jié)構(gòu)中的兩個重要概念。其中I2C主控制器是微控制器提供控制I2C總線的接口,用于控制所有I2C總線的特殊序列、協(xié)議、仲裁和時序;而I2C設(shè)備指的是與I2C總線相連的外圍設(shè)備,比如EEPROM 存儲器、RTC時鐘等。不同的I2C設(shè)備具有不同的特性,因此其驅(qū)動程序一般都需要特別設(shè)計[6]。

        龍芯1B芯片是一款基于MIPS指令集的32位SoC芯片,片內(nèi)集成具有自主知識產(chǎn)權(quán)的32位處理器核,能夠滿足超低價位云終端、工業(yè)控制/數(shù)據(jù)采集、網(wǎng)絡(luò)設(shè)備、消費類電子等領(lǐng)域需求。芯片擁有8KB的指令和數(shù)據(jù)緩存器,1 個LCD 控 制 器、1 個DDR2 控 制 器、1 個NAND FLASH 控 制 器、1 個 全 功 能 串 口、1 個 四 線 串 口 和10 個兩線串口,支持I2C、SPI、CAN、USB等接口[7]。

        2 嵌入式VxWorks驅(qū)動程序框架

        在嵌入式VxWorks操作系統(tǒng)中,外部設(shè)備可以分成3種類型:字符設(shè)備、網(wǎng)絡(luò)設(shè)備以及塊設(shè)備。根據(jù)設(shè)備的類型,對于驅(qū)動程序的管理也分成3種模塊:字符設(shè)備驅(qū)動程序模塊、網(wǎng)絡(luò)設(shè)備驅(qū)動程序模塊以及塊設(shè)備驅(qū)動程序模塊[8]。一種驅(qū)動管理模塊對應(yīng)一種類型的設(shè)備,而且各個模塊中不同設(shè)備的功能也是不一樣的,用戶可以在Vx-Works下,根據(jù)需求建立不同的功能模塊,實現(xiàn)系統(tǒng)的高性能和可裁減性。

        在嵌入式VxWorks操作系統(tǒng)中,設(shè)備的驅(qū)動程序是板級支持包(Board Support Package,BSP)的一部分,完成了對設(shè)備初始化、讀、寫操作和控制等功能。驅(qū)動程序是直接控制設(shè)備的程序,同時也是設(shè)備上層的軟件接口。本質(zhì)上,設(shè)備的驅(qū)動程序是對I/O 進行操作,從軟件層面上來看,就是對I/O 端口的地址進行讀操作或?qū)懖僮鳎?]。只要操作系統(tǒng)訪問外設(shè),就會調(diào)用驅(qū)動程序,由此得出,驅(qū)動程序并不能夠自動執(zhí)行,而只能夠被操作系統(tǒng)或者應(yīng)用程序所調(diào)用。

        在VxWorks應(yīng)用程序中,系統(tǒng)訪問外部設(shè)備是通過VxWorks的I/O 子系統(tǒng)進行操作的。VxWorks的I/O 子系統(tǒng)具有獨特性,比其他I/O 系統(tǒng)更加快速、靈活,這在實時系統(tǒng)中是非常重要的。針對基于I/O 系統(tǒng)的字符設(shè)備和塊設(shè)備,VxWorks的I/O 系統(tǒng)提供一些ioLib系統(tǒng)庫中的標準I/O 接口函數(shù)。這種驅(qū)動設(shè)計方法的優(yōu)點是對應(yīng)用程序開發(fā)人員進行底層硬件的屏蔽,使得其在編寫程序時不需要關(guān)心底層設(shè)備硬件。對于一個字符設(shè)備來說,驅(qū)動程序包含了7 種基本I/O 操作函數(shù):創(chuàng)建設(shè)備create()、刪除設(shè)備remove()、打開設(shè)備open()、關(guān)閉設(shè)備close()、讀取設(shè)備中的數(shù)據(jù)read()、向設(shè)備寫數(shù)據(jù)write()和設(shè)置設(shè)備的方式字ioctl()[10]。但有些設(shè)備并不支持其中的某些操作,可以在實現(xiàn)的時候?qū)⑵涫÷浴?/p>

        3 I 2C主控制器驅(qū)動設(shè)計

        I2C設(shè)備屬于字符設(shè)備,I2C 主控制器的驅(qū)動程序按功能可以分成3個主要模塊:初始化模塊、讀模塊和寫模塊。在VxWorks嵌入式系統(tǒng)中,連接I2C 總線上的設(shè)備必須按照I2C總線時序傳輸,下面介紹一下I2C主控制器驅(qū)動的基本模塊。

        3.1 I 2C主控制器初始化i2c_Init()

        初始化I2C主控制器,主要是為各個寄存器設(shè)置正確的初值。首先,對I2C 通信端口進行配置,包括分頻鎖存器低字節(jié)寄存器PRERlo和分頻鎖存器高字節(jié)寄存器PRERhi,以實現(xiàn)合適的總線時鐘頻率。若分頻鎖存器的值為prescale,從APB 總線PCLK 時鐘輸入的頻率為clock_a,SCL總線的輸出頻率為clock_s,則應(yīng)滿足如下關(guān)系:prescale=clock_a/(5×clock_s)-1。然后,設(shè)置控制寄存器CTR,使I2C總線處于正常工作模式。

        3.2 I 2C主控制器寫字節(jié)和寫數(shù)據(jù)

        I2C主控制器寫字節(jié)函數(shù)i2cWriteByte()實現(xiàn)的功能是I2C總線發(fā)送出一個字節(jié)的數(shù)據(jù),并接收應(yīng)答位。函數(shù)實現(xiàn)具體流程如下:

        ①設(shè)置發(fā)送數(shù)據(jù)寄存器TXR,將被寫進的數(shù)據(jù)從設(shè)備的設(shè)備地址放在發(fā)送數(shù)據(jù)寄存器,然后,設(shè)置命令控制寄存器CR產(chǎn)生寫信號、START 信號以及應(yīng)答信號;

        ②讀狀態(tài)寄存器SR,看是否傳輸完成及收到應(yīng)答信號。如果正在傳輸數(shù)據(jù),則等待并一直檢測傳輸?shù)倪^程,直到數(shù)據(jù)傳輸完畢,數(shù)據(jù)傳輸完畢后,檢測是否收到應(yīng)答信號,如果沒有收到,重新進行發(fā)送;

        ③收到應(yīng)答位后,將要發(fā)送的數(shù)據(jù)寫入發(fā)送數(shù)據(jù)寄存器TXR,然后,命令控制寄存器CR產(chǎn)生寫信號;

        ④重復(fù)第2步的操作,如果控制器沒有收到應(yīng)答信號,則重復(fù)第3步的操作,直到一個字節(jié)的數(shù)據(jù)寫完收到應(yīng)答信號為止;

        ⑤設(shè)置命令控制寄存器CR產(chǎn)生STOP信號。

        i2cWrite()函數(shù)實現(xiàn)的功能是I2C總線發(fā)送出連續(xù)的數(shù)據(jù),并接收應(yīng)答位。當要發(fā)送的數(shù)據(jù)長度為0時,則直接返回,不做任何操作;當要發(fā)送的數(shù)據(jù)大小是一個字節(jié)時,則直接調(diào)用i2cWriteByte()即可;當要發(fā)送的數(shù)據(jù)大小大于一個字節(jié)時,循環(huán)進行寫操作,直至將所有的數(shù)據(jù)都寫入到從設(shè)備中為止。

        i2cWrite()函數(shù)中實現(xiàn)循環(huán)寫操作的部分略——編者注。

        3.3 I 2C主控制器讀字節(jié)和讀數(shù)據(jù)

        I2C主控制器讀字節(jié)函數(shù)i2cReadByte()實現(xiàn)的功能是I2C總線從設(shè)備中讀出一個字節(jié)的數(shù)據(jù),并接收應(yīng)答位,返回值是接收到的數(shù)據(jù)。函數(shù)實現(xiàn)的具體流程如下:

        ①設(shè)置發(fā)送數(shù)據(jù)寄存器TXR,將被寫進數(shù)據(jù)的從設(shè)備的設(shè)備地址放入發(fā)送數(shù)據(jù)寄存器,然后,設(shè)置命令控制寄存器CR產(chǎn)生寫信號、START 信號以及應(yīng)答信號;

        ②讀狀態(tài)寄存器SR,看是否傳輸完成及收到應(yīng)答信號,如果正在傳輸數(shù)據(jù),則等待并一直檢測傳輸?shù)倪^程,直到數(shù)據(jù)傳輸完畢,數(shù)據(jù)傳輸完畢后,檢測是否收到,如果沒有收到應(yīng)答信號,重新進行發(fā)送;

        ③數(shù)據(jù)傳輸完畢并且收到應(yīng)答位后,設(shè)置命令控制寄存器CR產(chǎn)生讀信號和應(yīng)答信號;

        ④重復(fù)第2步的操作,如果控制器沒有收到應(yīng)答信號,則重復(fù)第3步的操作直到數(shù)據(jù)傳輸完畢后,讀接收數(shù)據(jù)寄存器RXR,將接收到的數(shù)據(jù)放到寄存器rBuf中;

        ⑤設(shè)置命令控制寄存器CR產(chǎn)生STOP信號。

        i2cRead()函數(shù)實現(xiàn)的功能是I2C總線接收連續(xù)的數(shù)據(jù),并接收應(yīng)答位。當要接收的數(shù)據(jù)長度為0時,則直接返回,不做任何操作;當要接收的數(shù)據(jù)大小是一個字節(jié)時,則直接調(diào)用i2cReadByte()即可;當要接收的數(shù)據(jù)大小大于一個字節(jié)時,循環(huán)進行讀操作,直至總線讀取到所有的數(shù)據(jù)為止。

        i2cRead()函數(shù)中實現(xiàn)循環(huán)讀操作的部分略——編者注。

        4 I 2C設(shè)備驅(qū)動的設(shè)計

        4.1 RX8025簡介及硬件連接結(jié)構(gòu)

        RX8025 是EPSON 公 司 的 實 時 時 鐘(Real-Time Clock,RTC)芯片。該芯片的外部通信接口采用I2C 總線方式,內(nèi)部配置頻率可調(diào)、高精度的32.768kHz晶振,具有2個系統(tǒng)鬧鐘功能、6種中斷發(fā)生功能以及時鐘精度調(diào)整功能,在手機、控制裝置、智能儀表及其他電子領(lǐng)域中得到大量應(yīng)用。

        RTC最重要的功能就是顯示時間,是通過讀/寫寄存器實現(xiàn)的[11]。要顯示秒、分、時、日期、月、年,CPU 必須讀取存于BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON 與BCDYEAR寄存器中的值,時間的設(shè)置也是通過這些寄存器實現(xiàn)的。龍芯1B處理器通過I2C總線與RTC時鐘RX8025相連接,CPU 通過I2C 主控制器與RTC 的讀/寫寄存器相連,以便完成RTC 時間的初始化及讀取等。

        4.2 RX8025的簡介及硬件連接結(jié)構(gòu)

        4.2.1 I2C設(shè)備描述符結(jié)構(gòu)

        由圖9看到,最大應(yīng)力主要集中在安裝孔附近,其值為20.6 MPa,小于材料的許用應(yīng)力.因此當板厚選擇10 mm時,滿足強度要求.

        4.2.2 具體設(shè)計

        設(shè)備驅(qū)動初始化函數(shù)i2cDrv(),可以判斷驅(qū)動是否已經(jīng)初始化。如果已經(jīng)完成初始化,則直接返回;如果還沒有初始化,則調(diào)用iosDrvInstall()例程。該例程對于同一個設(shè)備,驅(qū)動只需要調(diào)用一次,它將驅(qū)動服務(wù)程序與I/O系統(tǒng)服務(wù)進行關(guān)聯(lián),將I2C驅(qū)動例程加入到驅(qū)動表DRV_TABLE中,并且分配給I2C設(shè)備一個驅(qū)動號。

        設(shè)備創(chuàng)建函數(shù)i2cDevCreate(),首先判斷驅(qū)動是否已經(jīng)初始化。如果還沒有初始化,則返回錯誤信息;如果已經(jīng)完成初始化,則進行設(shè)備的一些初始化。首先分配設(shè)備描述符并對其進行初始化;然后調(diào)用iosDevAdd()例程,該函數(shù)向VxWorks的I/O 子系統(tǒng)的設(shè)備鏈表DEVICE LIST 中添加一個I2C 設(shè)備,并設(shè)置I2C 設(shè)備頭結(jié)構(gòu)的驅(qū)動號i2cDrvNum,該驅(qū)動號是設(shè)備驅(qū)動初始化完成時返回的驅(qū)動號;最后設(shè)置I2C設(shè)備頭結(jié)構(gòu)的設(shè)備名devName為“/i2cDev”,這樣就保證了設(shè)備對于以后的open()、read()和write()例程可用。

        設(shè)備打開函數(shù)i2cOpen(),通過調(diào)用I2C 控制器初始化函數(shù)i 2c_Init()來進行I2C主控制器的初始化,并且必須返回一個I2C設(shè)備指針pi2cDev,之所以要返回該指針,是因為一定要將該指針賦值給文件表FD_TABLE中文件條目FD_ENTRY 中的第一項pDevHdr。

        設(shè)備寫函數(shù)rtcwrite(),通過I2C主控制器向RTC設(shè)備中寫入數(shù)據(jù)。在RTC 模塊中,寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON 和BCDYEAR分別寫入秒、分、時、天、月、年的數(shù)值,完成RTC初始時間的設(shè)定。

        設(shè)備讀函數(shù)rtcread(),通過I2C 主控制器讀出RTC設(shè)備中的數(shù)據(jù),即當前的時間值。訪問RTC 模塊的寄存器,首先要設(shè)RTCCON 的位為1。CPU 通過讀取RTC模塊中寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON 和BCDYEAR的值,得到當前的相應(yīng)時間值。

        在嵌入式操作系統(tǒng)VxWorks的開發(fā)環(huán)境Workbench中,首先創(chuàng)建VxWorks image工程,將設(shè)計好的I2C 主控制器驅(qū)動和I2C 設(shè)備RTC 驅(qū)動文件編譯到VxWorks內(nèi)核中[12];然后再將編譯生成的VxWorks映像文件通過網(wǎng)口下載到嵌入式設(shè)備如龍芯1B開發(fā)板中;最后上電運行,目標板可以實現(xiàn)I2C總線以及I2C設(shè)備的功能。

        4.2.3 RTC設(shè)備驅(qū)動和測試

        設(shè)備驅(qū)動的驗證需要在用戶空間的測試程序中來完成,首先,針對RTC 設(shè)備驅(qū)動的測試程序描述如下:在VxWorks系統(tǒng)命令行下,調(diào)用i2cDrv()初始化設(shè)備驅(qū)動,然后調(diào)用i2cDrvCreate()創(chuàng)建RX8025 設(shè)備,將從設(shè)備RX8025掛接在I2C總線上;然后,CPU 通過I2C主控制器訪問RX8025,在RX8025中先寫入自定義的初始時間,格式為“年月日時分秒”。測試結(jié)果顯示,CPU 可以讀出時間值,格式也為“年月日時分秒”,第一次讀取時間為14:50:04,第二次讀取的時間為14:50:21,時間一直在增長,結(jié)果略——編者注。這樣可以證明本文設(shè)計的I2C 驅(qū)動程序的正確性。

        4.3 I 2C設(shè)備驅(qū)動的應(yīng)用實例

        在某電網(wǎng)項目的控制設(shè)備中使用龍芯1B芯片,該芯片通過I2C 總線與STM8S003單片機相連。在VxWorks系統(tǒng)下使用本文設(shè)計的VxWorks的I2C 驅(qū)動程序控制STM8S003單片機,并實現(xiàn)ADC功能,該ADC具有10位轉(zhuǎn)換精度,共有5路A/D轉(zhuǎn)換通道,以實現(xiàn)對控制設(shè)備周邊環(huán)境中溫度、濕度等物理量的監(jiān)控。不同A/D轉(zhuǎn)換通道采集到的數(shù)據(jù)結(jié)果略——編者注,通道0的數(shù)據(jù)為232,通道1的數(shù)據(jù)為448,通道2的數(shù)據(jù)為542,通道3的數(shù)據(jù)為381。上述結(jié)果可以轉(zhuǎn)換為對應(yīng)物理量值,以通道1為例,通道1采集到的電壓值為U1=448×10/1024=4.375V。

        結(jié) 語

        本文詳細介紹了基于VxWorks的I2C驅(qū)動程序的設(shè)計方法,包括I2C主控制器驅(qū)動和I2C總線設(shè)備驅(qū)動兩部分。最后通過對I2C 設(shè)備RTC 進行讀和寫操作,驗證了本文的設(shè)計方法是正確可行的。使用基于VxWorks的I2C總線通信方式,在提高通信實時性的同時簡化了系統(tǒng)接口,并為今后VxWorks系統(tǒng)下其他設(shè)備驅(qū)動的開發(fā)提供了參考方法,增強了嵌入式模塊在電力系統(tǒng)應(yīng)用中的實時性和可靠性。

        編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。

        [1]周啟平,張揚.VxWorks下設(shè)備驅(qū)動程序及BSP 開發(fā)指南[M].北京:中國電力出版社,2004:50-85.

        [2]鄺堅.Tornado/VxWorks入門與提高[M].北京:科學出版社,2004:100-160.

        [3]Philips Semiconductor.I2C Bus Specification.Version 2.1,2000.

        [4]王婕,吳建江,劉仲謀,等.I2C總線在電力通信網(wǎng)監(jiān)控系統(tǒng)中的應(yīng)用[J].電力系統(tǒng)通信,2002,23(8):17-23.

        [5]N Sriskanthan,T S Lim.I2C Bus Analyzer[J].IEEE Trans.Consumer Electronics,2001,47(4):865-872.

        [6]余熾業(yè),宋躍,雷瑞庭.嵌入式Linux的I2C 設(shè)備驅(qū)動程序的分析[J].現(xiàn)代電子技術(shù),2013(16):38-40.

        [7]杜安利.龍芯在嵌入式應(yīng)用概況[J].中國集成電路,2013,22(10):92-93.

        [8]Wind River Inc.VxWorks 6.7BSP Developer's Guide,2008.

        [9]Wind River Inc.VxWorks 6.7 Device Driver Developer's Guide,2008.

        [10]王金剛,楊錫勱,蘇琪.VxWorks BSP 開發(fā)人員指南[M].北京:清華大學出版社,2003:60-90.

        [11]龔光松.基于I2C總線的實時時鐘芯片設(shè)計[J].軟件導刊,2012,11(4):97-100.

        [12]Wind River Inc.Wind River Workbench User's Guide,2008.

        猜你喜歡
        驅(qū)動程序字節(jié)寄存器
        No.8 字節(jié)跳動將推出獨立出口電商APP
        Lite寄存器模型的設(shè)計與實現(xiàn)
        No.10 “字節(jié)跳動手機”要來了?
        簡談MC7字節(jié)碼
        分簇結(jié)構(gòu)向量寄存器分配策略研究*
        高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
        一種可重構(gòu)線性反饋移位寄存器設(shè)計
        人類進入“澤它時代”
        驅(qū)動程序更新與推薦
        驅(qū)動程序更新與推薦
        久久综合给合久久狠狠狠97色69| 国产精品亚洲av高清二区| 一区二区精品国产亚洲| 丰满熟女高潮毛茸茸欧洲视频| 精品国产乱码久久久久久1区2区| 欧美性猛交xxxx乱大交蜜桃| 亚洲无码啊啊啊免费体验| 中文字幕中文字幕三区| 日本一区二区视频免费在线看| 人妻体内射精一区二区三四| 亚洲色大成网站www永久一区| 国产精品久久久亚洲第一牛牛| 亚洲天堂av免费在线| 亚洲av少妇高潮喷水在线| 男女猛烈无遮挡免费视频| 久久综合久久鬼色| 真人在线射美女视频在线观看 | 精品人妻一区二区蜜臀av| 美女与黑人巨大进入免费观看| 真人抽搐一进一出视频| 97在线观看| 色综合久久久久综合999| 国产少妇一区二区三区| 爆操丝袜美女在线观看| 日韩aⅴ人妻无码一区二区| 日韩av高清无码| 亚洲AV无码日韩一区二区乱| 国产毛片视频一区二区三区在线| 国产 精品 自在 线免费| 夜夜未满十八勿进的爽爽影院| 久久久久久久一线毛片| 中国av一区二区三区四区| 国产亚洲一区二区三区| 久久国产精品99精品国产| 2021年国产精品每日更新| 久久精品国产精品亚洲婷婷| 中文字幕免费人成在线网站| 亚洲色成人网站www永久| 日韩一欧美内射在线观看| 一区二区三区四区四色av| 丰满人妻中文字幕一区三区|