I2C——集成电路总线
基本概念
- 通过两根线SDA,SCL线和很多设备连接,通过一个从机地址寻找设备 ,发送一个寻址字节来寻找,包含地址位和读写位,从机设备收到后,返回应答信号,这样主从机就可以连接成功。
- 具体的通信协议需要看对应设备的时序图,SCL是时钟信号,SCL从低到高的瞬间会对SDA进行采样,获取数据,所以SDA在SCL变化之前就需要保持好要发送的电平。
- 主从设备之间以8位为单位进行双向数据传输。
- 总线上可以多个主机,多个从机,同一个时刻只能有一个主机,如果有多个主机同时需要通信,就需要冲突检测和仲裁,防止数据混乱。
- 仲裁就是主机发一个1出去,再比较总线上电平,如果是1说明仲裁赢了,可以继续发数据,如果为0,说明仲裁输了,不能再发数据了。
- I2C标准100kbit/s,快速400kbit/s,告诉3.4Mbit/s,总线上设备数量受限于电容,可以通过增加总线驱动器增加设备数量。
- 空闲时间:SDA和SCL都高,
- 起始条件:SDA由高变低时候就是起始
- 终止条件:SDA由低到高时候就是终止
- 传输结束,从设备拉低SDA,返回应答信号
- 一对设备通信时候,其他无法使用,传输结束后再次空闲
- 每传输完一字节之后,都需要一个响应信号,分为两种,一种叫应答(低电平),非应答(高电平)
- I2C:双向、双线、半双工、串行、同步、近距离
- 电平3.3v为1,0v为0,还有高阻态为空闲
串口
基本概念
- TTL电平(0 ~ 5)、232电平(-15 ~ 15)、USB转TTL
- 异步串行,全双工
- 232芯片:max232, usb转ttl芯片:ch340,ft232、cp2102
- 通常配置0位校验,8位数据,1位停止
- 波特率,每秒钟发送的数据位数
linux下串口
- linux的设备都是抽象成文件,设备位于/dev下面,ttys0,ttys1
- 用之前需要给权限
- 用的时候,先开串口,获得文件描述符
- 然后设置参数
- 然后读写
CAN口(controler area network)
基本概念
-
CAN总线上电平称为隐形和显性:
CAN_H = 2.5v, CAN_L = 2.5v,差值为0,隐形电平 ,代表逻辑1
CAN_H = 3.5v, CAN_L = 1.5v,差值为2,显形电平,代表逻辑0 -
它是串行数据通信协议,继承了物理层和数据链路层
-
有多个设备时,需要仲裁机制,采用载波监听多路访问,报文标识符逐位仲裁
-
国际标准:ISO11898(高速),ISO11519(低速)
-
特点:多主,不分主从;区分优先级,通过非破坏位仲裁机制;可以点对点、一对多,广播;节点数可到110个;段帧,一帧8个有效字节,每帧都校验, 严重错误下可自动关闭总线
-
can报文:
(1)数据帧 发送数据
(2)远程帧 向其他节点请求发送同一标识符(ID)的数据帧
(3)错误帧 指明已检测到总线错误
(4)超载帧 在数据帧(或远程帧)之间
linux下can
- 在 Linux 系统中, CAN 总线接口设备作为网络设备被系统进行统一管理,可以通过ifconfig看到can的信息
- 可以通过IP命令来配置can速率
ip link set can0 type cantq 125 prop-seg 6phase-seg1 7 phase-seg2 2 sjw 1
- 查询can参数:
ip -details link show can0
- 使能和关闭can:
ifconfig can0 up 或 ip link set up can0
ifconfig can0 down 或 ip link set can0 down
- 显示can数据:
candump can0
- Linux 提供了SocketCAN 接口,使得 CAN 总线通信近似于和以太网的通信,应用程序开发接口 更加通用, 也更加灵活。
- 使用步骤:
(1)创建socketCAN套接字,绑定
(2)数据通信都是用结构体struct can_frame { canid_t can_id;//CAN 标识符 __u8 can_dlc;//数据场的长度 __u8 data[8];//数据 };
(3)都是面对文件描述符进行操作了,可以用read和write,也可以用socket的send和recv
博客介绍了I2C、串口和CAN口的通信知识。I2C通过两根线连接多设备,有通信协议和仲裁机制;串口有不同电平标准,在Linux下使用需设置权限和参数;CAN口是串行通信协议,有仲裁机制和多种报文类型,在Linux系统中作为网络设备管理,有通用开发接口。
3105

被折叠的 条评论
为什么被折叠?



