RPI Serial Communication (二)

2019-04-15 15:00发布

这篇文章是给谁看的? 给那些有一定的51,PIC 等单片机基础的,并且对树莓派的通用输入输出(GPIO)数据传输有兴趣的菜鸟们(noobs!),比如我。 我能从这篇文章中学到嘛? 这篇文章是新手入门向的文章。有许多有用的链接,以及资源。你看从这里学到(复习?)很多硬件接口基础知识。 这文章是你写的? 不,不。我是在搜索GPIO parallel时无意找到的博文,觉着非常好翻译到自己的博客,方便以后查询,顺便给大家个”福利”。原文(http://jeffskinnerbox.wordpress.com/2012/12/05/raspberry-pi-serial-communication/) 哦,这样啊那你为什么要搜GPIO parallel传输呢? 我想用三个RPI同时(要同步的哦)传输视频流到PC上(做图像拼接)。正在考虑传输方式是USB 或者是GPIO(parallel)。 USB当然是最简单的方法了,但是问题是画质不稳定,而且延迟严重。所以考虑用编码以后用GPIO进行并行传输。如果有大大能给点指导,我给你捡肥皂哦~~ a <-------------------我是华丽的分割线--------------------------> 如果你对PIC或者51等单片机有相当的了解,可以直接跳过前面的回顾部分,进入下一部分。 回顾: 首先要了解的是:数据是怎样在RPI,或者说大家平常用的电脑,里传输的。在大多数情况中,总线或者说数据总线是用来传输数据的。 总线设计师的工作就是设计电路,用来把数据从这个电路传输到另一个电路。这些数据可以以串行或者并行的方式进行传输。 ·        串行总线(serialbus):最不消耗材料的传输方式。每次传输1个比特。这就是所谓的串行数据传输。数据在传输前是并行的。为了能够进行串行传输,这些数据必须先转换成串行(serial),在接收端再转换成并行(parallel).通常都有专门的电路来完成这些工作,就是所谓的SerDes(serializer/deserializer)。因为集成电路的针数(pin)大大增加了电路的成本,所以为了减少针数,在速度不是非常重要的情况下,很多厂商选择使用串行数据线来传输数据。主要的几种串行总线有: o  Serial Peripheral Interface (SPI) o  Inter-Integrated Circuit(I2C)
o  UNI/O
o  1-wire ·        并行总线(parallel bus)从某种角度来说               是更加有效的数据传输手段。               但是并行传输有着传输速度和距离的限制。如果超过了一定的速度或者距离,数据传输将变得不可靠。常见的并行总线标准有以下几种: o  Parallel Bus Inteface(PBI) o  Peripheral Component Interface(PCI) o  Samll Computer Systems Interface(SCSI) o  VMEbus o  Rambus 常用于内存数据传输 RPI GPIO:                 从名字上可以看出来,GPIO(通用输入输出接口)的功能可以通过程序来设定,已达到一定的目的。GPIO的针脚是直接和处理器核心连接的,RPI开发者已经为我们制定了几套GPIO的功能方案。(在RPIBCM2835GPIOs 页面里可以看到一张巨大的表格,注意横行黄 {MOD}的字,比如ALT0,ALT1,ALT2等等,都是可选的方案alternatives0,1,2..)。有些方案是非常有用的。在RPI启动的时候确定了使用哪一套方案。默认的是ALT0,以下是ALT0的示意图:
                                                           更改方案的方法如下: volatile unsigned *gpio;   #define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |=(((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))   下面的代码把GPIOg转换成ALT0 INP_GPIO(g); SET_GPIO_ALT(g,0); #define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3)) 这个链接告诉你怎样改变GPIOpin 的功能stepby step! 实际上,所有的26个针脚都可以独立提供不同的可选功能。关键还是看你怎么进行设置了! 除此之外,脉冲编码调制PCM(Pulse-code modulation), pin18 & 21 可以用数字信号来表示模拟信号。这个通常用来控制灯光的强度或者是电机的转速。