ok6410接mpu6050读不出数据
本人因为设计 刚刚自学 arm和linux 求多多指教。
ok6410 烧的qtopia linux 想读通过ok6410上的自带iic 读 mpu6050数据
芯片给的例程是arduino和c51的,不太会移植到linux。
我先说我现在做的:
硬件:用杜邦线连接了 mpu6050芯片 gnd-------> CAMERA 20 引脚 ok6410
vcc-------> CAMERA 17 引脚
sda-------> CAMERA 1 引脚
scl-------> CAMERA 2 引脚
软件:在PC上的VMware里面装了Ubuntu 程序写在里面 并编译 然后用超级终端发到ok6410执行
C/C++ code?#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> //瀹忓畾涔? #define SMPLRT_DIV 0x19 //闄铻轰华閲囨牱鐜囷紝鍏稿瀷鍊硷細0x07(125Hz) #define CONFIG 0x1A //浣庨氭护娉㈤鐜囷紝鍏稿瀷鍊硷細0x06(5Hz) #define GYRO_CONFIG 0x1B //闄铻轰华鑷鍙婃祴閲忚寖鍥达紝鍏稿瀷鍊硷細0x18(涓嶈嚜妫锛?000deg/s) #define ACCEL_CONFIG 0x1C //鍔犻熻鑷銆佹祴閲忚寖鍥村強楂橀氭护娉㈤鐜囷紝鍏稿瀷鍊硷細0x01(涓嶈嚜妫锛?G锛?Hz) #define ACCEL_XOUT_H 0x3B #define ACCEL_XOUT_L 0x3C #define ACCEL_YOUT_H 0x3D #define ACCEL_YOUT_L 0x3E #define ACCEL_ZOUT_H 0x3F #define ACCEL_ZOUT_L 0x40 #define TEMP_OUT_H 0x41 #define TEMP_OUT_L 0x42 #define GYRO_XOUT_H 0x43 #define GYRO_XOUT_L 0x44 #define GYRO_YOUT_H 0x45 #define GYRO_YOUT_L 0x46 #define GYRO_ZOUT_H 0x47 #define GYRO_ZOUT_L 0x48 #define PWR_MGMT_1 0x6B //鐢垫簮绠$悊锛屽吀鍨嬪硷細0x00(姝e父鍚敤) #define uint8 unsigned char #define uchar unsigned char #define Address 0x68 //mpu6050鍦板潃 #define I2C_RETRIES 0x0701 #define I2C_TIMEOUT 0x0702 #define I2C_SLAVE 0x0703 //IIC浠庡櫒浠剁殑鍦板潃璁剧疆 #define I2C_BUS_MODE 0x0780 int fd = -1; //鍑芥暟澹版槑 static uint8 mpu6050_Init(void); //mpu6050鍒濆鍖? static uint8 IIC_Init(void) { fd = open("/dev/i2c/0", O_RDWR); //鍏佽璇诲啓 if(fd < 0) { perror("Can't open /dev/nrf24l01 \n"); //鎵撳紑iic璁惧鏂囦欢澶辫触 exit(1); } printf("open /dev/i2c/0 success !\n"); //鎵撳紑iic璁惧鏂囦欢鎴愬姛 if(ioctl(fd, I2C_SLAVE, Address)<0) { //璁剧疆iic浠庡櫒浠跺湴鍧 printf("fail to set i2c device slave address!\n"); close(fd); return -1; } printf("set slave address to 0x%x success!\n", Address); if(ioctl(fd, I2C_BUS_MODE, 1)<0) //璁剧疆iic鎬荤嚎妯″紡 printf("set bus mode fail!\n"); elseprintf("set bus mode ok!\n"); return(0); } //************************************** //鍚慖2C璁惧鍐欏叆涓涓瓧鑺傛暟鎹? //************************************** int Single_WriteI2C(uchar REG_Address,uchar REG_data) { int retries; uint8 data[2]; data[0] = REG_Address; data[1] = REG_data; for(retries=5; retries; retries--) { if(write(fd, data, 2)==2) return 0; usleep(1000*10); } return -1; } //************************************** //浠嶪2C璁惧璇诲彇涓涓瓧鑺傛暟鎹? //************************************** uchar Single_ReadI2C(uint8 reg, uint8 *val) { int retries; for(retries=5; retries; retries--) if(write(fd, ®, 1)==1) if(read(fd, val, 1)==1) return 0; return -1; } static uint8 mpu6050_Init(void) { if(IIC_Init()!=0) { printf("IIC init failed!\n"); return(-1); } Single_WriteI2C(PWR_MGMT_1, 0x00); //瑙i櫎浼戠湢鐘舵? Single_WriteI2C(SMPLRT_DIV, 0x07); Single_WriteI2C(CONFIG, 0x06); Single_WriteI2C(GYRO_CONFIG, 0x18); Single_WriteI2C(ACCEL_CONFIG, 0x01); return(1); } /* uint8 mpu6050_Write(uint8 *nData, uint8 Reg, uint8 Num) { write(fd, &Reg, 1); // usleep(100); //寤舵椂100us write(fd, nData, Num); usleep(1000*4); //寤舵椂 4ms return(1); } uint8 mpu6050_Read(uint8 nData[], uint8 Reg, uint8 Num) { write(fd, &Reg, 1); usleep(100); //寤舵椂100us read(fd, nData, Num); usleep(1000*4); //寤舵椂 4ms return(1); } */ int GetData(uchar REG_Address) { char H,L; Single_ReadI2C(REG_Address,&H); Single_ReadI2C(REG_Address+1,&L); return (H<<8)+L; //鍚堟垚鏁版嵁 } //涓诲嚱鏁? int main(int argc, char *argv[]) { int i; usleep(1000*100); mpu6050_Init(); usleep(1000*100); while(1) { printf("xa is:%f\n",GetData(ACCEL_XOUT_H)); //鏄剧ずX杞村姞閫熷害 printf("ya is:%f\n",GetData(ACCEL_YOUT_H)); //鏄剧ずY杞村姞閫熷害 printf("za is:%f\n",GetData(ACCEL_ZOUT_H)); //鏄剧ずZ杞村姞閫熷害 printf("xj is:%f\n",GetData(GYRO_XOUT_H)); //鏄剧ずX杞磋閫熷害 printf("yj is:%f\n",GetData(GYRO_YOUT_H)); //鏄剧ずY杞磋閫熷害 printf("zj is:%f\n",GetData(GYRO_ZOUT_H)); //鏄剧ずZ杞磋閫熷害 usleep(1000*100); } close(fd); }
执行后出现 open /dev/i2c/0 success!
set slave address to 0x68 success!
set bus mode fail
xa is 0;
ya is 0;
各种 is 0 读的全是0 拔掉 芯片也是0
这个0x68是一个固定值,不是写进去的,是地址寄存器中的一个只读值,如果你能读出这个值,说明距离成功近了一步。