驅(qū)動(dòng)開(kāi)發(fā)-EEPROM讀寫(xiě)技術(shù)_第1頁(yè)
驅(qū)動(dòng)開(kāi)發(fā)-EEPROM讀寫(xiě)技術(shù)_第2頁(yè)
驅(qū)動(dòng)開(kāi)發(fā)-EEPROM讀寫(xiě)技術(shù)_第3頁(yè)
驅(qū)動(dòng)開(kāi)發(fā)-EEPROM讀寫(xiě)技術(shù)_第4頁(yè)
驅(qū)動(dòng)開(kāi)發(fā)-EEPROM讀寫(xiě)技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論