




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、IIC設備驅動程序IIC設備是一種通過IIC總線連接的設備,由于其簡單性,被廣泛引用于電子系統中。在現代電子系統中,有很多的IIC設備需要進行相互之間通信IIC總線是由PHILIPS公司開發的兩線式串行總線,用于連接微處理器和外部IIC設備。IIC設備產生于20世紀80年代,最初專用與音頻和視頻設備,現在在各種電子設備中都廣泛應用IIC總線有兩條總線線路,一條是串行數據線(SDA),一條是串行時鐘線(SCL)。SDA負責數據傳輸,SCL負責數據傳輸的時鐘同步。IIC設備通過這兩條總線連接到處理器的IIC總線控制器上。一種典型的設備連接如圖:與其他總線相比,IIC總線有很多重要的特點。在選擇一種
2、設備來完成特定功能時,這些特點是選擇IIC設備的重要依據。主要特點:1,每一個連接到總線的設備都可以通過唯一的設備地址單獨訪問2,串行的8位雙向數據傳輸,位速率在標準模式下可達到100kb/s;快速模式下可以達到400kb/s;告訴模式下可以達到s3,總線長度最長左右4,片上濾波器可以增加抗干擾能力,保證數據的完成傳輸5,連接到一條IIC總線上的設備數量只受到最大電容400pF的限制6,它是一個多主機系統,在一條總線上可以同時有多個主機存在,通過沖突檢測方式和延時等待防止數據不被破壞。同一時間只能有一個主機占用總線IIC總線在傳輸數據的過程中有3種類型的信號:開始信號、結束信號、和應答信號開始
3、信號(S): 當SCL為高電平時,SDA由高電平向低電平跳變,表示將要開始傳輸數據結束信號(P):當SCL為高電平時,SDA由低電平向高電平跳變,表示結束傳輸數據響應信號(ACK): 從機接收到8位數據后,在第9個周期,拉低SDA電平,表示已經收到數據。這個信號稱為應答信號開始信號和結束信號的波形如下圖:主機:IIC總線中發送命令的設備,對于ARM處理器來說,主機就是IIC控制器從機:接受命令的設備主機向從機發送數據:主機通過數據線SDA向從機發送數據。當總線空閑時,SDA和SCL信號都處于高電平。主機向從機發送數據的過程:1,當主機檢測到總線空閑時,主機發出開始信號2,主機發送8位數據。這8
4、位數據的前7位表示從機地址,第8位表示數據的傳輸方向。這時,第8位為0,表示向從機發送數據3,被選中的從機發出響應信號ACK4,從機傳輸一系列的字節和響應位5,主機接受這些數據,并發出結束信號P,完成本次數據傳輸由上圖可知,IIC控制器主要是由4個寄存器來完成所有的IIC操作的。IICCON:控制是否發出ACK信號,是否開啟IIC中斷IICSTAT:IICADD:掛載到總線上的從機地址。該寄存器的7:1表示從機地址。IICADD寄存器在串行輸出使能位IICSTAT4為0時,才可以寫入;在任何時候可以讀出IICDS:保存將要發送或者接收到的數據。IICCDS在串行輸出使能IICSTAT4為1時,
5、才可以寫入;在任何時間都可以讀出因為IIC設備種類太多,如果每一個IIC設備寫一個驅動程序,那么顯得內核非常大。不符合軟件工程代碼復用,所以對其層次話:這里簡單的將IIC設備驅動分為設備層、總線層。理解這兩個層次的重點是理解4個數據結構,這4個數據結構是i2c_driver、i2c_client、i2c_algorithm、i2c_adapter。i2c_driver、i2c_client屬于設備層;i2c_algorithm、i2c_adapter屬于總線型。如下圖:設備層關系到實際的IIC設備,如芯片AT24C08就是一個IIC設備。總線層包括CPU中的IIC總線控制器和控制總線通信的方法
6、。值得注意的是:一個系統中可能有很多個總線層,也就是包含多個總線控制器;也可能有多個設備層,包含不同的IIC設備由IIC總線規范可知,IIC總線由兩條物理線路組成,這兩條物理線路是SDA和SCL。只要連接到SDA和SCL總線上的設備都可以叫做IIC設備。一個IIC設備由i2c_client數據結構進行描述:struct i2c_clientunsigned short flags; ame = i2c, .dev_attrs = i2c_dev_attrs, .match = i2c_device_match, .uevent = i2c_device_uevent, .probe = i2c
7、_device_probe, .remove = i2c_device_remove, .shutdown = i2c_device_shutdown, .suspend = i2c_device_suspend, .resume = i2c_device_resume,;static struct class i2c_adapter_class = .owner = THIS_MODULE, .name = i2c-adapter, .dev_attrs = i2c_adapter_attrs,;static struct i2c_driver dummy_driver = . = dumm
8、y, .probe = dummy_probe, .remove = dummy_remove, .id_table = dummy_id,;IIC子系統退出函數:static void _exit i2c_exit(void) i2c_del_driver(&dummy_driver); This must be done first, because * it can fail; in which case we give up. */ list_for_each_entry_safe_reverse(client, _n, &adap-clients, list) struct i2c_
9、driver *driver; driver = client-driver; /* new style, follow standard driver model */ if (!driver | is_newstyle_driver(driver) i2c_unregister_device(client); continue; /* legacy drivers create and remove clients themselves */ if (res = driver-detach_client(client) dev_err(&adap-dev, detach_client fa
10、iled for client %s at address 0 x%02xn, client-name, client-addr); goto out_unlock; /* clean up the sysfs representation */ init_completion(&adap-dev_released); device_unregister(&adap-dev); 設備注銷 /* wait for sysfs to drop all references */ wait_for_completion(&adap-dev_released); /* free bus id */ i
11、dr_remove(&i2c_adapter_idr, adap-nr); aster_xfer = s3c24xx_i2c_xfer, .functionality = s3c24xx_i2c_func,;這里只實現了IIC總線通信協議通信方法因不同的適配器有所不同,要跟據具體的硬件來實現協議支持函數s3c24xx_i2c_func()該函數返回總線支持的協議,如I2C_FUNC_I2C、I2C_FUNC_SMBUS_EMUL、I2C_FUNC_PROTOCOL_MANGLING協議:static u32 s3c24xx_i2c_func(struct i2c_adapter *adap)
12、return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING;傳輸函數s3c24xx_i2c_xfer():static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) struct s3c24xx_i2c *i2c = (struct s3c24xx_i2c *)adap-algo_data; 7,最后調用wake_up()喚醒等待隊列,完成數據的傳輸過程當s3c2440的IIC適配器處于主機模式時,IIC
13、操作的第一步總是向IIC總線寫入設備的地址及開始信號。這步由s3c24xx_i2c_set_master()和s3c24xx_i2c_message_start()完成。而收發數據的后繼操作在IIC中斷處理程序s3c24xx_i2c_irq()中完成的中斷處理函數:IIC中斷的產生有3種情況:1,當總線仲裁失敗時產生中斷2,當發送/接受完一個字節的數據(包括響應位)時產生中斷3,當發出地址信息或接收到一個IIC設備地址并且吻合時產生中斷在這3種情況下都觸發中斷,由于當發送/接收完一個字節后會產生中斷,所以可以在中斷處理函數中處理數據的傳輸:static irqreturn_t s3c24xx_
14、i2c_irq(int irqno, void *dev_id) struct s3c24xx_i2c *i2c = dev_id; unsigned long status; . */ dev_dbg(i2c-dev, ack was not receivedn); s3c24xx_i2c_stop(i2c, -ENXIO); */ if (is_lastmsg(i2c) & i2c-msg-len = 0) . check for the * end of the message, and if so, work out what to do */ if (!(i2c-msg-flags
15、& I2C_M_IGNORE_NAK) robe = s3c24xx_i2c_probe, .remove = s3c24xx_i2c_remove, .suspend_late = s3c24xx_i2c_suspend_late, .resume = s3c24xx_i2c_resume, .driver = .owner = THIS_MODULE, .name = s3c2440-i2c, ,;探測函數:s3c24xx_i2c_probe()在該函數中將初始化適配器、IIC等硬件設備。主要完成如下功能:1,申請一個適配器結構體I2c,并對其賦初值2,獲得I2c時鐘資源3,將適配器的寄存
16、器資源映射到虛擬內存中4,申請中斷處理函數5,初始化IIC控制器6,添加適配器I2c到內核static int s3c24xx_i2c_probe(struct platform_device *pdev) struct s3c24xx_i2c *i2c; We now pass the bus number via * the platform data, so if unset it will now default to always * being bus 0. */ i2c- = pdata-bus_num; . */ if (s3c24xx_i2c_clockrate(i2c, &
17、freq) != 0) %lun, pdata, pdata-bus_freq, pdata-min_freq, pdata-max_freq); . */ start = (pdata-max_freq = 0) pdata-bus_freq : pdata-max_freq; end = pdata-min_freq; start /= 1000; end /= 1000; /* search loop. */ for (; start end; start-) freq = s3c24xx_i2c_calcdivisor(clkin, start, &div1, &divs); if (
18、freq_acceptable(freq, start) goto found; /* cannot find frequency spec */ return -EINVAL; /不能找到一個合適的分配方式,返回錯誤found: /找到一個合適的發送頻率,則寫IICCON寄存器中與時鐘相關的位 *got = freq; /got為從參數返回的頻率值 iiccon = readl(i2c-regs + S3C2410_IICCON); /讀出IICCON的值 iiccon &= (S3C2410_IICCON_SCALEMASK | S3C2410_IICCON_TXDIV_512); /將IICCON的6和3:0清零,以避免以前分頻系數的影響 iiccon |= (divs-1); /設置位3:0的分頻系數,divs的值 regs + S3C2410_IICCON); /重新寫IICCON寄存器的值 return 0;static int s3c24xx_i2c_calcd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西華澳商貿職業學院《臨床檢驗儀器》2023-2024學年第二學期期末試卷
- 濟南護理職業學院《嵌入式課程設計》2023-2024學年第二學期期末試卷
- 臨床免疫學檢驗課件 第3章 免疫原和抗血清的制備學習資料
- 西安海棠職業學院《隸書》2023-2024學年第一學期期末試卷
- 江蘇農牧科技職業學院《硬筆書法》2023-2024學年第一學期期末試卷
- 鹽城工業職業技術學院《工商管理級學碩》2023-2024學年第二學期期末試卷
- 二零二五版資金監管委托協議樣本
- 二零二五全新美食城檔口出租協議
- 二零二五版學生托人接送免責協議書范文
- 游戲開發回顧與展望
- 產品QC工程圖 (質量保證工程圖)Excel表格
- 人民醫院人才隊伍建設規劃人才隊伍建設五年規劃
- 電氣平行檢驗用表
- GB∕T 14527-2021 復合阻尼隔振器和復合阻尼器
- 一年級語文下冊課件-21 小壁虎借尾巴24-部編版(15張PPT)
- 患者隨訪率低原因分析以及對策
- DB32∕T 2349-2013 楊樹一元立木材積表
- 首屆上海科技期刊編輯技能大賽試題
- 隧道二襯、仰拱施工方案
- Q∕GDW 12106.4-2021 物聯管理平臺技術和功能規范 第4部分:邊緣物聯代理與物聯管理平臺交互協議規范
- 中國癲癇診療指南-癲癇持續狀態課件
評論
0/150
提交評論