当前位置 博文首页 > freemote的博客:树莓派使用wiringPi库驱动i2c设备

    freemote的博客:树莓派使用wiringPi库驱动i2c设备

    作者:[db:作者] 时间:2021-07-18 19:11

    首先送上wiringPi库关于i2c的介绍:http://wiringpi.com/reference/i2c-library/

    1、首先查看wiringPi库I2C相关的函数:

    int wiringPiI2CSetup (int devId) ;初始化wiringPi库i2c,devId是i2c设备地址,返回值是linux的文件描述符

    int wiringPiI2CRead (int fd) ;直接读取数据,fd是wiringPiI2CSetup函数的返回值,返回值是读到的数据

    int wiringPiI2CWrite (int fd, int data) ;直接写数据,fd同上,data是写入的数据

    int wiringPiI2CWriteReg8 (int fd, int reg, int data) ;写数据到8位寄存器,fd同上,reg寄存器地址,data要写入的数据

    int wiringPiI2CWriteReg16 (int fd, int reg, int data) ;写数据到16位寄存器,fd同上,reg寄存器地址,data要写入的数据

    int wiringPiI2CReadReg8 (int fd, int reg) ;从寄存器读取8位数据,fd同上,reg寄存器地址,返回值读取到的数据

    int wiringPiI2CReadReg16 (int fd, int reg) ;从寄存器读取16位数据,fd同上,reg寄存器地址,返回值读取到的数据

    2、设备相关信息

    在这里,以罗姆的低功耗气压传感器BM1383AGLV为例说明,关于传感器更多信息,查看罗姆(ROHM)低功耗气压传感器BM1383AGLV了解。

    3、编程

    分两个文件展开 i2c_bm1383.h 和i2c_bm1383.c,i2c_bm1383.h是关于传感器的宏定义,i2c_bm1383.c里面是主要的驱动代码。

    i2c_bm1383.h文件详细代码:

    #ifndef __I2C_BM1383_H__
    #define __I2C_BM1383_H__
    
    #include <stdio.h>
    #include <stdbool.h>
    
    typedef signed char int8_t;
    typedef unsigned char uint8_t;
    typedef signed int int16_t;
    typedef unsigned int uint16_t;
    typedef signed long int int32_t;
    typedef unsigned long int uint32_t;
    typedef signed long long int int64_t;
    typedef unsigned long long int uint64_t;
    
    #define BM1383AGLV_I2C_ADDR          0x5D
     
    #define BM1383AGLV_ID1               0x0F
    #define BM1383AGLV_ID2               0x10
     
    #define BM1383AGLV_PWR_DOWN          0x12
              //PWR_DOWN[0]
            #define POWER_DOWN                  0x00
            #define ACTIVE                      0x01 
              //Reserved[7:1]
     
    #define BM1383AGLV_RESET             0x13
              //RSTB[0]
            #define MEASUREMENT_RESET           0x00
            #define MEASUREMENT_ACTIVE          0x01
              //Reserved[7:1]
     
    #define BM1383AGLV_MODE_CONTROL      0x14
              //mode [1:0]
            #define  MODE_STAND_BY              0x00
            #define  MODE_ONE_SHOT              0x01
            #define  MODE_CONTINUOUS            0x02
            #define  MODE_PROHIBITION           0x03
              //Reserved[2]
              //Reserved[3]
            #define  DEFAULT_1                  0x08
              //DRDY pin Enable[4]
            #define  DRDY_PIN_ENABLE            0x10
            #define  DRDY_PIN_DISABLE           0x00
              //Set the average number of measurement data[7:5]
            #define  AVE_NUM_1                  0x00
            #define  AVE_NUM_2                  0x20
            #define  AVE_NUM_4                  0x40
            #define  AVE_NUM_8                  0x60
            #define  AVE_NUM_16                 0x80
            #define  AVE_NUM_32                 0xA0
            #define  AVE_NUM_64                 0xC0
            #define  AVE_NUM_INHIBIT            0xE0
     
    #define BM1383AGLV_STATUS            0x19
              //Pressure and temperature measurement data ready bit[0]
            #define DATA_OUTPUT_AVAILABLE       0x01
            #define DATA_OUTPUT_NOT_AVAILABLE   0x00
              //Reserved[7:1]
     
    #define BM1383AGLV_PRESSURE_MSB      0x1A
    #define BM1383AGLV_PRESSURE_LSB      0x1B
    #define BM1383AGLV_PRESSURE_DEC      0x1C
              //Pressure data output (decimal extension 6bit)[7:2]
              //Reserved[1:0]
     
    #define BM1383AGLV_TEMPERATURE_MSB   0x1D
    #define BM1383AGLV_TEMPERATURE_LSB   0x1E
    
    
    bool BM1383AGLVCheck(void);
    void BM1383AGLVInit(void);
    void BM1383AGLVRead(void);
    
    
    
    #endif
    

    i2c_bm1383.c文件详细代码:

    #include <wiringPi.h>
    #include <wiringPiI2C.h>
    
    #include "i2c_bm1383.h"
    
    
    int i2c_fd;
    
    bool BM1383AGLVCheck(void)
    {
      uint16_t chip_id=0;
      
      chip_id=wiringPiI2CReadReg16(i2c_fd,BM1383AGLV_ID1);
        
      if(chip_id==0x32E0)
      {
        return true;
      }
      else
      {
        return false;
      }
    }
    
    void BM1383AGLVInit(void)
    {
        wiringPiI2CWriteReg8(i2c_fd,BM1383AGLV_PWR_DOWN,ACTIVE);      //设置芯片上电
        delay(5);//延时必须大于2ms
        wiringPiI2CWriteReg8(i2c_fd,BM1383AGLV_RESET,MEASUREMENT_ACTIVE);     //启动测量功能
        wiringPiI2CWriteReg8(i2c_fd,BM1383AGLV_MODE_CONTROL,MODE_CONTINUOUS
                                                            |DEFAULT_1
                                                            |DRDY_PIN_DISABLE
                                                            |AVE_NUM_8);     
        //持续测量模式、每次测量8次、不使能DRDY引脚 
    }
    
    void BM1383AGLVRead(void)
    {
        uint32_t pressure_count=0;
        uint8_t pressure_m , pressure_l,pressure_d;
        float pressure;
    	 
        uint32_t temperture_count=0;
        uint8_t temperture_m , temperture_l;
        float temperture;
    	 
       while(wiringPiI2CReadReg8(i2c_fd,BM1383AGLV_STATUS)&DATA_OUTPUT_AVAILABLE!=DATA_OUTPUT_AVAILABLE);//等待当前测量完成
    	  
        pressure_m=wiringPiI2CReadReg8(i2c_fd,BM1383AGLV_PRESSURE_MSB);
        pressure_l=wiringPiI2CReadReg8(i2c_fd,BM1383AGLV_PRESSURE_LSB);
        pressure_d=wiringPiI2CReadReg8(i2c_fd,BM1383AGLV_PRESSURE_DEC);
    	  
        pressure_d=pressure_d>>2;//高6位有效
    	  
        pressure_count=pressure_m<<14;
        pressure_count+=pressure_l<<6;
        pressure_count+=pressure_d;
    	 
        pressure=pressure_count/2048.0;
    	 	 
        temperture_m=wiringPiI2CReadReg8(i2c_fd,BM1383AGLV_TEMPERATURE_MSB);
        temperture_l=wiringPiI2CReadReg8(i2c_fd,BM1383AGLV_TEMPERATURE_LSB);
    	  
        temperture_count=temperture_m<<8;
        temperture_count+=temperture_l;
    	  
        temperture=temperture_count/32.0;
    	  
        printf("Pressure:%.2f hPa  Temperture:%f ℃\n",pressure,temperture); 
    }
    
    int main()
    {
        bool isexist;
    
        wiringPiSetup(); //初始化wiringPi库
        i2c_fd = wiringPiI2CSetup(BM1383AGLV_I2C_ADDR);
    
        while(!BM1383AGLVCheck())
        {
        	printf("no exist\n" );
        	delay(5000);
        }    	
        printf("exist\n" );
        
        BM1383AGLVInit();
    
        while(1)
        {
    	BM1383AGLVRead();
        
        	delay(5000);
    
        	printf("\n");
        }
    
        return 0;
    }
    

    4、编译

    gcc -o i2c_bm1383 i2c_bm1383.c i2c_bm1383.h -lwiringPi

    5、查看结果

    至此,树莓派使用wiringPi库驱动i2c设备完成。

    cs