i2c总线2

这里写图片描述

注:i2c的注册即为i2c总线:i2c_add_driver() —> probe()

读写数据用ioctl( )

  1. i2c是站在soc角度开发的
  2. 每次发送的数据位8bit
  3. ack:在第9周期soc把sda拉高,从设备把它拉低
  4. i2c控制器(i2c_adapter):i2c协议的时钟(系统自带),与硬件打交道,有算法发送数据和解析数据 adap->algo->master_xfer( )
  5. 协议:都用英语沟通
  6. 总线:都有driver、client,匹配正确后调用probe( )方法.匹配是根据
    compatible = “samsung,s5m8767-pmic”,变量的值进行匹配的
  7. 驱动中的创建与删除
    add – del
    register – unregister
    create – destroy
    kzalloc – kfree
  8. 四个重要的结构体
    1. i2c_driver
      1. i2c_add_driver()
      2. i2c_del_driver()
    2. i2c_client(由i2c_adapter创建)
    3. i2c_adapter
      1. i2c_add_adapter()
      2. i2c_del_adapter()
    4. i2c_msg
      1. i2c_master_send()
      2. i2c_master_recv()
  9. cope_to_user((void *user) msg,buf,count)
    1 给寄存器写数据
        char buf[2] = {PWR_MGMT_1, 0x0};
        i2c_master_send(mpu_dev->client, buf, 2);

    2 读寄存器数据
        char buf;
    //读取某个特定寄存器的地址,然后返回值
    int mpu6050_read_reg_byte(struct i2c_client *client, char reg)
    {
        // 先写寄存器的地址, 然后在读寄存器的值
        int ret;
        struct i2c_adapter *adapter = client->adapter;
        struct i2c_msg msg[2];

        char rxbuf[1];

        msg[0].addr = client->addr;
        msg[0].flags = 0;
        msg[0].len = 1;
        msg[0].buf = ®

        msg[1].addr = client->addr;
        msg[1].flags = I2C_M_RD;
        msg[1].len = 1;
        msg[1].buf = buf;

        ret = i2c_transfer(adapter, msg,  2);
        if(ret < 0)
        {
            printk("i2c_transfer read error\n");
            return ret;
        }
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值