• Nordic NRF51822 从零开始系列(外部设备片—MPU6050DMP驱动的移植)


    一、硬件准备

                (1)开发板和软件参看 Nordic NRF51822 从零开始系列(一)开发环境的搭建
                (2)mpu6050模块

    二、前置知识

                (1)IIC通信协议    (最好记住,以后会有很大用处的)

    三、移植所需要的文件

            原始文件和移植完成的文件

                (1)MPU6050的DMP文件(本例程使用的是正点原子例程中分离出来的)
                    
                (2)nrf_51822 官方例程库中的几个文件
                        1:mpu6050.h和mpu6050.c
                        2:twi_master.h 和 twi_sw_master.c (模拟IIC)或者使用(twi_hw_master.c)
                                两个选一既可以,官方已经封装好了接口了,所以没什么区别,本例程使用模拟
                       3:nrf_delay.h 和 nrf_delay.h
                        上面的文件都可以在例程包里的Source->ext-sensors 和Include->ext-sensors中找到
                       4: twi_master_config.h IIC配置文件 可以在例程文件夹nrf51822文件下搜索既可以找到

    四、移植过程梳理

          (1)明确要移植什么?

                            1、IIC通信接口
                            2、对inv_mpu6050添加部分函数方便使用

          (2)移植到哪里?

                        mpu6050官方的DMP驱动c文件中给出了以下内容
                    
                    明显的,我们移植驱动理论上只要干一件事情就可以了:将i2c_write和i2c_read两个函数重新定向就行了
                    
                    这是这两个函数的额声明。

          (3)移植过程

                       1:将上诉所所说的几个文件包含进工程并且添加对应的编译搜索路径
                       2:打开mpu6050.h 和mpu6050.c
                      在头文件中添加声明,在c文件中添加以下两个函数
    /*函数功能:mpu6050 写寄存器
    //参数列表    
    /// devic_address:设备地址 register_address:寄存器地址,len:数据长度 data:数据头部指针*/    
    bool mpu6050_write(uint8_t device_address, uint8_t register_address, uint8_t len, uint8_t *data);
    
    
    /*函数功能:mpu6050 读寄存器
    //参数列表    
    /// devic_address:设备地址 register_address:寄存器地址,number_of_bytes:数据长度 data:数据buf指针*/
    bool mpu6050_read(uint8_t device_address, uint8_t register_address, uint8_t number_of_bytes, uint8_t *destination);

    bool mpu6050_write(uint8_t device_address, uint8_t register_address, uint8_t len, uint8_t *data) //mpu6050 
    {
        uint8_t w2_data[len+1];
    		for(int i=0;i<len+1;i++)
    	{	
    		if(i==0)
    				w2_data[0] =register_address;
    		else
    			w2_data[i] = *(data+i-1);
    	}
       
        return twi_master_transfer((device_address<<1)|TWI_WRITE_BIT, w2_data, len+1, TWI_ISSUE_STOP);
    }
    
    bool mpu6050_read(uint8_t device_address, uint8_t register_address, uint8_t number_of_bytes, uint8_t *destination)
    {
    	  bool transfer_succeeded;
        transfer_succeeded = twi_master_transfer((device_address<<1)|TWI_WRITE_BIT, &register_address, 1, TWI_DONT_ISSUE_STOP);
        transfer_succeeded &= twi_master_transfer((device_address<<1)|TWI_READ_BIT, destination, number_of_bytes, TWI_ISSUE_STOP);
        return transfer_succeeded;
    }

                  3、在inv_mpu.c和inv_mpu_dmp_driver.c中包含进去,用这两个函数重定向i2cwrite和i2cread既完成了大体工作
                  4、添加自定义的函数,本例程直接使用了正点原子添加的几个函数,添加地方在inv_mpu.c文件最下方,根据编译器提示错误的地方稍作修改既可以使用
                  5、在main文件中添加inv_mpu.h,twi_master.h,并在主函数依次完成
                        iic初始化: twi_master_init();
                        mpu6050初始化: while(mpu_dmp_init()); 使用while循环确保初始化成功
                        调用:mpu_dmp_get_data()获取欧拉角,角速度,加速度(该函数为自己添加的函数那一部分)
                 6、通过串口查看获得的数据
                        
                
  • 相关阅读:
    Python 3基础教程1-环境安装和运行环境
    Python+Selenium框架设计篇之-什么是POM
    CS/BS架构的特点
    HTTP 方法:GET 对比 POST
    apt的通讯信道是如何发现的?
    安全运维到运营
    僵尸网络是如何控制你的电脑的?
    了解资产,减少网络攻击面的威胁
    ISC安全大会感受
    mysql 在忘记密码不能登录情况下的设置方法
  • 原文地址:https://www.cnblogs.com/CXianRen/p/10484981.html
Copyright © 2020-2023  润新知