I2C子系统---(1)应用层使用

前言

I2C在设备中运用广泛,也是比较常用的一种接口,之前想在学习mcu时就能接触很多的I2C设备,比如24c02基于I2C的eeprom,MPU6050加速度计,rtc,gpio扩展芯片等等!

运用

环境

本系列采用的平台是aarch64 全志H5平台,I2C设备是hmc5883l, 是一款Honeywell3轴数字罗盘磁力计,用于输出当前空间磁场分布,磁场是个矢量,具有方向和大小,且为3维,故这款磁力计的寄存器中表示当前磁场XYZ的分量。
我们的目标就是能读到寄存器的值,且转动传感器,数值有变化即可,数据的拟合以及南北方向的算法判断,暂不关注。

实现设备访问大致过程

  1. 在设备树中I2C节点下添加我们的设备信息
  2. 编写设备驱动提供ioctl方法供app调用
  3. app main函数open设备节点,使用ioctl访问设备信息

本篇文章介绍用法和大致流程,其中设备树到I2C设备的注册和设备的驱动详细介绍看后面文章

设备树

i2c1: i2c@1c2b000 {
compatible = "allwinner,sun6i-a31-i2c";
reg = <0x01c2b000 0x400>;
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_I2C1>;
resets = <&ccu RST_BUS_I2C1>;
pinctrl-names = "default";
pinctrl-0 = <&i2c1_pins>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
hmc5883l@68{
compatible="honeywell,hmc5883l";
reg=<0x68>}
};

在相对应的I2C控制器下添加该设备,描述compatible供磁力计驱动匹配,以及I2C设备地址

app代码

typedef struct tagMagnetic{
    int x;
    int y;
    int z;
}MANETIC_S;
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <math.h>
#include "hmc5883l.h"

int main (int argc ,char *argv[] )
{
    int fd;
    MANETIC_S stManeticDate;
    double angle;
    fd = open("/dev/hmc5883l",O_RDWR);
    if ( fd < 0 )
    {
        perror("open fail \n");
        exit(1);
    }
    while(1)
    {
        ioctl(fd,CMD_GET_DATE,&stManeticDate);
        printf("X:%d,Y:%d,Z:%d\n",stManeticDate.x,stManeticDate.y,stManeticDate.z);
        angle= atan2((double)stManeticDate.y,(double)stManeticDate.x) * (180 / 3.14159265) + 180; // angle in degrees
        printf("AGL:%f\n",angle);
        sleep(1);
    }
    close(fd);
    return 0;
}

说明

这个/dev/hmc5883l 设备节点是设备树中匹配上我们的写的磁力计驱动后,在驱动中创建的设备节点,然后在通过ioctl直通磁力计驱动的ioctl进行i2c的访问,将读出的寄存器值通过copy_to_user传到app进行数据传输,完成整个过程。

如果对您有用,小小支持一下吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值