首先送上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设备完成。