求教树莓派官网用wiringPi控制SPI口的方法,高分!!

树莓派打造视频监控机器人Verybot...
根据自己的一些从业经验,将这些系统设计时针对波特率自适应问题做一些阐述和分享..
树莓派B+ 之 GPIO 输入输出 测试 C语言
<em style="color:#999;font-size:12 margin-left:10" id="authorposton14-10-23 19:54:22&nbsp
本帖最后由 嵌入式狂热青年 于
20:07 编辑
首先安装 WiringPi
WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3。
远程登录树莓派你需要用到如下工具(PUTTY.EXE)
QQ截图40.jpg (28.78 KB, 下载次数: 0)
19:50 上传
然后登录树莓派:
001.jpg (31.91 KB, 下载次数: 0)
19:51 上传
安装 WiringPi
0002.jpg (25.54 KB, 下载次数: 0)
19:52 上传
04565.jpg (77.8 KB, 下载次数: 0)
19:52 上传
输入:&&gpio -v& & 和 gpio readall&&查看安装是否成功
出现下图所示既安装成功:
01456.jpg (114.71 KB, 下载次数: 0)
19:52 上传
这里打印出来的是&&GPIO 的 名称 和对应引脚
------------------------------------------------------------
看着这LED 这面包板 又想起我刚入门单片机时的情景了
1132132.jpg (22.21 KB, 下载次数: 0)
19:53 上传
.jpg (34.3 KB, 下载次数: 0)
19:53 上传
.jpg (43.4 KB, 下载次数: 0)
19:53 上传
测试程序:
/*==================================================
*功能:按键按下,对应LED点亮同时屏幕打印对应颜色LED亮
*思路: 根据51单片机的控制思路
*方法:通过树莓派GPIO库wiringPi实现
*过程:在win7下编写代码,再传入树莓派。
*编译:用 cd ~/代码所在文件夹 打开
* 然后 gcc -Wall -o ** **.c -lwiringPi 命令编译
* ** 代表你的 .C 文件名称, 用 sudo ./** 命令运行
*以下接线GPIO引脚序号是wiringP库对应引脚序号*
*以下IO分布可通过树莓派终端输入 gpio readall 命令得到*
+-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | OUT | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | OUT | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | OUT | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | ALT0 | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | ALT0 | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | ALT0 | 0 | 23 || 24 | 1 | ALT0 | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | ALT0 | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 1 | OUT | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 1 | OUT | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 1 | OUT | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+
------------------------接线-------------------------
+LED共阳接法
+红LED接 GPIO 29
+黄LED接 GPIO 28
+绿LED接 GPIO 27
+按键共阳接法
+按键A接 GPIO 1
+按键B接 GPIO 4
+按键C接 GPIO 5
+GPIO 输入引脚 通过 10K电阻接地
——#include&刘云祥&
————————
===================================================*/
#include &wiringPi.h&
#include &stdint.h&
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &sys/sysinfo.h&
int main()
wiringPiSetup() ; //初始化GPIO
pinMode (1, INPUT) ; //设置GPIO 1 引脚 为输入模式
pinMode (4, INPUT) ;
pinMode (5, INPUT) ;
pinMode (29, OUTPUT) ; //设置GPIO 29 引脚 为输出模式
pinMode (28, OUTPUT) ;
pinMode (27, OUTPUT) ;
//以下为按键处理以及LED点亮;
if(digitalRead (1) == 1){delay (100) ;//延时去抖动
if(digitalRead (1) == 1) { digitalWrite(27, LOW); printf(&绿色LED亮\n&);//如果GPIO 1 引脚为高电平,则 GPIO 27 引脚 点亮,同时打印;
while(digitalRead (1) == 1) ; }}//等待按键放开;
else digitalWrite(27, HIGH);// 如果 GPIO 1 不为高 那么 熄灭LED;
if(digitalRead (4) == 1){delay (100) ;
if(digitalRead (4) == 1) { digitalWrite(28, LOW); printf(&黄色LED亮\n&);
while(digitalRead (4) == 1) ; } }
else digitalWrite(28, HIGH);
if(digitalRead (5) == 1){delay (100) ;
if(digitalRead (5) == 1) { digitalWrite(29, LOW); printf(&红色LED亮\n&);
while(digitalRead (5) == 1) ; } }
else digitalWrite(29, HIGH);
测试运行一下:
454646.jpg (17.89 KB, 下载次数: 0)
19:54 上传
delay函数在什么库文件里面?
delay函数在什么库文件里面?
在这个头文件里 &wiringPi.h&
delay函数在什么库文件里面?
在&wiringPi.h&这个里面
我的程序在编译的时候一直提到没有定义pinMode和digitalWrite函数,而我确实是声明了库的,知道原因吗?
5.jpg (28.15 KB, 下载次数: 0)
07:05 上传
我的程序在编译的时候一直提到没有定义pinMode和digitalWrite函数,而我确实是声明了库的,知道原因吗? ...
编译命令 有没有链接到& &-lwiringPi&&
& &-lwiringPi表示动态加载wiringPi共享库
编译命令 有没有链接到& &-lwiringPi&&
& &-lwiringPi表示动态加载wiringPi共享库[/backcolo ...
程序中使用了循环,是死循环,如何来结束程序
程序中使用了循环,是死循环,如何来结束程序
................................& && && & ctrl + c
................................& && && & ctrl + c
在使用I2C设备,SD2403RTC,现在不管怎么弄只能读取一个字节(0x00)的数据。网上查了一下说是停止的时间为1.7us,时间太短了,得不到应答信号。一个解决的办法是将速度降低到20000,可是按照教程
sudo nano /etc/modprobe.d/custom.conf编辑了这个文件,启动后居然连i2c设备都无法加载了
在使用I2C设备,SD2403RTC,现在不管怎么弄只能读取一个字节(0x00)的数据。网上查了一下说是停止的时间 ...
http://blog.csdn.net/xukai871105/article/details/
希望对你有帮助
http://blog.csdn.net/xukai871105/article/details/
希望对你有帮助
看过了,按照文中所说的方法,第一种没法改变速度,第二种设置之后重启,i2c设备就自动到卸载了,lsmod显示不出i2c的信息,但是用i2cdetect 可以查到地址,程序运行也不正常。之前可以说只能取得00寄存器,设置之后全部都是ff。
站长推荐 /4
Powered by- amoBBS 阿莫电子论坛
后使用快捷导航没有帐号?
现在就登录 - amoBBS 阿莫电子论坛 手机版
立即使用手机访问,获得极速移动体验
您可以通过手机快速访问论坛版块及管理收藏夹,随时随地访问自己最爱的内容
看帖及回帖更快速
通过手机版,可以快速的访问您需要阅读的主题,并可以快速的发布新帖及回复
站内短信实时收发,与短信另一端的朋友进行单人或多人聊天
节省流量与获得优质手机体验并存
阿莫电子论坛, 原"中国电子开发网"提升树莓派B+版USB输出电流限制到1.2A_树莓派求助&教程_ICKey电子工程师论坛-ICKey电子工程师社区
发表于& 07:18:22
树莓派B+版改进了供电电路,USB口的最大输出电流也能到1.2A了,这样接移动硬盘就很爽了。
当然,这有一定的风险,不是再非常必要的情况下不要这么做!如果因此导致的树莓派毁坏,本人概不负责!
sudo nano /boot/config.txt
添加以下这行
safe_mode_gpio=4
需要注意的是,随着树莓派固件的升级,这行会变为:
max_usb_current=1
之后重启生效
sudo reboot
方法二:无需重启,只要你安装过WiringPi就行:
BCM_GPIO 38 是魔法控制针脚,执行以下命令把,不要怀疑
gpio -g write 38 0
gpio -g mode 38 out
gpio -g write 38 0是默认600mAh限制,如果想提升到1.2A那么把0变为1
gpio -g write 38 1
gpio -g mode 38 out
有兴趣的朋友可以试试!本人对因此带来的任何后果概不负责!
原文在这:
https://projects.drogon.net/testing-setting-the-usb-current-limiter-on-the-raspberry-pi-b/
原创技术先锋,加分鼓励!
.。o0O0o。.。o0O0o。.。o0O0o。.
上一帖子:
下一帖子:
发表于& 09:29:38
风险大不大啊
发表于& 10:01:03
只接一个设备应该没啥问题,起码带个移动硬盘什么的。
.。o0O0o。.。o0O0o。.。o0O0o。.
发表于& 17:55:34
这个家伙很懒,什么也没有留下
地址:上海市徐汇区漕溪路222号航天大厦南楼18层
客服热线:400-:00-18:30)
投诉电话:021-8668人阅读
& & 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰。深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的“玩法”。wiringPi是一个简单易用的函数库,通过wiringPi可以扩展SPI和I2C等芯片,关于wiringPi的介绍和安装请参考我的另一篇【】。
& & 本篇博文将通过一个简单的例子呈现wiringPi的使用,虽然例子简单但会深入分析wiringPi内部实现代码。
2.BCM2835 GPIO相关寄存器
&&&&树莓派平台的GPIO驱动,例如RPi.GPIO和WiringPi均采用直接操作GPIO寄存器的方式,树莓派的CPU采用博通的BCM2835,想要更好的了解树莓派的GPIO驱动实现就必须阅读BCM2835的数据手册。在BCM2835数据手册中需要认真关注两个内容:
&&&&外设寄存器物理地址和外设虚拟地址的映射关系。在linux操作系统中,借助ARM内部的MMU,CPU外设物理地址映射成了虚拟地址,外设的物理起始地址为0x7E000000,被MMU虚拟之后的起始地址为0x。以此类推,GPIO外设物理起始地址为0x7E0x200000,被MMU虚拟之后的GPIO外设地址为0x;0x200000。那么对于linux系统而言,GPIO相关操作的起始地址为0x。BCM2835的内部映射关系如下图所示。
图1 BCM2835 物理地址和虚拟地址映射关系
&&&&GPFSELx、GPSETx、GPCLRx和GPLEVn寄存器。简单来说,GPFSELx为IO口方向或复用寄存器,负责IO口方向例如输入或输出;GPSETx为IO口输出寄存器,负责IO口输出逻辑高电平;GPCLRx寄存器同为IO口输出寄存器,不过和GPSETx相反,负责输出逻辑低电平。GPLEVx为IO口输入寄存器,负责IO口输入状态。
(亲爱的网友们,如果您不理解这些寄存器也不理解MMU机制,也不会影响您使用wiringPi。请放心大胆地使用wiringPi,它已经帮你完成了很多基础性的工作)
3.简单测试代码
& & 下面通过一个简单的代码实现树莓派流水灯,在树莓派(树莓派版本2)中可以直接利用的IO口共有8个,在wiringPi中的编号为GPIO0到GPIO7,对于BCM2835而言编号分别为17, 18, 27, 22, 23, 24, 25, 4。具体对应关系见下图。
图2 wiringPi GPIO 和 BCM2835 GPIO映射关系
#include &wiringPi.h&
int main( )
// 初始化wiringPi
wiringPiSetup();
int i = 0;
// 设置IO口全部为输出状态
for( i = 0 ; i & 8 ; i++ )
pinMode(i, OUTPUT);
for( i = 0 ; i & 8 ; i++ )
// 点亮500ms 熄灭500ms
digitalWrite(i, HIGH); delay(500);
digitalWrite(i, LOW); delay(500);
为了方便生成可执行文件,可编写以下makefile文件,CD进入该目录之后直接make即可。
blink:blink.o
gcc blink.c -o blink -lwiringPi
rm -f blink blink.o
图3 代码运行结果
4.代码详解
&&&&上面的代码非常简单,可以分为四个部分——wiringPiSetupi初始化、pinMode设置IO为输出方向、digitalWrite输出高电平或低电平和delay系统延时函数。
4.1 wiringPiSetup
int wiringPiSetup (void)
int boardR
// 第一步,获得树莓派的版本编号,并根据版本编号映射IO口
boardRev = piBoardRev () ;
if (boardRev == 1)
pinToGpio = pinToGpioR1 ;
physToGpio = physToGpioR1 ;
pinToGpio = pinToGpioR2 ;
physToGpio = physToGpioR2 ;
// 第二步,打开/dev/mem设备,使得在用户空间可以直接操作内存地址
if ((fd = open (&/dev/mem&, O_RDWR | O_SYNC | O_CLOEXEC) ) & 0)
return wiringPiFailure (WPI_ALMOST, &wiringPiSetup: Unable to open /dev/mem: %s\n&, strerror (errno)) ;
gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ;
if ((int32_t)gpio == -1)
return wiringPiFailure (WPI_ALMOST, &wiringPiSetup: mmap (GPIO) failed: %s\n&, strerror (errno)) ;
// 第三步,设定wiringPi GPIO外设的操作模式
wiringPiMode = WPI_MODE_PINS ;
return 0 ;
该部分代码的实现可以分为三步(注意该部分并不是wiringPiSetup的完整代码,为了说明问题对代码进行简化)
& &&第一步,获得树莓派的版本编号,并根据版本编号映射IO口。&pinToGpioR2为树莓派版本2的GPIO映射关系,不但包括GPIO,还包括SPI、I2C和UART等。此处physToGpioRx存在疑问。
& &&第二步,打开/dev/mem设备,使得在用户空间可以直接操作内存地址。&/dev/mem是物理内存的全映像,可以用来访问物理内存(能够访问物理内存当然也包括MCU外设),一般用法是open(&/dev/mem&,O_RDWR|O_SYNC),接着可以用mmap的地址来访问物理内存(此处为GPIO_BASE),这是实现用户空间驱动的一种方法【】。(该部分需要深入,请关注后期博文)
& &&第三步,设定wiringPi GPIO外设的操作模式。此处也存在若干疑惑,默认情况便是使用WPI_MODE_PINS&模式,wiringPi的IO管脚编号和BCM IO管脚编号存在一个固定映射关系,但是wiringPi其他代码中还存在wiringPiSetupSys函数,该函数操作GPIO端口时通过/sys/class/gpio中的驱动文件实现,这也是实现树莓派GPIO操作的另一个途径。这种方法便是应用Sysfs——Sysfs
是 Linux 2.6 所提供的一种虚拟文件系统,这个文件系统不仅可以把设备(devices)和驱动程序(drivers) 的信息从内核输出到 用户空间,也可以用来对设备和驱动程序做设置【】。(该部分需要深入,请关注后期博文)。
int wiringPiSetupSys (void)
int boardR
char fName [128] ;
// 获得树莓派版本编号,版本1或者版本2
boardRev = piBoardRev () ;
if (boardRev == 1)
pinToGpio = pinToGpioR1 ;
physToGpio = physToGpioR1 ;
pinToGpio = pinToGpioR2 ;
physToGpio = physToGpioR2 ;
// 查找/sys/class/gpio,并记录GPIOx操作文件fd
for (pin = 0 ; pin & 64 ; ++pin)
sprintf (fName, &/sys/class/gpio/gpio%d/value&, pin) ;
sysFds [pin] = open (fName, O_RDWR) ;
// 设置操作模式为 sysfs模式 文件方式驱动GPIO而非寄存器方式
wiringPiMode = WPI_MODE_GPIO_SYS ;
return 0 ;
4.2 pinMode
void pinMode (int pin, int mode)
int fSel, shift,
struct wiringPiNodeStruct *node = wiringPiN
// 树莓派 板载GPIO设置,板载GPIO的管脚编号必须小于64
if ((pin & PI_GPIO_MASK) == 0)
// 第一步 确定BCM GPIO引脚编号
if (wiringPiMode == WPI_MODE_PINS)
pin = pinToGpio [pin] ;
// 第二步,确定该管脚对应的fsel寄存器
fSel = gpioToGPFSEL [pin] ;
shift = gpioToShift [pin] ;
// 第三步,根据输入和输出状态设置fsel寄存器
if (mode == INPUT)
*(gpio + fSel) = (*(gpio + fSel) & ~(7 && shift)) ;
else if (mode == OUTPUT)
*(gpio + fSel) = (*(gpio + fSel) & ~(7 && shift)) | (1 && shift) ;
// 树莓派 外扩GPIO设置
if ((node = wiringPiFindNode (pin)) != NULL)
node-&pinMode (node, pin, mode) ;
该部分代码的实现可以分为三步(注意该部分并不是pinMode&的完整代码,为了说明问题对代码进行简化)
【注意】在wiringPi中,pin编号小于64认为是板载GPIO,如果编号大于64则认为是外扩GPIO,例如使用外扩的MCP23017或者PCF8574,同时外扩的AD和DA芯片的相应pin也应该大于64。
& &&第一步,确定BCM GPIO引脚编号。如果是树莓派2版本,那么映射关系由数组pinToGpioR2决定
static int pinToGpioR2 [64] =
17, 18, 27, 22, 23, 24, 25, 4, // GPIO 0 through 7: wpi 0 - 7
2, 3, // I2C - SDA0, SCL0 wpi 8 - 9
8, 7, // SPI - CE1, CE0 wpi 10 - 11
10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14
14, 15, // UART - Tx, Rx wpi 15 - 16
28, 29, 30, 31, // New GPIOs 8 though 11 wpi 17 - 20
& &&第二步,根据输入和输出状态设置fsel寄存器 。作者采用简单明了的查表法,在一个FSEL寄存器中共可设置10个GPIO管脚。具体的含义可查看数据手册和gpioToGPFSEL、gpioToShift的具体定义
static uint8_t gpioToGPFSEL [] =
0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,
5,5,5,5,5,5,5,5,5,5,
static uint8_t gpioToShift [] =
0,3,6,9,12,15,18,21,24,27,
0,3,6,9,12,15,18,21,24,27,
0,3,6,9,12,15,18,21,24,27,
0,3,6,9,12,15,18,21,24,27,
0,3,6,9,12,15,18,21,24,27,
&&&&第三步,根据输入和输出状态设置FSEL寄存器。结合第二步便可发现其中的设置技巧。例如操作wringPi的GPIO0对应BCM GPIO17;那么查找gpioToGPFSEL表,应操作第1个(从0开始计数)FSELl寄存器;*(gpio &#43; fSel)中gpio指GPIO外设的虚拟起始地址,此处为0x2200000,第二个FSEL寄存器在此基础上地址偏移1。 shift决定置1或者置0的具体位,例如此时的GPIO17,对应该fsel寄存器的21位;如果是输入状态21-23位全部为0,如果是输出状态21位为1,具体代码如下:
*(gpio &#43; fSel) = (*(gpio &#43; fSel) & ~(7 && shift)) ; &&&&&&&&&&&&&&&&&&&&&——设置为输入IO
*(gpio &#43; fSel) = (*(gpio &#43; fSel) & ~(7 && shift)) | (1 && shift) ; &——设置为输出IO
图4 BCM2835 FSEL寄存器含义
4.3 digitalWrite
void digitalWrite (int pin, int value)
struct wiringPiNodeStruct *node = wiringPiN
// 树莓派 板载GPIO设置,板载GPIO的管脚编号必须小于64
if ((pin & PI_GPIO_MASK) == 0)
// 第一步 确定BCM GPIO引脚编号
if (wiringPiMode == WPI_MODE_PINS)
pin = pinToGpio [pin] ;
// 第二步 设置高电平和低电平
if (value == LOW)
*(gpio + gpioToGPCLR [pin]) = 1 && (pin & 31) ;
*(gpio + gpioToGPSET [pin]) = 1 && (pin & 31) ;
if ((node = wiringPiFindNode (pin)) != NULL)
node-&digitalWrite (node, pin, value) ;
该部分代码的实现可以分为两步(注意该部分并不是digitalWrite&&的完整代码,为了说明问题对代码进行简化)
& &&第一步,确定BCM GPIO引脚编号。
& &&第二步,设置高电平和低电平。该步骤用于设置GPCLR寄存器和GPSET寄存器。BCM GPIO0到GPIO31 位于GPIO Output Set Register 0 ,相对于GPIO_BASE的偏移量为7,而BCM GPIO32到GPIO53 位于GPIO Output Set Register 1,相对于GPIO_BASE的偏移量为8。例如操作wringPi的GPIO0,对应BCM
GPIO17;查找gpioToGPSET表可获得GPIO17位于GPIO Output Set Register 0寄存器,该寄存器的偏移量(相对于GPIO_BASE)为7。通过*(gpio &#43; gpioToGPSET [pin]) = 1 && (pin & 31) ,便可设置GPIO17为输出高电平。
图5 BCM2835 SET寄存器含义&
void delay (unsigned int howLong)
struct timespec sleeper,
sleeper.tv_sec = (time_t)(howLong / 1000) ;
sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ;
nanosleep (&sleeper, &dummy) ;
& & delay是wiringPi提供的一个毫秒级别的延时函数,该函数通过nanosleep实现。nanosleep的声明如下:
#include &time.h&
int nanosleep(const struct timespec *req, struct timespec *rem);
&&&&调用nanosleep使得进程挂起,直到req所设定的时间耗尽。在该函数中,req至进程最终休眠的时间而rem只剩余的休眠时间,struct timespec结构体的定义如下,
struct timespec {
time_t tv_
/* 纳秒 */
&&&&从结构体的成员来说,nanosleep&#20284;乎可以实现纳秒级别的延时,但是受到linux时钟精度的影响无法实现纳秒级别的延时,但是微妙级别的延时也可以让人接受。
& & &深入分析wiringPi之后收获颇丰。wiringPi可通过两种方式实现GPIO的驱动——第一,在用户空间直接操作寄存器(RAM),在用户空间操作寄存器(RAM)需要借助&/dev/mem;第二,利用/sys/class/gpio,通过操作文件的方式控制GPIO。在wiringPi中pin编号小于64为板载设备,例如GPIO0到GPIO7为板载设备,pin编号大于64为扩展设备,例如扩展的AD和DA芯片。最后可以使用nanosleep实现定时休眠。
& & 未来将利用wiringPi实现SPI和I2C设备。
6.参考资料和博文链接
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:392659次
积分:6111
积分:6111
排名:第1250名
原创:175篇
评论:705条
(2)(1)(7)(16)(17)(14)(5)(13)(9)(4)(15)(11)(13)(12)(1)(3)(2)(21)(1)(4)(2)(1)(5)(2)(1)3415人阅读
& & 最近浏览器树莓派官方发现树莓派推出了两款新Model——一款名为树莓派 model B&#43;,一款名为树莓派 Compute Module Dev Kit。带着欣喜和恐惧查阅了相关资料,并通过淘宝和RS中国了解开发板价&#26684;。欣喜的感觉来自于树莓派的功能得到了增强,恐惧来自于树莓派的改变带来新的学习成本。经过几天的资料收集,所以整理成博文和大家分享。
1 横向比较
& & 【共性比较】
表1 三款树莓派横向比较
Model B&#43;
Compute Module Dev Kit
USB端口数量
GPIO扩展总数
购买价&#26684;
注1:Model B和Model B&#43;价&#26684;来自淘宝
注2:Compute Module Dev Kit价&#26684;来自RS中国,不含税和运费
& & 【重点比较】
& & 由于Compute Module Dev Kit比较昂贵,国内供货暂时没有跟上,所以重点分析Model B&#43;和Model B。从图1大致可以看出树莓派B和B&#43;在外观和功能上的差异。
图1 Model B&#43;和Model B的比较——图片来自element14
& & 【1】USB数量由2个变为4个。USB数量的增加更方便鼠标、键盘和USB无线网卡的使用。
& & 【2】存储设备由SDCard变为了MicroSD,说的直白些由SD卡变为了T卡,使用树莓派B的朋友们在更换时需要购买一张T卡。最后树莓派官网推荐购买4G大小class
4类型的T卡,class 10类型的T卡可能有些浪费了。
& & 【3】GPIO端口变化,GPIO扩展口有26脚变为了40脚。
& & 【4】价&#26684;相差不大,或许还有降价的空间。
2 GPIO是否兼容
& & 树莓派的GPIO扩展口由26脚变为40脚,新老树莓派的GPIO扩展口的原理图如下:
图2 树莓派B GPIO扩展口原理图 & & & & & & & & & & & & &&图3 树莓派B&#43; GPIO扩展口
& & 分析以上两图可以得到
& & 【1】树莓派B&#43; GPIO端口兼容树莓派B,树莓派B&#43;在原来的基础上增加若干GPIO,而没有改变原GPIO 扩展插座的顺序。
& & 【2】增加了9个可用GPIO。
3 库的更新情况
& & 在前面的博文中使用了多款树莓派软件扩展库,包括wiringPi,RPI.GPIO和webiopi。
& & 【wiringPi】——更新
& & & & 更新内容请查看博文——【】
& & 【RPi.GPIO】——更新
& & & & 在最新版的changelog中可以发现,从0.5.6版本开始支持了树莓派B&#43;版本。
- Issue 68 - support for RPi Model B&#43;
- Fix gpio_function()
& & 【webiopi】——暂未更新
& & 【1】树莓派B&#43;增加了两个USB端口
& & 【2】树莓派B&#43;增加了9个可用GPIO端口
& & 【3】树莓派B&#43;和B GPIO兼容
& & 【4】截止2014年7月,wiringPi和RPi.GPIO 已经支持树莓派B&#43;。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:392661次
积分:6111
积分:6111
排名:第1250名
原创:175篇
评论:705条
(2)(1)(7)(16)(17)(14)(5)(13)(9)(4)(15)(11)(13)(12)(1)(3)(2)(21)(1)(4)(2)(1)(5)(2)(1)

我要回帖

更多关于 树莓派官网 的文章

 

随机推荐