首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wiringPI2从Arduino奴隶那里读取Raspberry PI SPI?

wiringPI2从Arduino奴隶那里读取Raspberry PI SPI?
EN

Stack Overflow用户
提问于 2013-09-01 07:32:23
回答 1查看 4.9K关注 0票数 2

我已经在NOOBS Raspbian发行版上安装了wiringpi2wiringpi2 python包装器。Adafruit 4通道逻辑电平转换器使PI从5v保持安全,并且向Arduino发送数据就像在PI侧这样简单:

代码语言:javascript
复制
import wiringpi2
wiringpi2.wiringPiSPISetup(1,5000)
wiringpi2.wiringPiSPIDataRW(1,'HELLO WORLD\n')

以及相应的Arduino code3。

编辑:道歉-从现在起,我不能再张贴任何我仔细添加的链接,以显示我的工作,源代码和示例代码。你将不得不谷歌它和感谢2-链接规则。

所以我知道电线可以用。但这不是我真正想要的方式--我想读一个从Arduino到PI的引脚。

Arduino SPI参考文件指出:

此库允许您与SPI设备、以Arduino作为主设备的进行通信。

PI必须是主设备。我以为我注定要失败,直到我读到尼克·加蒙关于SPI的精彩页面,这篇文章展示了两个阿杜尼在互相交谈。

此外,SPI transfer()命令还建议您可以从Arduino编写。

我现在的阶段,所有的链接,所有的前4个结果页的谷歌显示为“跟随”-所以这不是因为缺乏谷歌!

理论上,如果我在PI端使用READ方法,这不应该工作吗?(注:这只是众多尝试中的一次,并不是唯一的一次!)

在Arduino号上:

代码语言:javascript
复制
#include <SPI.h>
void setup (void)
{
  SPI.begin();
  pinMode(MISO, OUTPUT);

  // turn on SPI in slave mode
  SPCR |= _BV(SPE);
}

void loop  (void) {
byte data[] = {0x00, 0x00, 0x00, 0x00};  // this is 24 bits (8bits/byte * 4 bytes)
// Transfer 24 bits of data
for (int i=0; i<4; i++) {
   SPI.transfer(data[i]);   // Send 8 bits
}
}

在PI的末端:

代码语言:javascript
复制
import wiringpi2
wiringpi2.wiringPiSPISetup(1,5000)
stuff = wiringpi2.wiringPiSPIDataRW(1,'\n')
print stuff

WiringPI说,传入的数据将覆盖我的数据,而SPIDataRW正好有2个输入,所以我不应该得到“测试”吗?

我在这里错过了什么?任何指点都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-04 15:43:28

SPI库假定您希望arduino充当主程序。你不能用它来让阿杜诺扮演奴隶的角色。有时,您必须深入到芯片的数据表库,看看事情是如何工作的。(然后,理想情况下,从你所有的麻烦中建立一个库)

SPI从设备必须对发起通信的主设备作出反应。

因此,Pi作为SPI主程序,必须通过MOSI行发送虚拟字节,并在MISO行上读取Arduino的答复。师父开始沟通。

在arduino方面,您可以打开SPI中断:

代码语言:javascript
复制
SPCR |= _BV(SPIE);

它内置在atmega328芯片中。因此,在arduino端包含下一段内容,以查看传入的消息并设置下一条消息的响应。arduino SPI从服务器响应的数据是主发送消息时数据寄存器中的任何数据。

代码语言:javascript
复制
int gCurrentSpiByte;  //or set up your a buffer or whatever
ISR (SPI_STC_vect)
{
  gCurrentSpiByte = SPDR;  // grab byte from SPI Data Register
  SPDR = buf[messageCount++]; //Set the data to be sent out on the NEXT message.
}

记住,你这家伙。如果arduino在下一条SPI消息到来之前没有退出该中断服务例程,那么这一切都会变成地狱。

此外,检查以确保时钟的极性和相位在Pi和Arduino之间是相同的(也称为模式0-3)。

代码语言:javascript
复制
| 7    | 6    | 5    | 4    | 3    | 2    | 1    | 0    |
| SPIE | SPE  | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |

SPIE - Enables the SPI interrupt when 1
SPE - Enables the SPI when 1
DORD - Sends data least Significant Bit First when 1, most Significant Bit first when 0
MSTR - Sets the Arduino in master mode when 1, slave mode when 0
CPOL - Sets the data clock to be idle when high if set to 1, idle when low if set to 0
CPHA - Samples data on the falling edge of the data clock when 1, rising edge when 0
SPR1 and SPR0 - Sets the SPI speed, 00 is fastest (4MHz) 11 is slowest (250KHz)

所以打开SPI,SPI中断,并将极性设置为.不管那是什么。

代码语言:javascript
复制
SPCR |= _BV(SPIE) | _BV(SPE) | _BV(CPOL) ;

不管怎么说,我花了几天时间和Arduino SPI在一起,这就是我学到的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18556256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档