Arduino Uno SPI传输

时间:2017-04-29 23:42:47

标签: arduino arduino-uno spi

我需要完成的任务如下:

我有一个模拟/数字转换器发送一个10位信号。该位信号需要使用SPI协议传输到Arduino Uno。由于SPI协议使用16位模式,我需要扩展输入信号。 Slave Arduino然后需要将转移的数字作为十进制数字

对于我的任务,我会将另一个Arduino Uno设置模仿ADC作为Master,但不幸的是当时我只有一个Arduino所以我无法测试我的代码。此外,我并不知道如何将10位信号“扩展”为16位信号。

Arduino大师的代码

#include <SPI.h>
#define SS 10
#define MOSI 11

void setup() {

  pinMode(SS, OUTPUT);
  pinMode(MOSI, OUTPUT);
  SPI.beginTransaction(SPISettings(62500, LSBFIRST, SPI_MODE0));
}

void loop() {

  byte x=0000001101;
  byte y=0011111111;

  digitalWrite(SS,LOW);
  SPI.transfer(x,y);
  digitalWrite(SS,HIGH);

  delay(1000);
}

Slave Arduino的代码

#include <SPI.h>
#define SS 10
#define MOSI 11

void setup() {

  pinMode(SS, INPUT);
  pinMode(MOSI, INPUT);

}

void loop() {
  byte x=SPDR;
  byte y=SPDR;
  printf(x,DEC);
  printf(y,DEC);

  delay(1000);
}

1 个答案:

答案 0 :(得分:2)

第一期:

字节x = 0000001101; 字节y = 0011111111;

上面看起来像二进制数,但实际上它们是DECIMAL数字1101(一千一百一)和11 111 111(一千一百万)。这样的任务没有意义。两者都会溢出字节。

让我们假设您确实以某种方式将从ADC接收的值放入两个字节值,y中的8个较小位,x中的2个较高位。所以:

unsigned int z =(x <&lt; 8)+ y;

将这两个数字组合成一个16位正确的uint值。

现在你应该只使用

SPI.transfer16(Z);

通过SPI传递值。