i2c总线之通信原理及linux驱动中读写时序的实现 |
您所在的位置:网站首页 › I2C通讯原理图 › i2c总线之通信原理及linux驱动中读写时序的实现 |
一、I2C简介 I2C使用两条线在主控制器和从机之间通信,SCL(串行时钟线)和SDA(串行数据线),这两条线需接5~10欧上拉电阻,总线空闲空闲时,SCL和SDA处于高电平,I2C总线标准模式速度可以达到100K/S,快速模式可以达到400K/S。 一个I2C总线可以挂多个I2C从设备,通过I2C器件地址去识别不同的设备,如图 6.I2C读时序:读时序分为4大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是I2C从器件输出要读取的寄存器值 三、代码实现I2C读写时序 #include static int i2c_write(struct i2c_adapter *i2c_adap,unsigned int address, unsigned int len, unsigned char const *data) { struct i2c_msg msgs[1]; int ret; if(!data || !i2c_adap){ printk("---error--- "); } msgs[0].addr=address; msgs[0].flags=0; //write flag msgs[0].buf=(unsigned char *)data; msgs[0].len=len; /*i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) num:消息数量,也就是 msgs 的数量 返回值:负值,失败,其他非负值,发送的 msgs 数量*/ ret=i2c_transfer(i2c_adap,msgs,1); if (ret == 1) return 0; else if(ret == 0) return -EBUSY; else return ret; } static int i2c_read(struct i2c_adapter *i2c_adap, unsigned int address, unsigned int reg, unsigned int len, unsigned char *data) { struct i2c_msg msgs[2]; int ret; if(!data || !i2c_adap){ printk("---error--- "); } //发送要读取的寄存器首地址 msgs[0].addr=address; msgs[0].flags=0; //write flag msgs[0].buf=® //读取的首地址 msgs[0].len=1; //读取寄存器数据 msgs[1].addr=address; msgs[1].flags=I2C_M_RD; //read flag msgs[1].buf=data; msgs[1].len=len; //读取的数据长度 ret=i2c_transfer(i2c_adap,msgs,2); if (ret == 2) return 0; else if(ret == 0) return -EBUSY; else return ret; }在学习中进步,如有错误,请多多批评指正 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |