2016年2月24日 星期三

wiringpi to access i2c



Before you can use the I2C interface, you may need to use the gpio utility to load the I2C drivers into the kernel:
gpio load i2c

如果訊息如下:  要去  把   device-tree 的功能關掉....




sudo raspi-config  ->Advance options ->  Device tree disable  and I2C enable

sudo reboot

再輸入一次  ...看看能不能用
gpio load i2c

如果訊息如下....就代表可以


他抓到的 裝置為   /dev/i2c-1


如果要確定i2c 的裝置有沒有連上去...可以打

i2cdetect -y 1
可以看到i2c 的 device number


可以看到目前i2c 的裝置號碼為 0x53.....(AXDL345)


gpio load i2c 1000
will set the baud rate to 1000Kbps – ie. 1,000,000 bps. (K here is times 1000)


sample code 如下:  以   grove rgb lcd 為例子
==================================================

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <wiringPiI2C.h>   // 要多加這個函式庫
#include <string.h>


class rgb_lcd {
     public:
     rgb_lcd(int fd_rgb, int fd_text);
      int FD_RGB_ADDR ;
      int FD_TEXT_ADDR ;
      void setRGB(int r,int g,int b);
      void textCommand(int cmd);
      void setText(char* text);
};

rgb_lcd::rgb_lcd(int fd_rgb, int fd_text)
{
    FD_RGB_ADDR = fd_rgb;
    FD_TEXT_ADDR = fd_text;
}

void rgb_lcd::setRGB(int r ,int g ,int b)
{
      wiringPiI2CWriteReg8(FD_RGB_ADDR,0,0);
      wiringPiI2CWriteReg8(FD_RGB_ADDR,1,0);
      wiringPiI2CWriteReg8(FD_RGB_ADDR,0x08,0xaa);
      wiringPiI2CWriteReg8(FD_RGB_ADDR,4,r);
      wiringPiI2CWriteReg8(FD_RGB_ADDR,3,g);
      wiringPiI2CWriteReg8(FD_RGB_ADDR,2,b);
}

void rgb_lcd::textCommand(int cmd)
{
    wiringPiI2CWriteReg8 (FD_TEXT_ADDR, 0x80, cmd) ;
}

void rgb_lcd::setText(char *text)
{
        textCommand(0x01); // clear display
        delay(50);
        textCommand(0x08 | 0x04); // display on, no cursor
        textCommand(0x28);// 2 lines
        delay(50);
        int count = 0;
        int row = 0;
        //for c in text:
        int lens = strlen(text);
        for(int i =0;i< lens;i++)
        {
            char c = text[i];
            if ( (c == '\n') || (count == 16))
            {
               count = 0;
               row += 1;
               if (row == 2)
                  break;
               textCommand(0xc0);
               if(c == '\n')
                  continue;
            }
            count++;
            wiringPiI2CWriteReg8(FD_TEXT_ADDR,0x40,c);
        }
}


int main (void)
{
  int  fd_rgb, fd_text;
  int DISPLAY_RGB_ADDR = 0x62;
  int DISPLAY_TEXT_ADDR = 0x3e;
  fd_rgb  = wiringPiI2CSetup(DISPLAY_RGB_ADDR);
  fd_text = wiringPiI2CSetup(DISPLAY_TEXT_ADDR);

  if(fd_rgb==-1){
       printf("I2C setup error");
      return 0;}

  if(fd_text==-1){
       printf("I2C setup error");
       return 0;  }

 rgb_lcd  lcd(fd_rgb,fd_text);
  lcd.setRGB(128,128,128);
  lcd.setText("Hello world");
}


Reference : http://wiringpi.com/reference/i2c-library/