本帖最后由 feifeiz 于 2023-7-9 13:21 编辑
一、 前言
上次将开发的开发环境搭建好,SSH连接,本次开始开发板的基础外设使用,本次选择的外设是IIC,板子已经将IIC引出,可以自由的接外设,本次接的是MPU6050,实现陀螺仪的基本使用。
二、 开发板驱动支持
在使用前先看一下参加支持的驱动,然后根据驱动进行外设开发,首先使用SSH和开发板连接
进入dev路径下,查看驱动,支持IIC0,IIC1,IIC3
打开开发板原理图,查看IO引出端子,可以看到板子引出端子支持IIC2和IIC3,同时可以看到开发板的资源使用情况
排针上IO以及其他引脚分布情况
本次选择的是IIC3接口,用于MPU6050的连接,实物连接如下:
三、 程序设计
//包含头文件 #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 #define CONFIG 0x1A #define GYRO_CONFIG 0x1B #define ACCEL_CONFIG 0x1C #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 #define WHO_AM_I 0x75 #define SlaveAddress 0xD0 #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-3", O_RDWR); // open file and enable readand write
if (fd < 0) { perror("Can'topen /dev/MPU6050 \n"); //open i2c dev file fail exit(1); }
printf("open/dev/i2c-3 success !\n"); // open i2c dev file succes
if (ioctl(fd, I2C_SLAVE,Address) < 0) { //set i2c address printf("fail toset i2c device slave address!\n"); close(fd); return - 1; }
printf("set slave address to 0x%xsuccess!\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 byte static 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 byte static uint8 i2c_read(int fd, 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; }
//get data short GetData(unsigned char REG_Address) { char H, L;
i2c_read(fd, REG_Address,&H); usleep(1000); i2c_read(fd, REG_Address +1, &L); return (H << 8) +L; }
// main int 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)); usleep(1000 * 200); printf("ACCE_Y:%6d\n ", GetData(ACCEL_YOUT_H)); usleep(1000 * 200); printf("ACCE_Z:%6d\n ", GetData(ACCEL_ZOUT_H)); usleep(1000 * 200); printf("GYRO_X:%6d\n ", GetData(GYRO_XOUT_H)); usleep(1000 * 200); printf("GYRO_Y:%6d\n ", GetData(GYRO_YOUT_H)); usleep(1000 * 200); printf("GYRO_Z:%6d\n\n ",GetData(GYRO_ZOUT_H)); sleep(1); }
close(fd); } 四、 代码载入
完成程序设计后编译为可执行文件
将编译生成的文件移至桌面,连接开发板,将文件拖入root文件夹内,或者其他地方也可以
给可执行文件添加权限
打开执行文件,查看读取数据内容,如下所示,驱动打开成功,陀螺仪数据正常读取。
五、总结本次测评就到这里,本次进行了IIC的使用,使用的是IIC设备,应用层对IIC设备进行操作实现陀螺仪的数据读取,然后编译生成可执行文件,将可执行拖到桌面上,通过SSH载入开发板,添加权限,运行程序。本次在看硬件手册的时候,可以看到做得很细,可以直观的看到板子资源情况。
|