學(xué)習(xí)I2C框架驅(qū)動(dòng)的一點(diǎn)感想
LINUX嵌入式I2C總線常常用于連接傳感器、EEPROM等器件。究其根本,I2C是一種通信協(xié)議,它的目的就是為了實(shí)現(xiàn)信息在遵守I2C協(xié)議的器件間傳輸。因此在使用時(shí)不必想得太復(fù)雜,就把它當(dāng)做通信接口使用。例如正點(diǎn)原子所寫的I2C驅(qū)動(dòng)框架例程,實(shí)現(xiàn)了對AP3216C這種三合一環(huán)境傳感器的數(shù)據(jù)讀取。
這個(gè)驅(qū)動(dòng)程序中,我認(rèn)為它是借助I2C驅(qū)動(dòng)框架,實(shí)現(xiàn)了一個(gè)字符設(shè)備驅(qū)動(dòng)。字符設(shè)備的file_operation中的操作方法,最終是通過調(diào)用i2c_trasfer函數(shù)完成操作命令和從機(jī)地址的發(fā)送。因?yàn)橛玫搅薎2C框架提供的操作函數(shù),因此需要在內(nèi)核中注冊對應(yīng)的I2c驅(qū)動(dòng),并且在用戶空間創(chuàng)建設(shè)備驅(qū)動(dòng)文件,展現(xiàn)為字符設(shè)備驅(qū)動(dòng),以供用戶程序發(fā)送操作命令和接收I傳感器返回信息。
I2c時(shí)序:
i2c總線處于空閑狀態(tài)時(shí),SDA和SCLK都處于高電平。
1、i2c主機(jī)寫數(shù)據(jù)時(shí)序
(1)主機(jī)控制SDA在SCL處于高電平時(shí),從高電平變化為低電平,發(fā)出start信號。
(2)主機(jī)發(fā)出7位從機(jī)地址和1位寫標(biāo)志位,對應(yīng)的從機(jī)接受后會(huì)向主機(jī)反饋一個(gè)ack應(yīng)答
(3)主機(jī)收到ack后,向從機(jī)發(fā)出8位從機(jī)寄存器地址。從機(jī)接受后向主機(jī)發(fā)出應(yīng)答。
(4)主機(jī)接受應(yīng)答后,向從機(jī)發(fā)送數(shù)據(jù),直至寫入完畢,主機(jī)在scl高電平時(shí),將SDA由低拉高,發(fā)出start信號。
2、i2c讀數(shù)據(jù)
(1)主機(jī)控制發(fā)出start信號
(2)主機(jī)發(fā)出7位從機(jī)地址和1位寫標(biāo)志位
(3)主機(jī)發(fā)出8位寄存器地址
(4)主機(jī)從新發(fā)送7位從設(shè)備地址和1位讀標(biāo)志位
(5)主機(jī)接收到ack后,將SDA控制權(quán)交給從機(jī),接受從機(jī)發(fā)送過來的數(shù)據(jù),數(shù)據(jù)傳輸完畢后,主機(jī)向從機(jī)發(fā)出NACK信號,從機(jī)將SDA控制權(quán)還給主機(jī),主機(jī)發(fā)出stop信號。