登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习笔记] I2C 总线与UART 异步串行通信

[复制链接]
发表于 2018-2-27 09:57:41 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 2天
开始时间: 2018-02-24
结束时间: 2018-02-25
I2C 总线
I2C 总线是由 PHILIPS 公司开发的两线式串行总线,多用于连接微处理器 及其外围芯片。
主要特点:两条线可以挂多个参与通信的器件, 即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。原理: 属于同步通信,SCL时钟线负责收发双方的时钟节拍,SDA数据线负责传输数据。I2C 的发送方和接收方都以 SCL这个时钟 节拍为基准进行数据的发送和接收。应用: 多用于板内通信, 多用于连接微处理器 及其外围芯片。硬件电路:
file:///C:/Users/dell/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg在硬件上,I2C 总线是由时钟总线 SCL 和数据总线 SDA 两条线构成,连接到总线上的所 有器件的 SCL 都连到一起,所有 SDA 都连到一起因此可以做到任何一个器件都可以拉低电平, 也就是任何一个器件都可以作为主机,
图 14-1     I2C 总线的上拉电阻
虽然说任何一个设备都可以作为主机,但绝大多数情况下我们都是用单片机来做主机,
I2C 时序初步认识:
在 I2C 中也有起始信号、数据传输和停止信号,如图 14-2 所示。
file:///C:/Users/dell/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
图 14-2     I2C 时序流程图
起始信号:SCL 为高电平期间,SDA 由高电平向低电平变化产生一个下降沿,表 示起始信号,如图14-3 中的 Start 部分所示。
数据传输:I2C 没有固定波特率,但是有时序的要求,发送方必须先保持 SCL 是低电平,才可以改变数据线 SDA,输出要发送的当前 数据的一位;而当SCL 在高电平的时候,SDA 绝对不可以变化,因为这个时候,接收方要 来读取当前 SDA 的电平信号是 0 还是 1,因此要保证 SDA 的稳定,
停止信号: 是 SCL 为高电平期间,SDA 由低电平向高电平变化产生一个上升沿,表示结束信号,如图 14-3 中的 Stop 部分所示。
I2C 寻址模式
I2C 通信在字节级的传输中(即数据传输),也有固定 的时序要求。首先要发送一个从机的地址,这个地址一共有 7 位,紧跟着的第 8 位是数据方向位(R/W),“0”表示接下来要发送数据(写),‘“1”表示接 下来是请求数据(读)。如果发送的这个地址确实存在,那么这个地址的器件应该回应一个 ACK(拉低 SDA 即输出“0”),如果不存在,就没“人”回应 ACK(SDA 将保持高电平即“1”)。

UART 异步串行通信
串行通信,就如同一条车道,一次只能一辆车过去
主要特点:两条线可以挂多个参与通信的器件, 即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。原理:UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过 TXD 发送出来即可,接收数据是单片机自己的事情。
                              
应用: UART 通信多用于板间通信,比如单片机和电脑,这个设备和另外一个 设备之间的通信。
硬件电路:两个引脚是专门用来做 UART 串行通信的,一个是 P3.0 一个是 P3.1,它们 还分别有另外的名字叫做 RXD TXD由它们组成的通信接口就叫做串行接口,简称串口。TXD Transmit Data是串行发送引脚RXD Receive Data是串行接收引 脚。
时序认识:
规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止位。其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。
软件设计UART 模块介绍
51 单片机的UART 串口的结构由串行口控制寄存器 SCON、发送和接收电路三部分构成, 先来了解一下串口控制寄存器 SCON。如表 11-1 表 11-2 所示。
表 11-1     SCON——串行控制寄存器的位分配(地址 0x98、可位寻址)
  
  
7
6
5
4
3
2
1
0
符号
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
复位值
0
0
0
0
0
0
0
0
表 11-2   
—串行控制寄存器的位描述
  
  
符号
描述
7
SM0
这两位共同决定了串口通信的模式  0~模式 3 共 4 种模式。我们最常用的 就是模式 1,也就是 SM0=0,SM1=1,下边我们重点就讲模式 1,其它模 式从略。
6
SM1
5
SM2
多机通信控制位(极少用),模式  1  直接清零。
4
REN
使能串行接收。,由软件置位使能接收,软件清零则禁止接收(REN=0,不接收只发送。)
3
TB8
模式 2 和 3 中要发送的第 9 位数据(很少用)。
2
RB8
模式 2 和 3 中接收到的第 9 位数据(很少用),模式 1 用来接收停止位。
  
1
  
TI
发送中断标志位,当发送电路发送到停止位的中间位置时,TI 由硬件置 1, 必须通过软件清零。定时器中断不一样,定时器中断由硬件清零.
  
0
  
RI
接收中断标志位,当接收电路接收到停止位的中间位置时,RI 由硬件置 1, 必须通过软件清零。
对于串口的四种模式,模式 1 是最常用的,就是我们前边提到的 1 位起始位,8 位数据位和 1 位停止位。下面我们就详细介绍模式 1 的工作细节和使用方法,至于其它 3 种模式与此也是大同小异,真正遇到需要使用的时候大家再去查 阅相关资料就行了。
在我们使用IO 口模拟串口通信的时候,串口的波特率是使用定时器 T0 的中断体现出来 的。在硬件串口模块中,有一个专门的波特率发生器用来控制发送和接收数据的速度。对于 STC89C52 单片机来讲,这个波特率发生器只能由定时器 T1 或定时器 T2 产生,而不能由定 时器 T0 产生。如果用定时器 2,需要配置额外的寄存器,默认是使用定时器 1 的。
就使用定时器 T1 作为波特率发生器来讲解,
方式 1 下的波特率发生器必须使用定时器 T1 的 模式 2,也就是自动重装载模式,定时器的重载值计算公式为:
TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
和波特率有关的还有一个寄存器,是一个电源管理寄存器 PCON,他的最高位可以把波特率提高一倍,也就是如果写 PCON |= 0x80 以后,计算公式就成了:
TH1 = TL1 = 256 -  晶振值/12 /16 /波特率
公式中数字的含义这里解释一下,256 是 8 位定时器的溢出值,也就是 TL1 的溢出值, 晶振值在我们的开发板上就是 11059200,12 是说 1 个机器周期等于 12 个时钟周期,
串口通信的发送和接收电路在物理上有 2 个名字相同的 SBUF 寄存器,它们的地址也都 是 0x99,但是一个用来做发送缓冲,一个用来做接收缓冲。
流程:
串行口工作之前需对相关寄存器进行配置,设定其工作模式。
1.设置T1的工作方式2(编程TMOD寄存器);
2.
计算T1的初值,装载TH1TL1
3.
启动T1(编程TCON中的TR1位);
4.
确定串行口控制(编程SCON寄存器);

如需串行口在中断方式工作时,要进行中断设置编程IE寄存器

小白
发表于 2018-3-1 22:32:49 | 显示全部楼层

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表