Arduino SPI接口读取随机值? (尝试使用CAN总线屏蔽)

问题描述 投票:0回答:1

我在设置Arduino CAN总线通信时遇到了一个奇怪的问题。

如下所述,该视频显示了结果:https://www.youtube.com/watch?v=NnMyC23Fe9s&feature=youtu.be

((注:此效果在我尝试过的每块板上都会发生)

硬件:

使用的软件:https://github.com/Seeed-Studio/CAN_BUS_Shield/blob/master/examples/send/send.ino

我从完整的设置开始,安装了2个Arduino(不是兼容的Mega,不兼容Mega)和2个CAN总线屏蔽,我想知道初始化失败了,而突然间成功了。我猜想这是关于焊接引脚的,所以我对其进行了重新设计,但并没有得到改善。

[经过大量测试,我得出了您在视频中看到的结果:我什至不需要CAN Bus Shield来初始化CAN Bus Shield O_o。如果我触摸SPI接口,它将识别我为CAN总线屏蔽。

浏览CAN BUS库时,我检查了CAN.begin函数。它使用ISP引脚(2行中的6个引脚)进行以下操作:

  • 通过SPI将值写入地址
  • 通过SPI从另一个地址读取两个值

通过SPI读取的代码(全部从库中没有自己的代码!)

uint8_t MCP2515Class::readRegister(uint8_t address)
{
  uint8_t value;

  SPI.beginTransaction(_spiSettings);
  digitalWrite(_csPin, LOW);
  SPI.transfer(0x03);
  SPI.transfer(address);
  value = SPI.transfer(0x00);
  digitalWrite(_csPin, HIGH);
  SPI.endTransaction();

  return value;
}

和CAN.begin函数

int MCP2515Class::begin(long baudRate)
{
  CANControllerClass::begin(baudRate);

  pinMode(_csPin, OUTPUT);

  // start SPI
  SPI.begin();

  reset();

  writeRegister(REG_CANCTRL, 0x80);
  if (readRegister(REG_CANCTRL) != 0x80) {
    return 0;
  }

  const struct {
    long clockFrequency;
    long baudRate;
    uint8_t cnf[3];
  } CNF_MAPPER[] = {
    {  (long)8E6, (long)1000E3, { 0x00, 0x80, 0x00 } },
    {  (long)8E6,  (long)500E3, { 0x00, 0x90, 0x02 } },
    {  (long)8E6,  (long)250E3, { 0x00, 0xb1, 0x05 } },
    {  (long)8E6,  (long)200E3, { 0x00, 0xb4, 0x06 } },
    {  (long)8E6,  (long)125E3, { 0x01, 0xb1, 0x05 } },
    {  (long)8E6,  (long)100E3, { 0x01, 0xb4, 0x06 } },
    {  (long)8E6,   (long)80E3, { 0x01, 0xbf, 0x07 } },
    {  (long)8E6,   (long)50E3, { 0x03, 0xb4, 0x06 } },
    {  (long)8E6,   (long)40E3, { 0x03, 0xbf, 0x07 } },
    {  (long)8E6,   (long)20E3, { 0x07, 0xbf, 0x07 } },
    {  (long)8E6,   (long)10E3, { 0x0f, 0xbf, 0x07 } },
    {  (long)8E6,    (long)5E3, { 0x1f, 0xbf, 0x07 } },

    { (long)16E6, (long)1000E3, { 0x00, 0xd0, 0x82 } },
    { (long)16E6,  (long)500E3, { 0x00, 0xf0, 0x86 } },
    { (long)16E6,  (long)250E3, { 0x41, 0xf1, 0x85 } },
    { (long)16E6,  (long)200E3, { 0x01, 0xfa, 0x87 } },
    { (long)16E6,  (long)125E3, { 0x03, 0xf0, 0x86 } },
    { (long)16E6,  (long)100E3, { 0x03, 0xfa, 0x87 } },
    { (long)16E6,   (long)80E3, { 0x03, 0xff, 0x87 } },
    { (long)16E6,   (long)50E3, { 0x07, 0xfa, 0x87 } },
    { (long)16E6,   (long)40E3, { 0x07, 0xff, 0x87 } },
    { (long)16E6,   (long)20E3, { 0x0f, 0xff, 0x87 } },
    { (long)16E6,   (long)10E3, { 0x1f, 0xff, 0x87 } },
    { (long)16E6,    (long)5E3, { 0x3f, 0xff, 0x87 } },
  };

  const uint8_t* cnf = NULL;

  for (unsigned int i = 0; i < (sizeof(CNF_MAPPER) / sizeof(CNF_MAPPER[0])); i++) {
    if (CNF_MAPPER[i].clockFrequency == _clockFrequency && CNF_MAPPER[i].baudRate == baudRate) {
      cnf = CNF_MAPPER[i].cnf;
      break;
    }
  }

  if (cnf == NULL) {
    return 0;
  }

  writeRegister(REG_CNF1, cnf[0]);
  writeRegister(REG_CNF2, cnf[1]);
  writeRegister(REG_CNF3, cnf[2]);

  writeRegister(REG_CANINTE, FLAG_RXnIE(1) | FLAG_RXnIE(0));
  writeRegister(REG_BFPCTRL, 0x00);
  writeRegister(REG_TXRTSCTRL, 0x00);
  writeRegister(REG_RXBnCTRL(0), FLAG_RXM1 | FLAG_RXM0);
  writeRegister(REG_RXBnCTRL(1), FLAG_RXM1 | FLAG_RXM0);

  writeRegister(REG_CANCTRL, 0x00);
  if (readRegister(REG_CANCTRL) != 0x00) {
    return 0;
  }

  return 1;
}

2个问题:

  1. 这怎么可能,系统应该在正确阅读和简单错误之间进行区分,不是吗?
  2. 我该怎么办才能使此东西运行?
arduino spi can-bus
1个回答
0
投票

我怀疑盾牌演示程序无法正常工作,因为您尚未将盾牌插入汽车的公共汽车中。

查看屏蔽板的示意图,在屏蔽板(https://www.seeedstudio.com/CAN-BUS-Shield-V2.html)上Seeedstudio页面的“文档”选项卡下,看起来该屏蔽板是一个适配器,没有硬件对arduino讲太多。我认为需要将其插入汽车才能工作。

正如您所演示的,对于将屏蔽层插入汽车的罐总线的软件检测不是可靠的测试。

在盾牌的“学习”选项卡下,有一个到演示的链接。尽管演示视频不是英语,但您可以在https://youtu.be/Y-1AFyOP-tk?t=565处看到该板已插入汽车中。

祝您的项目万事如意!

© www.soinside.com 2019 - 2024. All rights reserved.