Arduino SPI зависает во время передач - PullRequest
0 голосов
/ 23 января 2019

Я нахожусь в середине проекта, и в растерянности.Мне удалось заставить 2 Arduinos общаться друг с другом через SPI, но раб останавливается во время серии передач, по-видимому, без причины.

И что действительно беспокоит, так это то, что если я посылаю больше передач от мастера, он продолжаетсерия, как если бы она ожидала продолжения.

Я думаю, что есть какое-то подтверждение или флаг, который останавливает выполнение кода, но я понятия не имею.

#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);
  }
}

1 Ответ

0 голосов
/ 23 января 2019

Это немного догадка, но мои догадки о том, что код Arduino чаще верен, чем нет.

Проверьте, как вы отправляете данные через Master.

Согласно этомукод, ведомое устройство ожидает, пока вывод SS снизится, затем обращается к SPI, затем очищает вывод ack в течение 1 миллисекунды, а затем отправляет данные связи через последовательный порт на ПК.

Проблема Iздесь видно, что 1 миллисекунда слишком мала для того, чтобы мастер мог правильно ее определить.

Так что я предполагаю, что вы написали мастер-код таким образом, что он не смотрит наПин ACK.Это означает, что мастер очистит вывод SS, выполнит обмен данными, а затем немедленно очистит вывод SS.

Это проблема, потому что ведомый соединяется с последовательным портом, как только это соединение установлено.Это означает, что когда мастер снова устанавливает низкий уровень на выводе SS, ведомый может отправлять данные на последовательный монитор и может вообще пропустить связь.

Чтобы исправить это, вам нужно изменить код ведомого нанепрерывно общайтесь с ведущим устройством, пока вывод SS низок, и отправляйте данные обратно на последовательный монитор только тогда, когда вывод SS становится высоким.

...