我无法将2个SPI设备连接到我的MkrZero时遇到问题。一台设备是CAN shield,另一台设备是Ethernet Shield。
在没有另一个连接的情况下,两者都可以正常工作,但是当两个都同时连接时,它们似乎无法正常工作。这使我认为我的接线和代码正确,但是仍然缺少某些东西。
无论如何,CAN部分都会初始化,执行似乎停止在以太网代码上。但是,当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通信之前都会调用SPI.begintransaction(),据我所知,该通信会重置参数。这意味着我不需要在每次事务之前手动更改SPI总线参数。我在这方面错了吗?
答案 0 :(得分:0)
SPI总线非常简单,只要在任何时候只要其中一个具有CS_置为有效(低电平),连接多个从机就不会有问题。可以预料,一个库将控制CS_引脚,但在完成工作后也应将其置为无效。如果没有,那么该库将是一个非常糟糕的库。
您应该检查硬件和软件。
硬件:使用具有内存的作用域,并查看初始化期间发生的情况。可能是CS_引脚需要一个上拉电阻(如果库控制着CS_引脚,则可以选择将其置于高阻状态而不是将其驱动为高电平)。如果您没有示波器,则可以通过软件监视引脚。
软件:库可能使用中断吗?在这种情况下,程序可以执行您不知道的事情,例如,一个库可以在后台轮询设备,并弄乱您的代码或另一个库中的代码。您必须深入阅读库文档和代码。同样,范围会大有帮助。
您没有对设置进行太多指定,而您尝试“手动取消选择CS_引脚”确实令人担忧。您应该检查一下这一点-如果CS_引脚为高电平,则没有理由使用其他SPI器件不起作用。
答案 1 :(得分:0)
问题出在电平转换器上。我将OE使能引脚连接到CAN CS,这使芯片在不使用时处于高阻抗状态,而在我要发送数据时使它处于高阻抗状态。
我用示波器连接到SPI引脚并记录了发生的情况。一切顺利,直到我去了MISO。电平转换器正将其弄乱,并将其拉到地面。基本上使其中一个屏蔽的输出静音。
这里的学习是将电平转换器与SPI设备一起使用时将CS连接到OE。