如何将 2 个 SPI 设备连接到 Arduino MkrZero



>我遇到了一个问题,无法将 2 个 SPI 设备连接到我的 MkrZero。一个设备是CAN屏蔽,另一个是以太网屏蔽。

两者都在没有连接另一个的情况下自行工作正常,但当两个同时连接时似乎不起作用。这让我认为我的接线和代码是正确的,但仍然缺少一些东西。

无论如何,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.begintransaction(( 在每次 SPI 通信之前都会被调用,据我所知,它会重置参数。这意味着我不需要在每次事务之前手动更改 SPI 总线参数。我在这方面错了吗?

SPI 总线非常简单,连接多个从站应该没有问题,只要在任何时候只有一个CS_断言(低(。可以预期库控制CS_引脚,但也应在作业完成后取消断言它。如果没有,那么图书馆将是一个非常糟糕的库。

您应该检查硬件和软件。

硬件:使用带内存的作用域,并查看初始化期间发生的情况。可能是CS_引脚需要一个上拉电阻(如果库控制其CS_引脚,可以选择将其置于高阻抗而不是将其驱动为高电平(。如果您没有示波器,也许可以通过软件监控引脚。

软件:可能是库使用中断?在这种情况下,程序可以做你不知道的事情,例如,一个库可以在后台轮询一个设备,并弄乱你的代码或另一个库中的代码。您必须深入研究库文档和代码。同样,范围会有很大帮助。

您没有指定太多有关设置的信息,并且您尝试"手动取消选择CS_引脚"(确实令人担忧。您应该检查两次该点 - 如果CS_引脚为高电平,则没有理由其他SPI器件不工作。

问题出在电平转换器上。我将OE使能引脚连接到CAN CS,这使芯片在不使用时处于高阻抗状态,并在我想发送数据时使能芯片。

我用示波器连接到SPI引脚并记录了正在发生的事情。一切都很顺利,直到我到达MISO。电平转换器弄乱了它并将其拉到地面。基本上是沉默其中一个盾牌的输出。

这里的学习是将电平转换器与SPI设备一起使用时,将CS连接到OE。

最新更新