px4flow通过iic读取具体寄存器数据程序

底层通信用了昨天写好的iic,今天结合官方资料成功读出所有指定寄存器的数据附上源码

include.h主要包括了一些stm32 IO控制的宏定义,具体参考正点原子所有例程中都有的sys.h头文件

inc

#ifndef __PX4FLOW_H
#define __PX4FLOW_H
#include "include.h"
//器件地址
#define PX4FLOW_ADDR  0x42
//寄存器宏定义,如果是2字节一个数据地址指的低字节位,高字节是低字节地址后一位,组合起来就是完整的数据  解释摘自官网

//不积分的数据
//记录总的创建的iic帧数
#define FRAME_COUNT_SUM     0x00                    //uint16_t counts created I2C frames [frames]
//X轴最新一帧所有像素移动和*10
#define PIXEL_FLOW_X_SUM    0x02                    //int16_t latest x flow measurement in pixels*10 [pixels]
//Y轴最新一帧所有像素移动和*10
#define PIXEL_FLOW_Y_SUM    0x04                    //int16_t latest y flow measurement in pixels*10 [pixels]
//X轴速度
#define FLOW_COMP_M_X       0x06                    //int16_t x velocity*1000 [meters/sec]
//Y轴速度
#define FLOW_COMP_M_Y       0x08                    //int16_t y velocity*1000 [meters/sec]
//光流图像质量
#define QUAL                0x0a                    //int16_t Optical flow quality / confidence [0: bad, 255: maximum quality]
//X轴陀螺仪速度
#define GYRO_X_RATE         0x0c                    //int16_t latest gyro x rate [rad/sec]
//Y轴陀螺仪速度
#define GYRO_Y_RATE         0x0e                    //int16_t latest gyro y rate [rad/sec]
//Z轴陀螺仪速度
#define GYRO_Z_RATE         0x10                    //int16_t latest gyro z rate [rad/sec]
//陀螺仪数据范围
#define GYRO_RANGE          0x12                    //uint8_t gyro range [0 .. 7] equals [50 deg/sec .. 2000 deg/sec]
//超声波数据上次更新时间到现在的时间间隔
#define SONAR_TIMESTAMP1     0x13                    //uint8_t time since last sonar update [milliseconds]
//地面距离  正值:已知距离,  负值:未知距离
#define GROUND_DISTANCE1    0x14                    //int16_t Ground distance in meters*1000 [meters]. Positive value: distance known.
                                                            //Negative value: Unknown distance
//积分后的数据地址
//上次读取数据后数据更新了多少次
#define FRAME_COUNT_SINCE_LAST_READOUT  0x16        //uint16_t number of flow measurements since last I2C readout [frames]
//自上次读取iic数据后 X轴速度积分后所得值
#define PIXEL_FLOW_X_INTEGRAL           0x18        //int16_t  accumulated flow in radians*10000 around x axis since last I2C readout [rad*10000]
//自上次读取iic数据后 Y轴速度积分后所得值
#define PIXEL_FLOW_Y_INTEGRAL           0x1a        //int16_t  accumulated flow in radians*10000 around y axis since last I2C readout [rad*10000]
//自上次读取iic数据后,X轴角速度积分值
#define GYRO_X_RATE_INTEGRAL            0x1c        //int16_t  accumulated gyro x rates in radians*10000 since last I2C readout [rad*10000]
//自上次读取iic数据后,Y轴角速度积分值
#define GYRO_Y_RATE_INTEGRAL            0x1e        //int16_t  accumulated gyro y rates in radians*10000 since last I2C readout [rad*10000]
//自上次读取iic数据后,Z轴角速度积分值
#define GYRO_Z_RATE_INTEGRAL            0x20        //int16_t  accumulated gyro z rates in radians*10000 since last I2C readout [rad*10000]
//上次和这次读取iic数据的时间间隔
#define INTEGRATION_TIMESPAN            0x22        //uint32_t accumulation timespan in microseconds since last I2C readout [microseconds]
//超声波数据上次更新时间到现在的时间间隔
#define SONAR_TIMESTAMP2                 0x26        //uint32_t time since last sonar update [microseconds]
//地面距离
#define GROUND_DISTANCE2                0x2a        //int16_t  Ground distance in meters*1000 [meters*1000]
//陀螺仪温度
#define GYRO_TEMPERATURE                0x2c        //int16_t  Temperature * 100 in centi-degrees Celsius [degcelsius*100]
//光流积分数据质量
#define QUALITY                         0x2e        //uint8_t averaged quality of accumulated flow values [0:bad quality;255: max quality]

//读指定寄存器指定字节数数据
u8 flow_read_data(u8 addr,u8 reg,u8 len,u8 *buf);
//读8位无符号数据
uint8_t     readu8_date(u8 addr,u8 reg);
//读16位无符号数据
uint16_t    readu16_date(u8 addr,u8 reg);
//读16位有符号数据
int16_t     reads16_date(u8 addr,u8 reg);
//读32位无符号数据
uint32_t    readu32_date(u8 addr,u8 reg);

#endif

src

#include "px4flow.h"
#include "include.h"
#include "myiic.h"

//读指定寄存器指定字节数数据
u8 flow_read_data(u8 addr,u8 reg,u8 len,u8 *buf)
{
    IIC_Start();
    IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令
    if(IIC_Wait_Ack())    //等待应答
    {
        IIC_Stop();
        return 1;
    }
    IIC_Send_Byte(reg);    //写寄存器地址
    IIC_Wait_Ack();        //等待应答
    IIC_Start();
    IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令
    IIC_Wait_Ack();        //等待应答
    while(len)
    {
        if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK
        else *buf=IIC_Read_Byte(1);        //读数据,发送ACK
        len--;
        buf++;
    }
    IIC_Stop();    //产生一个停止条件
    return 0;
}
//读8位无符号数据
uint8_t     readu8_date(u8 addr,u8 reg)
{
    u8 buff[1];
    uint8_t date;
    flow_read_data(addr,reg,1,buff);
    date = buff[0];
    return date;
}
//读16位无符号数据
uint16_t    readu16_date(u8 addr,u8 reg)
{
    u8 buff[2];
    uint16_t date;
    flow_read_data(addr,reg,2,buff);
    date = buff[1] << 8 | buff[0];
    return date;

}
//读16位有符号数据
int16_t     reads16_date(u8 addr,u8 reg)
{
    u8 buff[2];
    int16_t date;
    flow_read_data(addr,reg,2,buff);
    date = buff[1] << 8 | buff[0];
    return date;
}
//读32位无符号数据
uint32_t    readu32_date(u8 addr,u8 reg)
{
    u8 buff[4];
    int16_t date;
    flow_read_data(addr,reg,2,buff);
    date = buff[3] << 24 | buff[2] << 16 | buff[1] << 8 | buff[0];
    return date;
}
时间: 2024-10-19 14:29:30

px4flow通过iic读取具体寄存器数据程序的相关文章

stm32软件模拟IIC读取PX4FLOW光流传感器数据

这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模拟iic的时序要求可能更高一点所以在原子哥的iic程序上做了修改,代码测验后已经不会死机,做个笔记,保存一下. 1 #include "myiic.h" 2 #include "delay.h" 15 16 //初始化IIC 17 void IIC_Init(void)

分批读取文件中数据的程序流程及其C代码实现

一.概述 在实际的软件开发项目中,经常需要处理大量的文件.某些文件中包含了相当多的数据记录数,如作者本人参与过的项目中,一个文件中有好几十万条记录.如果一次性将多条记录读入,则会花费大量的处理时间,且占用大量的内存. 为此,要求对于包含大量数据记录的文件进行分批读取操作,即每一轮读取一定数目的数据记录,待将这些记录处理完成之后,再读取下一批数据.本文介绍分批读取文件中数据的程序流程,并给出了C程序实现. 二.总体程序流程 实现分批读取文件中数据的程序流程如图1所示. 图1 实现分批读取文件中数据

Modbus: 1. Java使用Modbus读取Slave端数据(TCP)

最近手上接了个Unity3D的项目,这个项目需要和真机联动,和真机联动我们需要通过Modbus协议.所以Modbus这一块的就我来实现,因为项目最好会打包为android的,所以就用java来做,看了下java中还真有不少相关的库,最后决定用Jamod这个库,地址:Jamod 在使用的过程中发现,Jamod再封装某些对象的时候都是单例的,比如说我想在一台电脑上模拟出一个Slave端出来,但是这个库限定了在同一台电脑的同一个程序中只能模拟出一个,如果我想模拟多个就需要弄出多个程序出来,这显然不符合

java通过POI技术操作Excel(2)----模板读取,录入数据

先来回顾下通常把java对Excel的操作分为以下功能:1.生成模板,导出模板:2.填充模板,录入数据:3:读取数据库数据,导出数据:在上一篇博文中,我简单记录了模板生成和导出,在这篇博文中,主要来记录--Excel文件导入,数据录入(仍然是以jsp+servlet为例) 既然要解决这个问题,那首先来分析下我们需要面对的有哪些需求需要实现: 1.Excel文件导入(这是最基础的,巧妇难为无米之炊,导入环节也是查了好久才完成的); 2.Excel文件中数据的格式判定,你要读取文件,如果文件中其实没

ACCESS(VBA)上的一个小项目 —— 2、读取ACCESS表数据到TreeView和ListView

有人问我能不能做一个程序的时候,我第一反应都说“能”. --这次在ACCESS中,借助TreeView和ListView做了一个数据联动的模型. 简析过程: 1)从网上找了一份TreeView学习教程<三小时学会树控件>,了解了TreeView的建立以及节点的使用方法: 2)把数据表中的某列按一定规则生成的数据再按一种规则解析成TreeView中的树结构(VPPS): 3)通过遍历TreeView中节点的折叠状态,通过上述一定规则生成的数据(唯一性)把数据表中的内容读取到ListView中:

使用client对象模型读取SharePoint列表数据

使用client对象模型读取SharePoint列表数据 client对象模型提供了强有力的方式.从远程client应用程序管理列表. 1. 管理员身份打开VS,新建项目Windows窗口应用程序,命名ReadSPListData,确保选择.NET Framework 3.5. 2. 加入控件. 控件类型: 3. 你必须加入一个类ProductInfo. namespace ReadSPListData { class ProductInfo { public string productNam

nextLine()紧跟在nextXXX()后面读取不到数据的问题,以及两者的小结

用Java在在线oj平台上做题时,要求的标准输入一般是“Scanner cin=new Scanner(System.in);”. 其实还有更有效率的方法:Scanner cin=new Scanner(new BufferedInputStream(System.in)).笔者更常用这种方法,效率更高.但是由于本文主题不在于此,因此不再赘述. 回到正题,之前就发现nextXXX()(包括next()方法)后面紧跟nextLine()的话,后者不会读取到数据,输出的话为空字符串.这两天做了几个题

使用客户端对象模型读取SharePoint列表数据

使用客户端对象模型读取SharePoint列表数据 客户端对象模型提供了强有力的方式,从远程客户端应用程序管理列表. 1. 管理员身份打开VS,新建项目Windows窗体应用程序,命名ReadSPListData,确保选择.NET Framework 3.5. 2. 添加控件. 控件类型: 3. 你必须添加一个类ProductInfo. 4. 双击两个按钮,添加方法.首先是Exit: 5. 然后是Load.首先要添加合适的引用.右击项目,添加引用Microsoft.SharePoint.Clie

VC6.0读取Excel文件数据

啰嗦一下:本人所在公司从事碟式斯特林太阳能发电设备的研发与销售.单台设备图如下: 工作原理如下:整个设备大致可分为五个部分, 1.服务器,负责气象.发电等数据存取,电.网连接等处理: 2.气象站,通过光感应器实时获取气象数据,传送至服务器 3.碟型镜面,反射阳光热量,均匀聚焦到350mm直径的圆形范围内--发动机热头大小: 4.斯特林发动机,吸收镜面反射热量,通过内部气体膨胀.收缩带动发动机发电: 5.通信线,连接系统各个部分,使其运行正常. 对于这样一台设备,要使其高效发电,出气象条件要好之外