树莓派使用wiringPi库驱动i2c设备

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

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,树莓派使用wiringpi驱动oled屏幕的具体步骤如下: 1.安装wiringpi 在终端中输入以下命令进行安装: ``` sudo apt-get update sudo apt-get install wiringpi ``` 2.连接oled屏幕 将oled屏幕的SDA和SCL引脚分别连接到树莓派的GPIO2和GPIO3引脚上。 3.编写代码 使用wiringpi编写代码来控制oled屏幕的显示。以下是一个简单的示例: ``` #include <wiringPi.h> #include <wiringPiI2C.h> #define OLED_ADDR 0x3c int fd; void write_cmd(unsigned char cmd) { wiringPiI2CWriteReg8(fd, 0x00, cmd); } void write_data(unsigned char data) { wiringPiI2CWriteReg8(fd, 0x40, data); } void OLED_Init() { write_cmd(0xAE); // display off write_cmd(0x20); // set memory addressing mode write_cmd(0x00); // horizontal addressing mode write_cmd(0x21); // set column address write_cmd(0x00); // start column write_cmd(0x7F); // end column write_cmd(0x22); // set page address write_cmd(0x00); // start page write_cmd(0x07); // end page write_cmd(0xB0); // set page start address write_cmd(0xC8); // flip vertically write_cmd(0x00); // set low column address write_cmd(0x10); // set high column address write_cmd(0x40); // set display start line write_cmd(0x81); // set contrast control write_cmd(0xFF); // set maximum contrast write_cmd(0xA1); // set segment remap write_cmd(0xA6); // set normal display write_cmd(0xA8); // set multiplex ratio write_cmd(0x3F); // set maximum multiplex ratio write_cmd(0xA4); // set display mode write_cmd(0xD3); // set display offset write_cmd(0x00); // set offset to 0 write_cmd(0xD5); // set display clock divide ratio/oscillator frequency write_cmd(0xF0); // set divide ratio and oscillator frequency write_cmd(0xD9); // set pre-charge period write_cmd(0x22); // set pre-charge period to 2 DCLKs write_cmd(0xDA); // set COM pins hardware configuration write_cmd(0x12); // set alternate COM pins write_cmd(0xDB); // set VCOMH write_cmd(0x40); // set VCOMH to 0.83 VCC write_cmd(0x8D); // set charge pump write_cmd(0x14); // enable charge pump write_cmd(0xAF); // display on } void OLED_Clear() { int i, j; for (i = 0; i < 8; i++) { write_cmd(0xB0 + i); write_cmd(0x00); write_cmd(0x10); for (j = 0; j < 128; j++) { write_data(0x00); } } } void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *str) { unsigned char c = 0, i = 0, j = 0; while (str[j] != '\0') { c = str[j] - 32; if (x > 120) { x = 0; y++; } write_cmd(0xB0 + y); write_cmd((x & 0x0F) | 0x10); write_cmd((x >> 4) | 0x00); for (i = 0; i < 8; i++) { write_data(pgm_read_byte(font8x16 + c * 16 + i)); } write_cmd(0xB0 + y); write_cmd((x & 0x0F) | 0x10); write_cmd((x >> 4) | 0x00); for (i = 8; i < 16; i++) { write_data(pgm_read_byte(font8x16 + c * 16 + i)); } x += 8; j++; } } int main(int argc, char **argv) { if (wiringPiSetup() < 0) { fprintf(stderr, "Failed to setup wiringPi\n"); return 1; } if ((fd = wiringPiI2CSetup(OLED_ADDR)) < 0) { fprintf(stderr, "Failed to setup I2C device: %s\n", strerror(errno)); return 1; } OLED_Init(); OLED_Clear(); OLED_ShowString(0, 0, "Hello, world!"); return 0; } ``` 这段代码实现了oled屏幕的初始化、清屏和显示字符串等功能。 4.编译运行 在终端中输入以下命令进行编译: ``` gcc -o oled oled.c -lwiringPi ``` 然后运行程序: ``` sudo ./oled ``` 此时,oled屏幕应该可以显示出“Hello, world!”这个字符串了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freemote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值