Как подключить 2 устройства SPI к Arduino MkrZero

У меня возникла проблема, когда я не могу подключить 2 устройства SPI к моему MkrZero. Одно устройство представляет собой щит CAN, а другое — 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 перед каждой транзакцией. Я ошибаюсь в этом отношении?


person henradrie    schedule 06.10.2018    source источник
comment
Я удалил свой предыдущий комментарий. Я пропустил вышеупомянутые контакты _CS. Однако я не вижу, где можно выбрать разные ведомые устройства SPI. Так как SPI отключен (// disable SD SPI) но в вашем сниппете нет кода выбора чипа.   -  person fussel    schedule 06.10.2018
comment
Я полагаюсь на библиотеку для выбора рабов. Это просто код инициализации. Я не думал включать какой-либо фактический код отправки, поскольку программа не выполняется достаточно долго, чтобы добраться туда. Существует еще одно периферийное устройство SPI, которое поставляется вместе с защитным экраном, называемым SD-картой. Я не использую его, поэтому код отключает его.   -  person henradrie    schedule 07.10.2018
comment
Мне кажется, это все еще проблема с выбором чипа. Я думаю, что ваши библиотеки правильно выбирают шилды, но они не будут отклонены, если вы используете чип на другом шилде. Оба шилда не могут знать друг друга, поэтому вы пытались вручную снять выделение с чипа перед попыткой записи на другой чип?   -  person fussel    schedule 07.10.2018
comment
Да, у меня не получилось. Я попробую еще раз немного другим способом, чтобы увидеть, имеет ли это значение.   -  person henradrie    schedule 07.10.2018


Ответы (2)


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

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

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

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

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

person linuxfan says Reinstate Monica    schedule 07.10.2018

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

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

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

person henradrie    schedule 18.10.2018