当前位置: 首页 > news >正文

Linux嵌入式I2C协议笔记

硬件:
1.I2C结构
在一个SOC中有一个或者多个I2C控制器,一个I2C控制器可以连接一个或多个I2C设备。
I2C总线需要两条线,时钟线SCL和数据线SDA
在这里插入图片描述

2.I2C传输数据格式

  • 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。
  • 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
  • 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
  • SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化
    在这里插入图片描述

读操作
在这里插入图片描述
写操作
在这里插入图片描述
软件:
在这里插入图片描述
上层APP通过具体的I2C设备驱动(eg.ap3216)对芯片进行读写操作。而i2c设备驱动需要使用linux内核提供的数据结构对i2c设备进行读写操作,其中最重要的就是i2c_adapter,和i2c_algorithm结构体,I2C adapter表示一条I2C总线,也就是I2C Controller,i2c_adapter里面有两个重要的成员,nr表示第几个i2c总线(i2c controller),i2c_algorithm(用来收发I2C数据,里面有master_xfer函数)
在这里插入图片描述
通过这两个数据结构,我们可以访问到具体的I2C物理设备,Linux内核是如何表示I2C Device的?
Linux内核使用i2c_client数据结构来表示一个具体的I2C物理设备,其中最重要的是这个设备的地址addr和这个设备属于哪一条总线下(I2C Controller或者I2C adapter)。
在这里插入图片描述
我们知道i2c_algorithm 里面提供了master_xfer函数和i2c_client 进行数据读写,那么我们就必须要知道master_xfer参数的意义,其中最重要的是i2c_msg。flags用来表示数据传输方向,bit 0等于I2C_M_RD表示读,bit 0等于0表示写。

在这里插入图片描述
举例:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?

  • 要构造2个i2c_msg

  • 第一个i2c_msg表示写操作,把要访问的存储地址0x10发给设备

  • 第二个i2c_msg表示读操作

  • 代码如下

u8 data_addr = 0x10;
i8 data;
struct i2c_msg msgs[2];msgs[0].addr   = 0x50;
msgs[0].flags  = 0;
msgs[0].len    = 1;
msgs[0].buf    = &data_addr;msgs[1].addr   = 0x50;
msgs[1].flags  = I2C_M_RD;
msgs[1].len    = 1;
msgs[1].buf    = &data;
http://www.lryc.cn/news/238951.html

相关文章:

  • 科技的成就(五十三)
  • Ubuntu22.04 编译 AOSP
  • 【计算机网络】多路复用的三种方案
  • 供应链和物流的自动化新时代
  • Python与ArcGIS系列(九)自定义python地理处理工具
  • Nginx部署前端项目
  • 根据文件类型进行下载, 文档/图片
  • 赋范线性空间3
  • XSLVGL2.0 User Manual 缩略图生成器(v2.0)
  • 练习八-利用有限状态机进行时序逻辑的设计
  • WebAssembly照亮了 Web端软件的未来
  • PDF文件无密码,如何解密?
  • 搜维尔科技:Movella Xsens MVN LINK 实际应用,一镜到底!
  • wsl安装ubuntu的问题点、处理及连接
  • Flutter在web项目中使用iframe
  • 阿里云高校计划学生和教师完成认证领取优惠权益
  • 劲松HPV防治诊疗中心提醒:做完HPV检查后,需留意这些事项!
  • InfoNCE Loss公式及源码理解
  • 经典双指针算法试题(二)
  • MySQL -- DQL
  • 高防CDN:保障网络安全的未来之路
  • 使用wxPython和PyMuPDF合并PDF文档并自动复制到剪贴板
  • Redis篇---第十四篇
  • python之文件操作
  • android实时投屏软件QtScrcpy
  • LeetCode - 622. 设计循环队列(C语言,顺序存储结构,配图)
  • 在 Qt 框架中,有许多内置的信号可用于不同的类和对象\triggered
  • springBoot中starter
  • Linux学习笔记-Ubuntu下使用Crontab设置定时任务
  • 动态规划求数组中相邻两数的最小差值( 即相差的绝对值 ) java 实现