linux I2C讀寫執行個體

來源:互聯網
上載者:User

      這段時間搞一個電容觸控螢幕,經過實驗摸索終於試出來了,因為以前是沒有專門搞過這塊的,這下積攢了十足的經驗。有兩個關鍵地方做下說明:

(1)I2C器件讀寫函數。時序如下:

根據特性,我沒有使用smbus的讀寫函數,還是用的I2C讀寫函數來處理:

static struct i2c_client *g_client;             //本I2C器件註冊的client端

static int GW8158_read_register_packet(u8 bufp[13])   //讀13個位元組,用數組傳出
{
                int ret = 0,count = 0;
                u8 buffer[13];
                unsigned long flags;
                spinlock_t *lock = get_i2c_lock();   //獲得I2C的自旋鎖
                if((g_client == NULL)||(lock == NULL))
                         return -1;

                spin_lock_irqsave(lock,flags);      //I2C操作的自旋鎖
                ret = i2c_master_recv(g_client,buffer,13); //預設會寫器件地址,由於沒有子地址,直接接收
                spin_unlock_irqrestore(lock, flags);
                if(ret > 0)
                {
                          for(count = 0;count < 13; count ++)
                                     bufp[count] = buffer[count];    //如果讀成功,回傳寄存器值
                          printk("GW8158_read_register_packet OK /n");
                 }
                 return ret;
}
static int GW8158_write_register_Byte(const u8 subAddress, u8 bufP)
{
                int ret;
                u8 buffer[2];
                unsigned long flags;
                spinlock_t *lock = get_i2c_lock();
                if((g_client == NULL)||(lock == NULL))
                           return -1;

                buffer[0] = subAddress;
                buffer[1] = bufP;
                spin_lock_irqsave(lock,flags);
                if(i2c_master_send(g_client,buffer,1)<0)     //寫一次子地址。這次寫只是驗證是否通訊成功。因為沒有資料,所以就算
                           return -1;                                          //寫成功了也不會有意義。不會影響後面真正的寫控制。

                ret = i2c_master_send(g_client,buffer,2);    //才開始寫一次子地址和資料
                spin_unlock_irqrestore(lock,flags);
                if(ret > 0)
                                printk("GW8158_write_register_Byte OK /n");
                return ret;
}
(2)複位部分。

本身是高複位,所以要有一個從低到高的時序,但是不能一直為高,否則會一直複位,得拉低。如下:

      pxa3xx_outgpio_set_level(MFP_TS_GW8158_RST, GPIO_LEVEL_LOW);
      mdelay(30);
      pxa3xx_outgpio_set_level(MFP_TS_GW8158_RST, GPIO_LEVEL_HIGH);
      mdelay(20);
      pxa3xx_outgpio_set_level(MFP_TS_GW8158_RST, GPIO_LEVEL_LOW);
      mdelay(1000);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.