基于嵌入式linux iic 总线读写mpu6050

来源:互联网 发布:js new date 减一天 编辑:程序博客网 时间:2024/05/22 16:39
/************************************************************///文件名:mpu6050.c//功能:测试linux下iic读写mpu6050程序//使用说明: (1)//          (2)//          (3)//          (4)//作者:huangea//日期:2016-10-03/************************************************************/ //包含头文件#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/ioctl.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<sys/select.h>#include<sys/time.h>#include<errno.h> //宏定义 #defineSMPLRT_DIV0x19#defineCONFIG0x1A#defineGYRO_CONFIG0x1B#defineACCEL_CONFIG0x1C#defineACCEL_XOUT_H0x3B#defineACCEL_XOUT_L0x3C#defineACCEL_YOUT_H0x3D#defineACCEL_YOUT_L0x3E#defineACCEL_ZOUT_H0x3F#defineACCEL_ZOUT_L0x40#defineTEMP_OUT_H0x41#defineTEMP_OUT_L0x42#defineGYRO_XOUT_H0x43#defineGYRO_XOUT_L0x44#defineGYRO_YOUT_H0x45#defineGYRO_YOUT_L0x46#defineGYRO_ZOUT_H0x47#defineGYRO_ZOUT_L0x48#definePWR_MGMT_10x6B#defineWHO_AM_I0x75#defineSlaveAddress0xD0 #define Address 0x68                  //MPU6050地址 #define I2C_RETRIES   0x0701#define I2C_TIMEOUT   0x0702#define I2C_SLAVE     0x0703       //IIC从器件的地址设置#define I2C_BUS_MODE   0x0780 typedef unsigned char uint8; int fd = -1; //函数声明static uint8 MPU6050_Init(void);static uint8 i2c_write(int fd, uint8 reg, uint8 val);static uint8 i2c_read(int fd, uint8 reg, uint8 *val);static uint8 printarray(uint8 Array[], uint8 Num);  //MPU6050初始化static uint8 MPU6050_Init(void){fd = open("/dev/i2c-0", O_RDWR);   // open file and enable read and  write if(fd < 0){perror("Can't open /dev/MPU6050 \n"); // open i2c dev file failexit(1);}printf("open /dev/i2c-0 success !\n");   // open i2c dev file succes if(ioctl(fd, I2C_SLAVE, Address)<0) {    //set i2c address printf("fail to set i2c device slave address!\n");close(fd);return -1;}printf("set slave address to 0x%x success!\n", Address); i2c_write(fd,PWR_MGMT_1,0X00);    i2c_write(fd,SMPLRT_DIV,0X07); i2c_write(fd,CONFIG,0X06); i2c_write(fd,ACCEL_CONFIG,0X01);  return(1);}   //MPU6050 wirte bytestatic uint8 i2c_write(int fd, uint8 reg, uint8 val){int retries;uint8 data[2]; data[0] = reg;data[1] = val;for(retries=5; retries; retries--) {if(write(fd, data, 2)==2)return 0;usleep(1000*10);}return -1;} //MPU6050 read bytestatic uint8 i2c_read(int fd, uint8 reg, uint8 *val){int retries; for(retries=5; retries; retries--)if(write(fd, &reg, 1)==1)if(read(fd, val, 1)==1)return 0;return -1;} //get datashort GetData(unsigned char REG_Address){char H,L;i2c_read(fd, REG_Address, &H);i2c_read(fd, REG_Address + 1, &L); return (H<<8)+L;}// mainint main(int argc, char *argv[]){MPU6050_Init();usleep(1000*100);while(1){printf("\033[2J");usleep(1000*200);printf("ACCE_X:%6d\n ",GetData(ACCEL_XOUT_H));printf("ACCE_Y:%6d\n ",GetData(ACCEL_YOUT_H));printf("ACCE_Z:%6d\n ",GetData(ACCEL_ZOUT_H));printf("GYRO_X:%6d\n ",GetData(GYRO_XOUT_H));printf("GYRO_Y:%6d\n ",GetData(GYRO_YOUT_H));printf("GYRO_Z:%6d\n ",GetData(GYRO_ZOUT_H));} close(fd);}