【问题标题】:Arduino SPI hangs during transfersArduino SPI 在传输期间挂起
【发布时间】:2019-06-16 10:44:23
【问题描述】:

我正在进行一个项目,但不知所措。我设法让 2 个 Arduinos 通过 SPI 相互交谈,但从机在一系列传输过程中停止了,似乎没有理由。

真正令人不安的是,如果我从 master 发送更多传输,它会继续这个系列,就好像它在等待继续一样。

我认为有一些确认或标志会停止代码执行,但我不知道。

#include <SPI.h>

boolean ack = 0;
#define ACK 2

byte buffer = 0;
byte rx = 0;

bool SSlast = HIGH;
byte clr = 0;

void stat_upd(byte dat, byte ric) {
  Serial.println("---------------------------------------------");
  Serial.println("Sent:");
  Serial.println(dat, HEX);

  Serial.println("Received:");  // 0x81 in teoria
  Serial.println(ric, HEX);
  return;
}

// Initialize SPI slave.
void SlaveInit(void) {
  // Initialize SPI pins.
  pinMode(SCK, INPUT);
  pinMode(MOSI, INPUT);
  pinMode(MISO, INPUT);
  pinMode(SS, INPUT);
  pinMode(ACK, OUTPUT);

  // Enable SPI as slave.

  SPCR = 0x6F;
  clr = SPSR;
  clr = SPDR;
  SPI.begin();
}

// SPI Transfer.
byte SPItransfer(byte value) {
  byte temp = 0;

  SPDR = value;

  // temp =SPI.transfer(value);

  while (!(SPSR & (1 << SPIF)));

  digitalWrite(ACK, LOW);
  delay(1);
  digitalWrite(ACK, HIGH);

  delay(10);
  return SPDR;
}

// The setup() function runs after reset.
void setup() {  ///////////////// setup

  Serial.begin(9600);

  SlaveInit();

  Serial.println("MC Initialized");
}

void loop() {  ////////////// loop
  // Slave Enabled?
  if (!digitalRead(SS)) {
    rx = SPItransfer(0x00);
    stat_upd(0x00, rx);

    rx = SPItransfer(0x08);
    stat_upd(0x08, rx);

    rx = SPItransfer(0x5a);
    stat_upd(0x5a, rx);

    rx = SPItransfer(0x5d);
    stat_upd(0x5d, rx);

    rx = SPItransfer(0x5c);
    stat_upd(0x5c, rx);

    rx = SPItransfer(0x5d);
    stat_upd(0x5d, rx);

    rx = SPItransfer(0x04);
    stat_upd(0x04, rx);

    rx = SPItransfer(0x00);
    stat_upd(0x00, rx);

    rx = SPItransfer(0x00);
    stat_upd(0x00, rx);

    rx = SPItransfer(0x80);
    stat_upd(0x80, rx);
  }
}

【问题讨论】:

标签: c++ arduino spi


【解决方案1】:

这有点猜测,但我对 Arduino 代码的猜测往往是正确的。

检查您是如何通过 Master 发送数据的。

根据此代码,从机等待 SS 引脚变为低电平,然后与 SPI 通信,然后清除 ack 引脚 1 毫秒,然后通过串行端口将通信数据发送到 PC。

我在这里看到的问题是 1 毫秒对于 master 来说太小了,无法正确检测到它。

所以我的猜测是,您以这样一种方式编写了主代码,它不会查看 ACK 引脚。也就是说master会清空SS pin,进行通讯,然后立即清除SS pin。

这是一个问题,因为一旦通信完成,从站就会与串行端口通信。这意味着当主机再次将 SS 引脚设置为低电平时,从机可能正在向串行监视器发送数据,并且可能完全错过通信。

要解决此问题,您需要更改从机代码以在 SS 引脚为低电平时与主机持续通信,并且仅在 SS 引脚变为高电平时将数据发送回串行监视器。

【讨论】:

  • 这确实是问题,昨天发现自己。现在我正在尝试与另一台设备通信!除了接地以及味噌 mosi ss 和 sck 之外还有什么建议吗?
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多