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