gpt4 book ai didi

arduino - Raspberry PI SPI 使用 wiringPI2 从 Arduino slave 读取?

转载 作者:行者123 更新时间:2023-12-02 04:52:37 25 4
gpt4 key购买 nike

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

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

和对应的Arduino代码[3]。

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

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

Arduino SPI 引用状态:

This library allows you to communicate with SPI devices, with the Arduino as the master device.

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

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

我现在处于 Google 前 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 个输入,所以我不应该得到“测试”回来吗?

我在这里错过了什么?非常感谢任何指点。

最佳答案

SPI 库假定您希望 arduino 充当主机。你不能用它来让 arduino 充当奴隶。有时您必须翻阅这些库,进入芯片的数据表,看看它是如何工作的。 (然后,理想情况下,从所有麻烦中创建一个库)

SPI 从设备必须对发起通信的主设备使用react。

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

在 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,这就是我学到的东西。

关于arduino - Raspberry PI SPI 使用 wiringPI2 从 Arduino slave 读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18556256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com