Как подключить 2 устройства SPI к Arduino MkrZero - PullRequest
0 голосов
/ 06 октября 2018

У меня проблема с тем, что я не могу подключить 2 устройства SPI к моему MkrZero.Одно устройство представляет собой CAN Shield , а другое - Ethernet Shield .

Оба прекрасно работают самостоятельно, без подключения другого, но, похоже, не работают, когдаоба подключены одновременно.Это заставляет меня думать, что моя проводка и код верны, но что-то по-прежнему отсутствует.

Секция CAN инициализируется, несмотря ни на что, кажется, что выполнение останавливается на коде Ethernet.Но код Ethernet работает нормально, когда провода CAN отключены.

Я пробовал вручную устанавливать выводы CS, это мало что дает.Даже если оба контакта подняты, CAN запускается.Это подразумевает, что библиотеки берут на себя управление выводами.

Я читал различные учебные пособия о том, как подключить несколько устройств с SPI, но в большинстве случаев устройства являются дубликатами.Мои устройства разные.Я подключил выводы SPI точно так же, как и должен, с разными выводами CS для каждого устройства, но проблема сохраняется.

Вот мой код

#include <CAN.h>              //https://github.com/sandeepmistry/arduino-CAN
#include <MCP2515.h>          //https://github.com/sandeepmistry/arduino-CAN Changes CS and Int pins from Uno to MkrZero configuration
#include <Ethernet.h>
#include <ArduinoJson.hpp>
#include <ArduinoJson.h>
#include <PubSubClient.h>
#include <Losant.h>
#include <SPI.h>

//Ethernet setup
#define MQTT_MAX_TRANSFER_SIZE 80  //this was done as a result of troubleshooting
byte mac[] = {  0x2C, 0xF7, 0xF1, 0x08, 0x19, 0x2C };
IPAddress ip (192, 168, 0, 1);
EthernetClient client;

// ** Configure the Losant credentials to enable comms over mqtt **
const char* LOSANT_DEVICE_ID = "";
const char* LOSANT_ACCESS_KEY = "";
const char* LOSANT_ACCESS_SECRET = "";
LosantDevice device(LOSANT_DEVICE_ID);

// The setup() function runs once each time the micro-controller starts
void setup()
{
  Serial.begin(9600);
  while(!Serial) {  }
  Serial.println("started UART");
  //pinMode(BUTTON_PIN, INPUT); 

  // disable SD SPI
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);

  //starting ethernet
  Ethernet.init(6); //changing Ethernet shield software select pin to 6 since default is an SPI transfer pin
  Serial.println("ethernet about to start");
  while(!Ethernet.begin(mac))  {}
  Serial.println("ethernet started");

  while (!CAN.begin(200E3)) {
    Serial.println("Starting CAN failed! ");
    delay(250);
  }
  Serial.println("CAN started");
  delay(100);   

Есть ли у кого-нибудь какие-либо идеи по устранению неполадок?это или в чем проблема?

Было получено несколько ответов, в которых не предполагалось, что шина SPI не изменилась по сравнению с последней транзакцией.Мне нужно сбрасывать параметры SPI каждый раз, когда я отправляю транзакцию.После просмотра библиотек я видел, что SPI.begintransaction () вызывается перед каждым обменом SPI, который, насколько мне известно, сбрасывает параметры.Это означает, что мне не нужно вручную изменять параметры шины SPI перед каждой транзакцией.Я не прав в этом отношении?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Проблема была со смещением уровня.Я подключил вывод разрешения OE к CAN CS, что придает микросхеме высокий импеданс, когда он не используется, и включает его, когда я хочу отправить данные.

Я использовал свой прицел для подключения к выводам SPIи записал, что происходило.Все работало хорошо, пока я не попал в MISO.Переключатель уровня возился с ним и тянул его на землю.В основном глушитель выводится из одного из щитов.

Обучение здесь происходит при использовании переключателей уровня с устройствами SPI, которые подключают CS к OE.

0 голосов
/ 07 октября 2018

Шина SPI действительно проста, и не должно быть никаких проблем при подключении нескольких ведомых устройств, если только в любое время только один из них имеет CS_ (низкий уровень).Можно ожидать, что библиотека получает контроль над выводом CS_, но она также должна деактивировать ее после завершения работы.Если нет, то библиотека будет очень плохой.

Вам следует проверить аппаратное и программное обеспечение.

Аппаратное обеспечение: используйте область с памятью и посмотрите, что происходит во время инициализации.Может быть, для выводов CS_ требуется подтягивающий резистор (библиотека, если она берет на себя управление своим выводом CS_, может предпочесть поместить его в высокоимпедансный, вместо того, чтобы повышать его).Если у вас нет области действия, вы, возможно, можете контролировать контакты с помощью программного обеспечения.

Программное обеспечение: могут ли библиотеки использовать прерывания?В этом случае программа может делать вещи, о которых вы не знаете, например, библиотека может опрашивать устройство в фоновом режиме и связываться с вашим кодом или из другой библиотеки.Вы должны погрузиться в документацию и код библиотеки.Опять же, область видимости очень помогла бы.

Вы не особо указали в своей настройке, и ваши попытки «вручную отменить выбор выводов CS_) действительно вызывают беспокойство. Вам следует дважды проверить этот момент - если CS_Пин высокий, нет причин, по которым другое устройство SPI не работает.

...