zoukankan      html  css  js  c++  java
  • 串口通信

    最近重新拾起单片机,是因为忘不了当初学习单片机带给我的那份做技术的踏实、充实感。

    我学习单片机真正的开始是遇到金沙滩工作室出品的《手把手教你学习单片机》,这是我见过的一个很不错的入门学习教材。顺便做个宣传(绝非广告),这个教材从单片机的基本电路 ,C51语法讲起,形象生动、干货满满,相关代码写的美极了,看起来像是饮美酒,实在是赞。只是多年过去,似乎很多人还不知道这个教材,实在也是让我多少有点吃惊(曾经我曾想象要是把把这样的书籍编为大学单片机教材就好了)!

    因为本次复习,也是以此为主要材料,所以近期很多转载内容都会从这个材料上摘抄,转载,故对版权相关问题做此声明(非原创,摘自《手把手教你学习单片机》)。哦,对了:http://www.kingst.org

    1、UART

    ( Universal Asynchronous Receiver/Transmitter,即通用异步收发器 )串行通信是单片
    机最常用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。
    波特率就是发送一位二进制数据的速率,习惯上用 baud 表示,即我们发送一位数据的持续时间=1/baud。在通信之前,单片机 1 和单片机 2 首先都要明确的约定好他们之间的通信波特率,必须保持一致,收发双方才能正常实现通信。

    单片机与上位机UART通信时需要注意的地方:(总线空闲定时器的设定)

    对于串口通信部分来说,单片机给电脑发字符串好说,有多大的数组,我们就发送多少个字节即可,但是单片机接收数据,接收多少个才应该是一帧数据呢?数据接收起始头在哪里,结束在哪里?这些我们在接收到数据前都是无从得知的。那怎么办呢?我们的编程思路基于这样一种通常的事实:当需要发送一帧(多个字节)数据时,这些数据都是连续不断的发送的,即发送完一个字节后会紧接着发送下一个字节,期间没有间隔或间隔很短,而当这一帧数据都发送完毕后,就会间隔很长一段时间(相对于连续发送时的间隔来讲)不再发送数据,也就是通信总线上会空闲一段较长的时间。于是我们就建立这样一种程序机制:设置一个软件的总线空闲定时器,这个定时器在有数据传输时(从单片机接收角度来说就是接收到数据时)清零,而在总线空闲时(也就是没有接收到数据时)时累加,当它累加到一定时间(例程里是 30ms)后,我们就可以认定一帧完整的数据已经传输完毕了,于是告诉其它程序可以来处理数据了,本次的数据处理完后就恢复到初始状态,再准备下一次的接收。那么这个用于判定一帧结束的空闲时间取多少合适呢?它取决于多个条件,并没有一个固定值,我们这里介绍几个需要考虑的原则:第一,这个时间必须大于波特率周期,很明显我们的单片机接收中断产生是在一个字节接收完毕后,也就是一个时刻点,而其接收过程我们的程序是无从知晓的,因此在至少一个波特率周期内你觉不能认为空闲已经时间达到了。第二,要考虑发送方的系统延时,因为不是所有的发送方都能让数据严格无间隔的发送,因为软件响应、关中断、系统临界区等等操作都会引起延时,所以还得再附加几个到十几个 ms 的时间。我们选取的 30ms 是一个折中的经验值,它能适应大部分的波特率(大于 1200)和大部分的系统延时(PC 机或其它单片机系统)情况。

    2、I2C

    库函数_nop_()可用来进行精确延,一个_nop_()的时间就是一个机器周期,这个库函数是包含在了 intrins.h 这个库文件中。

    I2C是一个通信协议,它拥有严密的通信时序逻辑要求,而 EEPROM 是一个器件,只是这个器件采样了I2C 协议的接口与单片机相连而已,二者并没有必然的联系,EEPROM 可以用其他接口,I2C 也可以用在其它很多器件上。

    数据传输:首先,UART 是低位在前,高位在后;而 I 2 C 通信是高位在前,低位在后。第二,UART 通信数据位是固定长度,波特率分之一,一位一位固定时间发送完毕就可以了。而 I2C 没有固定波特率,但是有时序的要求,要求当 SCL 在低电平的时候,SDA 允许变化,也就是说,发送方必须先保持 SCL 是低电平,才可以改变数据线 SDA,输出要发送的当前数据的一位;而当 SCL 在高电平的时候,SDA 绝对不可以变化,因为这个时候,接收方要来读取当前 SDA 的电平信号是 0 还是 1,因此要保证 SDA 的稳定不变化。

    3、SPI

    SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。SPI 通信原理比 I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的SPI 是 4 根线,分别是 SSEL(片选,也写作 SCS)、SCLK(时钟,也写作 SCK)、MOSI(主机输 出 从 机 输 入 Master Output/Slave Input) 和 MISO( 主 机 输 入 从 机 输 出 Master Input/Slave Output)。

    同步通信的一个特点就是所有数据的变化和采样都是伴随着时钟沿进行的,也就是说数据总是在时钟的边沿附近变化或被采样。

  • 相关阅读:
    BEM(Block–Element-Modifier)
    http://element.eleme.io/#/zh-CN/component/quickstart
    Commit message 的写法规范。本文介绍Angular 规范(
    好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
    代码管理
    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
    Martin Fowler’s Active Record design pattern.
    The Zen of Python
    Introspection in Python How to spy on your Python objects Guide to Python introspection
    Object-Oriented Metrics: LCOM 内聚性的度量
  • 原文地址:https://www.cnblogs.com/enfengguo/p/11037408.html
Copyright © 2011-2022 走看看