我需要完成的任务如下:
我有一个模拟/数字转换器发送一个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);
}
答案 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传递值。