1. 综述:
GPIO 和 SPI 都是嵌入式智能设备最常用的外设接口。
2.GPIO
GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。
3.SPI
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200. SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线SS(有的 SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。
L2C介绍
I2C(Inter-Integrated Circuit)是由PHILIPS公司开发的一种总线,它支持主从模式数据的发送和接受。I2C是一种两线式串行总线,它由串行数据线和串行时钟线组成,连接到总线上的设备可以通过这两个线来交换数据。I2C总线连接微控制器及其外围设备,每个外围设备根据分配的不同的地址既可以作为发送器又可以作为接收器。每一个连接到总线上的设备都必须开漏极或接有上拉电阻的开集电极输出。它支持多主控,并有冲突检测以及通信控制协议防止数据丢失,通信控制协议保证即使在有多个主控试图同时控制总线时,在任一时间点上也只能有一个主控来控制总线,同时,它还能启动等待模式下的MCU。在标准模式下的I2C总线的速度可达到100kbit/s,快速模式下400kbit/s,高速模式下可达3.4Mbit/s,
I2C总线接口引脚
与 I2C总线相关的引脚有两条,分别是SDA0和SCL0,其配置如下:
- SDA0:SDA0是一个复用引脚,它可以作为通用I/O端口、外部中断输入(磁滞输入)、8bit串行I/O的串行数据输出引脚(N沟道开漏极)以及I2C数据I/O引脚。当启用I2C时(ICCR0:EN=1),SDA0自动作为I2C总线的I/O引脚。将其作为输入引脚时,使能I2C总线(ICCR0:EN=1),并在对应的数据方向寄存器(DDR)中写入0 。
- SCL0:SCL0引脚可以作为N沟道开漏极I/O引脚,外部中断输入(磁滞输入),8bit 串行I/O的串行数据输出引脚 (磁滞输入)以及I2C串行时钟I/O引脚。当启用I2C时(ICCR0:EN=1),SCL0自动作为I2C总线的移位时钟I/O引脚。将其作为输入引脚时,使能I2C总线(ICCR0:EN=1),并在对应的数据方向寄存器(DDR)中写入
8.4.2 I2C 的工作模式
I2C系统利用串行数据线(SDA0)和串行时钟线(SCL0)来进行数据传输,每个连接到总线上的设备都有一个独立的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接手器),这取决于它所要完成的功能。
一:Python操作树莓派GPIO的必要准备
sudo apt-get install python-setuptools
sudo easy_install -U distribute
sudo apt-get install python-dev
sudo easy_install RPi.GPIO
二:树莓派GPIO定义图
三:PRi.GPIO的使用示例
import RPi.GPIO
import time
RPi.GPIO.setmode(RPi.GPIO.BOARD) #GPIO.BOARD GPIO.BCM分别表示IO口的标号方式
RPi.GPIO.setup(12,RPi.GPIO.OUT)
RPi.GPIO.setup(11,RPi.GPIO.IN)
RPi.GPIO.output(12,GPIO.HIGH)
while True:
if RPi.GPIO.input(11):
RPi.GPIO.output(12,GPIO.LOW)
else:
RPi.GPIO.output(12,GPIO.HIGH)
time.sleep(1)
//还要说明的是, 网上有两中GPIO图, 如下
当我们使用wiringpi编程时, 使用第一张为准, 也就是GPIO从0-7的左边这一张