У меня возникла проблема, когда я не могу подключить 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 перед каждой транзакцией. Я ошибаюсь в этом отношении?
// disable SD SPI
) но в вашем сниппете нет кода выбора чипа. - person fussel   schedule 06.10.2018