2

我在NOOBS Raspbian PI 发行版上安装了wiringpi2wiringpi2 python 包装器。Adafruit 4 通道逻辑电平转换器使 PI 免受 5v 的影响,并且在 PI 端向 Arduino 发送数据就像这样简单:

import wiringpi2
wiringpi2.wiringPiSPISetup(1,5000)
wiringpi2.wiringPiSPIDataRW(1,'HELLO WORLD\n')

以及相应的 Arduino 代码[3]。

编辑:道歉 - 从现在开始,我不能再发布我精心添加的链接,以显示我的工作、源代码和示例代码。你必须谷歌它并感谢 2-link 规则。

所以,我知道接线工作。但这不是我真正想要的方式——我想从 Arduino 读取一个引脚到 PI。

Arduino SPI 参考说明:

该库允许您与 SPI 设备通信,以 Arduino 作为主设备。

PI 必须是主设备。我以为我注定要失败,直到我阅读了 Nick Gammon 的关于 SPI 的优秀页面,该页面展示了 2 个 Arduinii 相互交谈。

此外,该SPI transfer()命令会建议您可以从 Arduino 写入。

我现在处于谷歌前 4 个结果页面的所有链接都显示为“已关注”的阶段 - 所以这不是因为缺乏谷歌搜索!

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

在 Arduino 上:

#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 结束时:

import wiringpi2
wiringpi2.wiringPiSPISetup(1,5000)
stuff = wiringpi2.wiringPiSPIDataRW(1,'\n')
print stuff

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

我在这里想念什么?任何指针都非常感谢。

4

1 回答 1

5

SPI 库假设您希望 arduino 充当主机。你不能用它来让一个 arduino 充当奴隶。有时您必须通过库深入到芯片的数据表中,看看事情是如何工作的。(然后,理想情况下,从你所有的麻烦中建立一个图书馆)

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

因此,作为 SPI 主机的 Pi 必须通过 MOSI 线路发送虚拟字节并读取 Arduino 在 MISO 线路上的回复。即master发起通信。

在 arduino 方面,您可以使用以下命令打开 SPI 中断:

SPCR |= _BV(SPIE);

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

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.
}

记住,你 GOTTAGOFAST。如果 arduino 在下一个 SPI 消息到来之前没有退出该中断服务程序,那么一切都将陷入困境。

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

| 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 中断,并将极性设置为……不管是什么……

SPCR |= _BV(SPIE) | _BV(SPE) | _BV(CPOL) ;

无论如何,我花了几天时间研究 Arduino SPI,这就是我学到的。

于 2013-10-04T15:43:28.007 回答