美文网首页
[Android Things] IO和总线

[Android Things] IO和总线

作者: Cocoonshu | 来源:发表于2017-05-02 09:03 被阅读216次

Android Things为它支持的几个硬件封装了统一的访问接口,我们可以用相同的代码去操作不同硬件的IO口,唯一不同的就是IO的名字和数量。
IO口是什么呢?就是输入输出端口(Input/Output)。它可以是一个端口,也可以是一组端口,这个数量根据通信协议的不同来定义。同样的,根据协议定义出来的端口的作用,可以在同一个/组端口上与多个设备通信的端口会被称作为总线。
比较常见的也是我们能在Android Things上遇得到的IO口通常有下面这几种:

端口名称 端口数量 作用
GPIO 1 高低电平的输入输出
PWM 1 脉冲方波输出
I2C 2 同步半双工通信总线,最多可挂在127个从设备
SPI 4+ 同步全双工通信总线,多挂在一个从设备就需要多增加一个端口
UART 2/4 异步全双工通信总线,只能一对一通信
I2S 3 同步单工通信总线,只能一对一通信

我们通过Android Things的API就可以知道你的Pi上有多少总线:

PeripheralManagerService manager = new PeripheralManagerService();

// 获取GPIO端口
List portList = manager.getGpioList();

// 获取PWM端口
List portList = manager.getPwmList();

// 获取I2C总线
List i2cBusList = manager.getI2cBusList();

// 获取SPI总线
List spiBusList = manager.getSpiBusList();

// 获取UART总线
List uartList = manager.getUartDeviceList();

// 获取I2S总线
List i2sList = manager.getI2sDeviceList();

1. GPIO

General Purpose Input/Output - 通用输入输出口是最基本的IO口,作为输出时,可以输出高或者低电平来表示开或者关的状态。当时你可以让它输出n组开或关的组合来表示一些复杂的二进制信息或者脉冲信息。
它作为输入时,可以检测输入电平的高或者低,更能检测到是从低变高、一直都高、一直都低、从高变低四种状态。

在Android Things中对应的类为

Gpio

GPIO详细介绍见 [Android Things] GPIO

2. PWM

Pulse Width Modulation - 脉冲宽度调制输出。它能够按照给定的周期输出指定高电平占比的方波。
周期(Period) - 指定方波的周期/频率。
占比(Duty) - 指定高电平在一个方波周期中占有的时长比例。

PWM

在Android Things中对应的类为

Pwm

PWM详细介绍见 [Android Things] PWM

3. I2C

The Inter-Integrated Circuit (IIC or I2C) bus - 内部集成电路总线是个很老牌的通信总线了,主设备通过地址寻址的方式可以选择和任意一个从设备通信。因为I2C协议规定设备地址为7bit,所以一条I2C总线上最多可以挂载127个从设备。
它用2条线作为通信线路,但实际应用中必须让GND也连接在一起,这样主从设备在使用不同的电源供电时可以获得相同的对地参考电平。

  • SCL - 共享时钟信号
  • SDA - 共享数据信号
  • GND - 公共接地


    I2C接线图

它的通信速度由SCL上时钟信号的快慢来决定,目前大家约定俗成的为I2C规定了三个不同的通信速度:

  • 对于低速设备使用100kbps的标准通信速度
  • 对于高速设备使用400kbps的快速通信速度
  • 对于完全不同把性能放在眼里的高性能设备来说使用3.4Mbps的高速通信速度
    如果主从设备都是你自己定制的,那么通信速度完全可以由你自定义。

在Android Things中对应的类为

I2cDevice

I2C详细介绍见 [Android Things] I2C

4. SPI

Serial Peripheral Interface (SPI) - 串行外设接口是个用于全双工通信的高速总线。它在嵌入式系统里算通信速度很快的了,如果需要高速传送什么东西,但又对通信端口数量有限制,那SPI非它莫属了。
对于一个从设备来说,它需要4根信号线来通信:

  • MISO - (Master in slave out)主设备数据输入,从设备数据输出
  • MOSI - (Master out slave in)主设备数据输出,从设备数据输入
  • SCLK - 时钟信号,由主设备产生
  • CS/SS - 片选信号,由主设备控制
  • GND - 公共接地,提供低电平参考

它同一时间内只与一个从设备通信,在使用一条信号线发送数据(MOSI)的同时可以使用另一条信号线接收数据(MISO),而通信的实际速度取决于时钟信号线(SCLK)上时钟脉冲速度,而时钟脉冲速度就取决于主从设备的内部总线时钟了,所以可以竭尽所能地榨取单片机的性能。
而对于多个从设备通信的情况,所以主从设备的MISO、MOSI、SCLK都是共同的,只有片选信号线(CS/SS)是每个从设备都需要与主设备的一个独立端口相连接的。所以理论上,主设备使用SPI总线与从设备通信所需要的信号线数据是3 + 从设备数量。(当然你可以用串行转并行的模块把多条片选信号线合并为一条串行的片选信号线。)


SPI接线图

图中一个主设备连接了两个从设备,CS1和CS2就是片选信号线。平时不通信时,所有片选信号线都保持高电平,当主设备需要和第一个从设备通信时,CS1被拉低为低电平,第一个从设备就会开始理会数据线和时钟线上的信号。同理,如果主设备要跟第二个从设备通信,就会拉低CS2后开始通信。如果主设备要同时给多个从设备发送数据时,可以同时拉低多个从设备的CS片选信号,但此时有个前提是,从设备不能发送数据给主设备,不然MISO上的数据都是混乱无意义的。

在Android Things中对应的类为

SpiDevice

SPI详细介绍见 [Android Things] SPI

5.UART

Universal Asynchronous Receiver Transmitter (UART) - 通常被直接简称为串口,它是异步的全双工通信端口。和SPI的区别在于,它是全双工的异步的一对一通信端口,而SPI是全双工的同步的一对多通信总线。
正因为它的异步通信特性,所以它的实现都带有一个FIFO(先入先出)缓冲区,但同时也少了一条用于同步的时钟信号线。
它的传输码率、传输码流、数据检验方式、数据同步方式都是可以配置的,只要通信双方约定好就行,所以数据传输的速度在于通信双方约定的配置。
一般UART通信只需要3条线就可以,但因为数据同步方式可以配置多种的,其中的硬件流控方式需要额外的2条流控信号线。

UART3线接线图
  • 3线通信
    • TX(Transmiter) - 数据发送,连接对方的RX
    • RX(Receiver) - 数据接受,连接对方的TX
    • GND - 公共接地,提供共同的低电平参考
UART5线接线图
  • 5线通信
    • TX RX GND
    • RTS(Request to send) - 表示自己要开始发送数据,请求对方用CTS来应答,如果CTS应答,则说明对方可以接收数据
    • CTS(Clear to send) - 被对方的RTS监听,用于告诉对方自己的接受缓冲是否还有空间接受数据,需不需要对方先暂停发送数据

在Android Things中对应的类为

UartDevice

UART详细介绍见 [Android Things] UART

6.I2S

Inter-IC Sound (I2S) - 集成音频总线,用于连接数字音频设备并发送和接受PCM音频数据。它可以作为PCM音频信号输出,也可以作为PCM音频信号输入,也可以同时作为PCM音频信号的输出和输入(当然,这需要多废一根线,因为I2S总线是全双工的)。

I2S总线接线图
上图所示就是个同时连接音频输入设备和音频输出设备的I2S接线法。
总线引脚分别是:
  • BCLK - 位时钟(Bit Clock),由I2S Master Device(I2S主设备)产生,也称为SCLK。对应数字音频的每一位数据,SCLK都有1个脉冲。BCLK的频率 = 2 × 采样频率 × 采样位数
  • LRCLK - 左右声道选择时钟,LRCK的频率等于采样频率,它输出低电平时,SDOUT和SDIN的数据都为左声道数据,它输出高电平时,SDIN和SDIN的数据都为右声道数据。也称为FS(Frame Select)或WS(Word Select)
  • GND - 公共接地,为主从设备提供低电平参考
  • SDOUT - 为PCM数据输出
  • SDIN - 为PCM数据输入
  • MCLK - 在某些比较低级的系统中,主设备还提供从设备的执行时钟以确保更好的数据同步,通常为成为主时钟(Master Clock)或系统时钟(System Clock)。它的频率通常是采样频率的256倍或384倍

如果你只需要音频输入或者只需要音频输出,直接少接SDOUT或SDIN就好了。另外输入和输出都共用BCLK时钟线和LRCLK时钟线,所以主时钟由I2S Master Device(I2S主设备)产生就好了。

在Android Things中对应的类为

I2sDevice

I2S详细介绍见 [Android Things] I2S

相关文章

网友评论

      本文标题:[Android Things] IO和总线

      本文链接:https://www.haomeiwen.com/subject/xkfctxtx.html