Linux下讀寫芯片的I2C寄存器

要想在Linux下讀寫芯片的I2C寄存器,通常須要在Linux編寫一份該芯片的I2C驅動,關於Linux下如何編寫I2C驅動,前一篇文章《手把手教你寫Linux I2C設備驅動》已經作了初步的介紹,而且留下了兩個疑問還沒有解決,第一個是如何對Linux提供的I2C操做函數進行進一步封裝,實現對芯片寄存器的讀寫;另外一個是如何在用戶空間調用該I2C驅動代碼。本文將討論前一個問題。linux

    

首先,咱們要了解Linux系統提供的I2C操做函數怎麼使用,上篇文章已經提到過,對I2C設備的讀寫,Linux系統提供了多種接口,這些接口能夠在內核的 i2c.h 中找到,這裏我主要介紹下面這組讀寫接口:微信

 

extern int i2c_master_send(struct i2c_client *,const char* ,int);    
   
extern int i2c_master_recv(struct i2c_client *,char* ,int);

    

第一個參數是 i2c_client 對象指針,第二個參數是要傳輸的數據buffer指針,第三個參數爲buffer的大小。函數

    

接口函數已經有了,下面咱們要解決的問題就是以何種形式/規則去使用這些接口才能正確地讀寫芯片的相關寄存器。學習

    

首先,咱們須要查詢芯片手冊,找到芯片手冊中,關於寄存器的I2C讀寫時序,其實,大多數芯片的I2C寄存器的讀寫時序都是同樣的,下面我仍是以手頭的TVP5158芯片爲例。ui

    

首先分析寫操做,該芯片的手冊中給出的I2C寄存器寫時序圖以下:.net

 

    

從上圖能夠看出,真正須要執行寫操做的有兩處,Step4 和 Step6 ,Step4首先寫入寄存器的偏移地址,而Step6則是寫入到該寄存器的值。由此已經很清楚了,對於寫I2C寄存器,咱們須要作的就是給 i2c_master_send 函數傳入兩個字節的數據便可,第一個字節爲寄存器的地址,第二個字節爲要寫入寄存器的數據。示例以下:指針

 

static int tvp5158_i2c_write( struct i2c_client* client,uint8_t reg,uint8_t data)  
{  
    unsigned char buffer[2];  
      
    buffer[0] = reg;  
    buffer[1] = data;  
      
    if( 2!= i2c_master_send(client,buffer,2) ) {  
        printk( KERN_ERR " tvp5158_i2c_write fail! \n" );  
        return -1;  
    }      
    return 0;  
}

    

其實挺簡單的,沒有什麼複雜的代碼。下面再看看讀時序。對象

 

     

由上圖能夠,讀時序須要作的操做是,先向I2C總線上寫入須要讀的寄存器地址,而後讀I2C總線上的值。代碼寫起來也不難,示例以下:blog

 

static int tvp5158_i2c_read( struct i2c_client* client,uint8_t reg,uint8_t *data)  
{  
    // write reg addr     
    if( 1!= i2c_master_send(client,&reg,1) ) {  
        printk( KERN_ERR " tvp5158_i2c_read fail! \n" );  
        return -1;  
    }      
    // wait  
    msleep(10);  
    // read  
    if( 1!= i2c_master_recv(client,data,1) ) {  
        printk( KERN_ERR " tvp5158_i2c_read fail! \n" );  
        return -1;  
    }      
      
    return 0;  
}

    

到此爲止,Linux下具體如何封裝讀寫芯片寄存器的方法已經介紹完畢,其實並不複雜,但願對初學者有所幫助,文中有什麼講述不正確的地方,歡迎留言或者來信lujun.hust@gmail.com交流。接口

 

總結和說明

   

免費學習更多精品課程,登陸樂搏學院官網http://www.learnbo.com/

或關注咱們的官方微博微信,還有更多驚喜哦~

 

 

本文出自 「Jhuster的專欄」 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/760965

相關文章
相關標籤/搜索