




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、EEPROM讀寫(xiě)技術(shù)一、 確定任務(wù)1、 掌握基本的字符設(shè)備的驅(qū)動(dòng)程序設(shè)計(jì)。2、 掌握基本的文件操作。3、 掌握在操作系統(tǒng)下的IIC驅(qū)動(dòng)程序的原理。二、 學(xué)習(xí)內(nèi)容 1、 閱讀S5PV210數(shù)據(jù)手冊(cè),熟悉IIC控制器的原理。2、 熟悉EEPROM器件FM24CL04的數(shù)據(jù)手冊(cè)。3、 編寫(xiě)makefile文件。4、 下載并調(diào)試操作FM24CL04的應(yīng)用程序。三、基礎(chǔ)知識(shí)1、 硬件原理:a) 原理圖:·b) 寄存器簡(jiǎn)介:· 系統(tǒng)框圖:I2C控制器的主要作用是在SCL時(shí)鐘的同步下,將數(shù)據(jù)逐位移出IO引腳。I2C時(shí)序圖請(qǐng)讀者自行查看FM24CL04數(shù)據(jù)手冊(cè)。寄存器I2CCON主要最用是
2、設(shè)置分頻比。I2CSTAT狀態(tài)寄存器主要用于設(shè)置控制器的工作模式,設(shè)置起始與結(jié)束條件。I2CADD地址寄存器,用于保存從機(jī)地址。I2CDS數(shù)據(jù)移位寄存器,主要用于發(fā)送和接收數(shù)據(jù)。四、基本原理1、 I2C協(xié)議介紹:請(qǐng)讀者詳細(xì)查看AT24C系列EERPOM的數(shù)據(jù)手冊(cè)及IIC總線規(guī)范相關(guān)資料。2、 驅(qū)動(dòng)原理:a) Linux系統(tǒng)對(duì)I2C總線具有很好的支持。與硬件物理連接相對(duì)應(yīng)的,Linux的I2C框架中各個(gè)部分的關(guān)系如下圖所示:b) 從上圖中,可以看出 Linux中,IIC的實(shí)現(xiàn)結(jié)構(gòu)分為四個(gè)層次:· IIC核心服務(wù)層,圖中i2c-core的地方,具體的實(shí)現(xiàn)代碼文件是在 /$(K
3、ERNEL_DIR)/drivers/i2c/i2c-core.c中。這一層主要的功能是向上、下兩層提供設(shè)備管理的服務(wù),這些服務(wù)與具體的硬件底層無(wú)關(guān),下層的IIC總線控制器驅(qū)動(dòng)(圖中Adapter)可以調(diào)用它的核心服務(wù)來(lái)向系統(tǒng)加入對(duì)該IIC總線的支持。而上層的具體與連接在該總線上的設(shè)備,如EEPROM,通訊的驅(qū)動(dòng)程序可以調(diào)用核心層的服務(wù)與硬件設(shè)備進(jìn)行讀寫(xiě)等通訊。從這里我們可以看出這層主要起一個(gè)橋接的作用。· IIC總線驅(qū)動(dòng)層,圖中Adapter的地方,在GEC210實(shí)驗(yàn)板上,具體的實(shí)現(xiàn)代碼文件是在/$(KERNEL_DIR)/drivers/i2c/busses/i2c-s3c241
4、0.c中。這一層主要實(shí)現(xiàn)對(duì)具體的IIC總線控制器的驅(qū)動(dòng)。具體控制器芯片的IIC控制方式不同,所以對(duì)不同的控制器要有不同的驅(qū)動(dòng),而對(duì)S5PV210 CPU來(lái)講,它的驅(qū)動(dòng)就是i2c-s3c2410.c。該文件主要實(shí)現(xiàn)對(duì)控制器的初始化,然后調(diào)用核心服務(wù)層把S5PV210的IIC總線加入到 Linux Kernel中。· IIC設(shè)備驅(qū)動(dòng)層,圖中client和i2c-dev的地方,具體的實(shí)現(xiàn)代碼在/$(KERNEL)/drivers/i2c/i2c-dev.c和/$(KERNEL)/drivers/i2c/chips目錄下的文件。這一層主要是調(diào)用核心服務(wù)層實(shí)現(xiàn)對(duì)在總線上的設(shè)備的操作。另外實(shí)現(xiàn)了
5、提供給用戶級(jí)應(yīng)用程序的用戶操作總線的接口,如read、write和ioctl等。在GEC210實(shí)驗(yàn)板中,i2c-dev.c實(shí)現(xiàn)的字符設(shè)備名為:/dev/i2c/0。表示的是系統(tǒng)的IIC總線0。應(yīng)用程序可以通過(guò)該設(shè)備對(duì)這條總線上的設(shè)備進(jìn)行控制。· 用戶應(yīng)用程序,圖中program的地方,實(shí)驗(yàn)中具體的對(duì)EEPROM的測(cè)試程序的讀寫(xiě)測(cè)試程序是I2c_test.c。該應(yīng)用程序,打開(kāi) /dev/i2c/0設(shè)備,通過(guò)ioctl對(duì)EEPROM地址進(jìn)行設(shè)置。然后調(diào)用write系統(tǒng)調(diào)用寫(xiě)EEPROM,再調(diào)用read 讀EEPROM對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)。五、代碼設(shè)計(jì) 3、 驅(qū)動(dòng)代碼簡(jiǎn)析(詳細(xì)代碼請(qǐng)讀者查看/d
6、river/i2c/i2c-dev.c文件) ,I2C主控設(shè)備驅(qū)動(dòng)程序節(jié)點(diǎn),實(shí)現(xiàn)字符設(shè)備的打開(kāi)、關(guān)閉、讀/寫(xiě)、ioctrl等函數(shù)a) 設(shè)備注冊(cè)函數(shù)static int _init i2c_dev_init(void)res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops); /注冊(cè)名為“I2C”的設(shè)備i2c_dev_class = class_create(THIS_MODULE, "i2c-dev"); /創(chuàng)建I2C類設(shè)備res = i2c_add_driver(&i2cdev_driv
7、er); /注冊(cè)I2C總線驅(qū)動(dòng)程序釋放設(shè)備函數(shù):static void _exit i2c_dev_exit(void)i2c_del_driver(&i2cdev_driver);class_destroy(i2c_dev_class);unregister_chrdev(I2C_MAJOR, "i2c");打開(kāi)設(shè)備函數(shù):static int i2cdev_open(struct inode *inode, struct file *file)unsigned int minor = iminor(inode); /得到次設(shè)備號(hào)i2c_dev = i2c_dev_
8、get_by_minor(minor); /通過(guò)次設(shè)備號(hào)找到相應(yīng)設(shè)備adap = i2c_get_adapter(i2c_dev->adap->nr); /得到與該次設(shè)備相關(guān)聯(lián)的IIC總線設(shè)配器client->adapter = adap;file->private_data = client; /傳遞給ioctl控制設(shè)備函數(shù):static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)struct i2c_client *client = file->privat
9、e_data; /open函數(shù)傳遞過(guò)來(lái)switch (cmd) case I2C_SLAVE: /不適用了,為了向前兼容case I2C_SLAVE_FORCE:case I2C_TENBIT: /設(shè)置標(biāo)志,啟動(dòng)(禁止)10位模式if (arg)client->flags |= I2C_M_TEN;elseclient->flags &= I2C_M_TEN;return 0;return 0;讀設(shè)備函數(shù):static ssize_t i2cdev_read(struct file *file, char _user *buf, size_t count,loff_t *o
10、ffset)struct i2c_client *client = file->private_data; /open函數(shù)傳遞ret = i2c_master_recv(client, tmp, count); /啟動(dòng)總線,從器件讀數(shù)據(jù)ret = copy_to_user(buf, tmp, count) ? -EFAULT : ret; /將讀取的數(shù)據(jù)返回給用戶空間寫(xiě)設(shè)備函數(shù):static ssize_t i2cdev_write(struct file *file, const char _user *buf,size_t count, loff_t *offset)struct i
11、2c_client *client = file->private_data;if (copy_from_user(tmp, buf, count) /將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間ret = i2c_master_send(client, tmp, count); /啟動(dòng)總線,將要寫(xiě)的數(shù)據(jù)發(fā)送到器件1、 drivers/i2c/i2c-core.c,I2C核心驅(qū)動(dòng)程序,實(shí)現(xiàn)I2C設(shè)備(包括I2C總線適配器和I2C從設(shè)備)的注冊(cè)、刪除、通信等功能,主要函數(shù)如下:int i2c_add_driver(struct i2c_driver *driver),注冊(cè)IIC總線驅(qū)動(dòng)程序。int i2
12、c_add_adapter(struct i2c_adapter *adap),注冊(cè)I2C控制器。int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num),啟動(dòng)I2C總線,進(jìn)行具體的讀寫(xiě)操作。2、 drivers/i2c/busses/i2c-s3c2410.c,針對(duì)S5PV210的I2C控制器的驅(qū)動(dòng)程序,主要代碼如下:a) 在調(diào)用 driver_register()的過(guò)程中,當(dāng)找到一個(gè)合適的設(shè)備后,總線驅(qū)動(dòng)程序調(diào)用該函數(shù):static int s3c24xx_i2c_probe(struct devi
13、ce *dev).i2c->clk = clk_get(&pdev->dev, "i2c");clk_enable(i2c->clk); /使能I2C控制器的時(shí)鐘i2c->ioarea = request_mem_region(res->start, (res->end-res->start)+1, pdev->name); .i2c->regs = ioremap(res->start, (res->end-res->start)+1); /映射寄存器,從物理空間映射到虛擬空間.ret = s
14、3c24xx_i2c_init(i2c); /初始化.ret = request_irq(i2c->irq, s3c24xx_i2c_irq, IRQF_DISABLED, dev_name(&pdev->dev), i2c); /向系統(tǒng)申請(qǐng)中斷ret = i2c_add_numbered_adapter(&i2c->adap);/向內(nèi)核注冊(cè)IIC適配器b) IIC控制器初始化函數(shù): static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c)unsigned long iicon = S3C2410_IICCON_
15、IRQEN | S3C2410_IICCON_ACKEN;pdata->cfg_gpio(to_platform_device(i2c->dev); /設(shè)置GPIO口的功能為SDA和SCLwriteb(pdata->slave_addr, i2c->regs + S3C2410_IICADD); /設(shè)置控制器的從機(jī)地址writel(iicon, i2c->regs + S3C2410_IICCON);if (s3c24xx_i2c_clockrate(i2c, &freq) != 0) /設(shè)置時(shí)鐘writel(0, i2c->regs + S3C24
16、10_IICCON);dev_err(i2c->dev, "cannot meet bus frequency requiredn");return -EINVAL;中斷函數(shù):static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id)status = readl(i2c->regs + S3C2410_IICSTAT); /讀IIC狀態(tài)i2s_s3c_irq_nextbyte(i2c, status); 根據(jù)狀態(tài)進(jìn)行下一步的處理,如繼續(xù)讀、寫(xiě)或終止總線的操作 c) 重要數(shù)據(jù)結(jié)構(gòu):/* i2c bus r
17、egistration info */static const struct i2c_algorithm s3c24xx_i2c_algorithm = .master_xfer= s3c24xx_i2c_xfer,/IIC總線通信傳輸算法,管理IIC控制器,實(shí)現(xiàn)IIC總線數(shù)據(jù)的發(fā)送和接收.functionality= s3c24xx_i2c_func,;3、 驅(qū)動(dòng)程序的編譯:a) 進(jìn)入內(nèi)核目錄,#make menuconfig -I2C support然后按下圖進(jìn)行設(shè)置:進(jìn)入I2C Hardware Bus support:b) 編譯生成內(nèi)核鏡像,將其燒寫(xiě)到實(shí)驗(yàn)箱上。4、 測(cè)試代碼編寫(xiě):#d
18、efine CHIP_ADDR 0x50#define PAGE_SIZE0x08#define I2C_DEV_PATH "/dev/i2c/0" /設(shè)備路徑static int read_eeprom(int fd, char buff, int addr, int count)int res;if(write(fd, &addr, 1) != 1)return -1;res=read(fd, buff, count);printf("read %d byte at 0x%.2xn", res, addr);return res;static
19、 int write_eeprom(int fd, char buff, int addr, int count)int res;int i;char sendbufferPAGE_SIZE+1;memcpy(sendbuffer+1, buff, count);sendbuffer0=addr; res= write(fd, sendbuffer, count+1); printf("write %d byte at 0x%.2xn", res ,addr);int main(void)int fd, n, res;unsigned char bufPAGE_SIZE;f
20、d = open(I2C_DEV_PATH, O_RDWR); /打開(kāi)I2C設(shè)備if(fd < 0)printf("#i2c test device open fail#n");return (-1);printf("success, i2c open file device %d n",fd);res = ioctl(fd, I2C_TENBIT,0);/設(shè)置不使用10位地址模式res = ioctl(fd, I2C_SLAVE_FORCE, CHIP_ADDR);/設(shè)置從器件的地址printf("ioctl I2C_SLAVE_FORCE msg NO:%dn",res);for(n=0; n<PAGE_SIZE; n+)bufn=n;write_eeprom(f
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年度山西老區(qū)職業(yè)技術(shù)學(xué)院?jiǎn)握小段锢怼纺芰μ嵘鼴卷題庫(kù)附答案詳解【預(yù)熱題】
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)集錦
- 【優(yōu)化方案】2025-2026學(xué)年高二物理(RJ.選修3-1):第二章第一節(jié)知能演練輕松闖關(guān)
- 建設(shè)單位管理行為檢查表
- 浙江省2025年房地產(chǎn)經(jīng)紀(jì)人《制度與政策》基礎(chǔ):不動(dòng)產(chǎn)登記簿模擬試題
- 特殊教育讀書(shū)感
- 管理人員安全教育培訓(xùn)
- 百草枯中毒患者的護(hù)理
- 現(xiàn)代物流管理專業(yè)教學(xué)標(biāo)準(zhǔn)(高等職業(yè)教育??疲?025修訂
- 腫瘤介入術(shù)前健康指導(dǎo)
- GB/T 27806-2011環(huán)氧瀝青防腐涂料
- GB/T 17949.1-2000接地系統(tǒng)的土壤電阻率、接地阻抗和地面電位測(cè)量導(dǎo)則第1部分:常規(guī)測(cè)量
- 夢(mèng)幻西游古龍服務(wù)端安裝教程
- 《出生醫(yī)學(xué)證明》單親母親情況聲明
- 4配電柜安全風(fēng)險(xiǎn)點(diǎn)告知牌
- 旋挖機(jī)操作手知識(shí)試卷含參考答案
- GB∕T 22590-2021 軋鋼加熱爐用耐火澆注料
- 研發(fā)部程序文件bom管理
- 大件運(yùn)輸管理制度
- Q∕GDW 11445-2015 國(guó)家電網(wǎng)公司管理信息系統(tǒng)安全基線要求
- 材料科學(xué)基礎(chǔ) 第2章 晶體結(jié)構(gòu)
評(píng)論
0/150
提交評(píng)論