<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式Linux的ARM/DSP多機I2C通信

基于嵌入式Linux的ARM/DSP多機I2C通信

作者: 時(shí)間:2013-01-15 來(lái)源:網(wǎng)絡(luò ) 收藏

引言

  在很多中,系統既要完成大量的信息采集和復雜的算法,又要實(shí)現精確的控制功能。采用運行有嵌入式操作系統的ARM9微控制器完成信號采集及實(shí)現上層控制算法,并向DSP芯片發(fā)送上層算法得到控制參數,DSP芯片根據獲得的參數和下層控制算法實(shí)現精確、可靠的閉環(huán)控制。

1 多機系統組成

  該多機控制系統以ARM9微控制器為核心,采用I2C總線(xiàn)掛載多個(gè)DSP芯片作為協(xié)控制器,構成整個(gè)控制系統的核心。

1.1 簡(jiǎn)介

  Samsung公司的處理器是內部集成了ARM公司ARM920T處理器內核的32位微控制器,資源豐富,帶獨立的16 KB的指令Cache和16 KB數據Cache,最高主頻可達400 MHz。它擁有130個(gè)通用I/O、24個(gè)外部中斷源以及豐富的外部接口能實(shí)現各種功能,包括支持多主功能的I2C總線(xiàn)接口、3路URAT、2路SPI、攝像頭接口等。

  (以下簡(jiǎn)稱(chēng)F28015)是TI公司的32位處理器,它具有強大的控制和信號處理能力,能夠實(shí)現復雜的控制算法。片上整合了Flash存儲器、I2C總線(xiàn)模塊、快速的A/D轉換器、增強的CAN總線(xiàn)模塊、事件管理器、正交編碼電路接口及多通道緩沖串口等外設,此種整合能夠方便地實(shí)現功能的擴展。同時(shí),快速的中斷響應使它能夠保護關(guān)鍵的寄存器并快速(更小的中斷延時(shí))地響應外部異步事件。

1.2 I2C總線(xiàn)接口

  I2C總線(xiàn)是一種用于IC器件之間連接的串行總線(xiàn),采用SDA(數據線(xiàn))和SCL(時(shí)鐘線(xiàn))兩線(xiàn)連接每個(gè)帶有I2C總線(xiàn)接口的器件或模塊。串行的8位雙向數據傳輸率在標準模式下可達100 kb/s,快速模式下可達400 kb/s。多個(gè)微控制器可以通過(guò)I2C總線(xiàn)接口非常方便地連接在一起構成系統,并根據地址識別每個(gè)器件。這種總線(xiàn)結構的連線(xiàn)和連接引腳少,器件間總線(xiàn)簡(jiǎn)單,結構緊湊。因此其構成系統的成本較低,并且在總線(xiàn)上增加器件不會(huì )影響系統的正常工作,所有的I2C總線(xiàn)器件共用一套總線(xiàn),因此其系統修改和可擴展性好。

  總線(xiàn)必須由主機(通常為微控制器)控制,主機產(chǎn)生串行時(shí)鐘( SCL) 控制總線(xiàn)的數據傳輸,并產(chǎn)生起始和停止條件。SDA 線(xiàn)上的數據狀態(tài)僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA 狀態(tài)的改變被用來(lái)表示起始和停止條件。I2C總線(xiàn)起始和停止時(shí)序如圖1所示。

圖1 I2C總線(xiàn)起始和停止時(shí)序

1.3 硬件電路

  S3C2440和F28015自身均集成了I2C總線(xiàn)模塊,支持多主設備I2C總線(xiàn)串行接口,可以方便地掛接到I2C總線(xiàn)上。因此,兩者之間的I2C總線(xiàn)接口電路的設計變得十分簡(jiǎn)單,只要將兩者的對應引腳I2C_CLK(對應I2C總線(xiàn)中的SCL線(xiàn))和I2C_SDA(對應I2C總線(xiàn)中的DATA線(xiàn))連接起來(lái)即可。S3C2440和TMS320F28015的硬件接口電路如圖2所示。

圖2 S3C2440和TMS320F28015的硬件接口

  電路S3C2440的PA55和PA56引腳分別對應I2C_SDA和I2C_CLK,而F28015的GPIO32和GPIO33也可以分別復用為I2C_SDA和I2C_CLK??紤]到阻抗不匹配等因素會(huì )影響總線(xiàn)數據傳輸效果,因此在將兩塊芯片的I2C_DATA和I2C_CLK引腳直連時(shí),在直連線(xiàn)路上各串聯(lián)一個(gè)小電阻。

  I2C_SDA和I2C_CLK是雙向電路,必須都通過(guò)一個(gè)電流源或上拉電阻連接到正電源電壓上。由于S3C2440和F28015的輸出高電平均為3.3 V,所以在硬件設計時(shí)將I2C_SDA和I2C_CLK總線(xiàn)通過(guò)上拉電阻連接到了3.3 V的VCC電源上。

2 ARM和DSP通信軟件設計

  運行操作系統的ARM微控制器作為主控制器,在數據管理及多任務(wù)調度等方面有顯著(zhù)優(yōu)勢,可以很好地組織外圍器件采集的數據;主要實(shí)現對系統的整體控制,并通過(guò)總線(xiàn)設備驅動(dòng)程序控制I2C總線(xiàn)模塊,通過(guò)主機尋址實(shí)現向I2C總線(xiàn)上掛載的下層DSP的數據收發(fā)。為保證數據通信的實(shí)時(shí)性,F28015通過(guò)中斷響應的方式實(shí)現數據接收和發(fā)送。

2.1 ARM9平臺的嵌入式的I2C總線(xiàn)驅動(dòng)設計

2.1.1 I2C總線(xiàn)讀寫(xiě)時(shí)序

  ARM9微控制器作為主機向從機DSP寫(xiě)數據,首先向從機發(fā)送啟動(dòng)信號,然后發(fā)送7位從機地址和1位寫(xiě)標志位,再等待從機的應答信號。在收到應答信號后,主機發(fā)送數據給從機,再次等待應答信號。當主機收到應答信號之后再次發(fā)送數據。之后,主機等待從機的應答信號,如此直到數據發(fā)送完成,主機發(fā)送停止信號。I2C總線(xiàn)寫(xiě)數據幀格式如圖3所示。

圖3 I2C總線(xiàn)寫(xiě)數據幀格式

  主模式下讀數據,是指每次從指定的位置讀取一個(gè)或多個(gè)字節數據。主機首先向從機發(fā)送啟動(dòng)信號,然后發(fā)送 7位從機地址和1位讀標志位,等待從機應答。當收到從機的應答信號后,主機準備接收從機發(fā)送的數據,接收完成后發(fā)送一個(gè)應答信號,如此直到數據接收完成,主機發(fā)送一個(gè)停止信號。圖4為I2C總線(xiàn)讀數據幀格式。

圖4 I2C總線(xiàn)讀數據幀格式

2.1.2 Linux下I2C總線(xiàn)驅動(dòng)程序概述

  Linux系統的I2C總線(xiàn)驅動(dòng)采用體系化結構設計,包括I2C總線(xiàn)適配器驅動(dòng)和I2C總線(xiàn)設備驅動(dòng)??偩€(xiàn)驅動(dòng)實(shí)現對I2C總線(xiàn)適配器(S3C2440的I2C總線(xiàn)模塊)的控制,設備驅動(dòng)實(shí)現對具體設備(F28015的I2C總線(xiàn)模塊)的讀寫(xiě)控制。圖5為總體驅動(dòng)框架,可以分為三個(gè)層次:

① I2C框架。內核中i2c.h和i2ccore.c為I2C總線(xiàn)框架的主體,提供了核心數據結構的定義、I2C總線(xiàn)適配器驅動(dòng)和設備驅動(dòng)的注冊、注銷(xiāo)管理、I2C總線(xiàn)通信方法上層的、與具體適配器無(wú)關(guān)的代碼、檢測設備地址的上層代碼等。i2cdev.c用于創(chuàng )建I2C總線(xiàn)適配器的設備節點(diǎn),提供I2C總線(xiàn)設備訪(fǎng)問(wèn)方法等。

② I2C總線(xiàn)適配器驅動(dòng)。定義描述具體I2C總線(xiàn)適配器的數據結構,實(shí)現在具體I2C總線(xiàn)適配器上的I2C總線(xiàn)通信方法。

③ I2C總線(xiàn)設備驅動(dòng)。定義描述具體設備的數據結構,借助I2C總線(xiàn)框架的相關(guān)函數實(shí)現設備的注冊,并為用戶(hù)提供上層應用程序編程接口。

圖5 總體驅動(dòng)框架

  Linux的I2C總線(xiàn)驅動(dòng)框架中的主要數據結構包括: i2c_driver、i2c_client、i2c_adapter和 i2c_algorithm,它們被定義在內核中的i2c. h頭文件中。i2c_adapter對應于物理上的一個(gè)適配器,而i2c_algorithm對應一套通信方法,用來(lái)為適配器提供通信函數。i2c_algorithm中的關(guān)鍵函數master_xfer()用于產(chǎn)生I2C總線(xiàn)訪(fǎng)問(wèn)周期需要的信號,以i2c_msg(即I2C總線(xiàn)消息)為單位。該結構體原型如下:
struct i2c_msg{
_ _u16 addr;/*設備地址*/
_ _u16 flags;/*標志*/
_ _u16 len;/*消息長(cháng)度*/
_ _u8 *buf;/*消息數據*/
};

  i2c_driver對應一套驅動(dòng)方法,是用于輔助作用的數據結構。i2c_client對應于真實(shí)的物理設備,每個(gè)I2C總線(xiàn)設備都需要一個(gè)i2c_client來(lái)描述。i2c_adapter和i2c_client的關(guān)系與I2C總線(xiàn)硬件體系中適配器和設備關(guān)系一致,即i2c_client依附于i2c_adapter。

圖6 設備驅動(dòng)模塊加載流程

  在Linux內核源代碼中drivers目錄下的i2c_dev.c文件,是通用的I2C總線(xiàn)設備驅動(dòng)文件,為應用程序提供open()、write()、read )、ioctl()和close()等操作接口來(lái)訪(fǎng)問(wèn)設備。應用層可以借用這些接口訪(fǎng)問(wèn)掛接在適配器上的I2C總線(xiàn)設備的存儲空間或寄存器,并控制I2C總線(xiàn)設備的工作方式。

2.1.3 S3C2440的I2C總線(xiàn)驅動(dòng)及設備驅動(dòng)

S3C2440內部的I2C總線(xiàn)控制器通過(guò)4個(gè)寄存器實(shí)現對通信的控制,分別是I2C控制寄存器(I2CCON)、I2C狀態(tài)寄存器(I2CSTAT)、I2C收發(fā)數據移位寄存器(I2CDS)、I2C地址寄存器(I2CADD)。

  按照Linux中I2C總線(xiàn)框架要求,S3C2440的I2C總線(xiàn)驅動(dòng)設計主要完成以下工作:設計i2c_adapter_s3c_init()模板加載函數和對應于i2c_adapter_s3c_exit()模板卸載函數;設計i2c_adapter_s3c_xfer()模板S3C2440適配器通信方法函數。

  i2c_adapter_s3c_init()通過(guò)注冊s3c2440_i2c_driver結構體實(shí)現總線(xiàn)驅動(dòng)的平臺注冊,s3c2440_i2c_driver結構體包含了具體適配器的probe()函數、remove()函數、resume()函數指針等信息。代碼如下:
static int _ _init i2c_adap_s3c_init(){
  int ret;
  ret=platform_driver_regisiter(s3c2440_i2c_driver);//注冊platform_driver結構體
  if(ret==0){//注冊失敗
    ret=platform_driver_regisiter(s3c2440_i2c_driver);
    if(ret)
    platform_driver_unregisiter (s3c2440_i2c_driver);
  }
  return ret;
}
static struct platform_driver s3c2440_i2c_driver={
  .probe=s3c24xx_i2c_probe,
  .remove=s3c24xx_i2c_remove,
  .resume=s3c24xx_i2c_resume,
  .driver={
    .owner=THIS MODULE,
    .name=s3c2440i2c,
  },
} ;

  完成了S3C2440的I2C總線(xiàn)適配器驅動(dòng)注冊后,就可以將具體設備驅動(dòng)注冊到該總線(xiàn)平臺上,實(shí)現I2C總線(xiàn)數據通信。i2c_dev.c文件是內核源碼提供的通用I2C總線(xiàn)設備驅動(dòng)文件,針對每個(gè)I2C總線(xiàn)適配器生成一個(gè)主設備號為89的設備文件,設備驅動(dòng)模塊加載流程如圖6所示。完成加載后,驅動(dòng)提供i2cdev_read()、i2cdev_write()、i2cdev_ioctl()函數來(lái)對應用戶(hù)空間的read()、write()、ioctl()函數,供用戶(hù)使用。用戶(hù)通過(guò)這些接口函數實(shí)現I2C總線(xiàn)數據的讀寫(xiě)功能。

2.2 DSP數據接收中斷程序設計

圖7 I2C總線(xiàn)中斷服務(wù)程序流程

  通過(guò)配置F28015的I2C模塊寄存器,設置I2C模塊為從工作方式,同時(shí)利用I2C總線(xiàn)中斷響應程序實(shí)現對總線(xiàn)上數據的接收和發(fā)送,進(jìn)而完成數據通信。F28015產(chǎn)生了I2C總線(xiàn)中斷后,就執行中斷服務(wù)程序,圖7為I2C總線(xiàn)中斷服務(wù)程序流程。

  中斷服務(wù)程序通過(guò)查詢(xún)狀態(tài)寄存器(I2CSTR)標志位,得出中斷類(lèi)型碼,然后調用相應的子程序,完成數據接收發(fā)送。代碼如下:

interrupt void i2c_int1a_isr(void) {//I2CA的中斷響應函數
  Uint16 IntSource;// 讀取中斷碼
  IntSource=I2caRegs.I2CISRC.bit.INTCODE 0x7;//I2CA中斷源,讀后3位
  switch(IntSource){//依中斷源而確定相關(guān)接收和發(fā)送策略
    case I2C_NO_ISRC://=0
    case I2C_ARB_ISRC://=1
    case I2C_NACK_ISRC: //=2
    case I2C_ARDY_ISRC: //=3
    case I2C_SCD_ISRC://=6
    case I2C_AAS_ISRC://=7
      break;
    case I2C_RX_ISRC://=4,接收數據已準備好
      DataReceive();//調用數據接收子函數接收數據
      break;
    case I2C_TX_ISRC://=5,發(fā)送數據已準備好
      DataTransmit();//調用數據發(fā)送子函數接收數據
      break;
    default:
      asm(ESTOP0); //無(wú)效數據,則停止
  }
  PieCtrlRegs.PIEACK.all=PIEACK_GROUP8;
}

  F28015中的數據接收子程序和數據發(fā)送子程序是在I2C總線(xiàn)的中斷服務(wù)程序中根據不同的狀態(tài)碼進(jìn)行調用,它們是整個(gè)通信程序的核心部分。數據接收子程序和數據發(fā)送子程序的流程如圖8所示。

圖8 數據接收和發(fā)送子程序

3 測試結果

  通過(guò)NFS文件系統將編譯成模塊的I2C的總線(xiàn)驅動(dòng)和設備驅動(dòng)加載到運行Linux操作系統的S3C2440平臺上(先加載總線(xiàn)驅動(dòng)),再將F28015的測試程序燒寫(xiě)到RAM中。運行F28015等待I2C總線(xiàn)上的數據,再執行Linux系統中的I2C總線(xiàn)測試程序。測試結果顯示,芯片通過(guò)I2C總線(xiàn)接口完成了數據通信,具有良好的實(shí)時(shí)性和可靠性。

4 結論

  該設計利用I2C總線(xiàn)實(shí)現了ARM9微控制器與DSP芯片間實(shí)時(shí)可靠的數據通信。ARM9微控制器結合Linux操作系統作為上層控制核心,DSP芯片實(shí)現下層控制算法,可充分發(fā)揮ARM9微控制器在數據采集和任務(wù)管理等方面的優(yōu)勢以及DSP芯片在算法實(shí)現和底層控制的長(cháng)處。

本文引用地址:http://dyxdggzs.com/article/257184.htm
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>