Can总线接口电路:ArduinoSPI接口读取随机值(尝试使用CAN总线屏蔽 )

关于Can总线接口电路的问题,在arduino can bus shield library中经常遇到, 我在设置 Arduino CAN 总线通信时有一个奇怪的问题。

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

说明如下,此视频显示结果:https://www..com/watch?v=NnMyC23Fe9s&feature=youtu.be

(备注:这种效果发生在我尝试过的每个板上)

硬件:

不同的 Arduino 或 Arduino-Equal 板(目前是 AZ-Delivery UNO,也尝试了 Arduino Mega 和 Arduino UNO。

来自 SeedStudio 的 CAN 总线屏蔽 (V1.2)(请参见https://github.com/Seeed-Studio/CAN_BUS_Shield

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

我从 2 个 Arduinos(不是 Mega,它不兼容)和 2 个 CAN 总线屏蔽的完整设置开始,并且想知道初始化失败并且比突然成功。

经过大量的测试,我想出了你在视频中看到的结果:我甚至不需要一个 CAN 总线盾来初始化一个 CAN 总线盾 O_o,如果我触摸 SPI 接口,它就会把我识别为一个 CAN 总线盾。

通过 CAN 总线库我检查了功能 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个问题:

这怎么可能,系统应该区分 propper 读取和一个简单的错误,不应该吗?

我该怎么做才能让这东西运转起来?

0

我怀疑盾牌演示程序无常工作,因为您没有将盾牌插入汽车的总线。

查看防护罩的示意图,在防护罩上 Seeedstudio 页面的 Documents 选项卡下(https://www.seeedstudio.com/CAN-BUS-Shield-V2.html),看起来防护罩是一个适配器,没有硬件可以对 arduino 说很多,我相信它需要插入汽车才能工作。

正如你所展示的,can 总线的软件检测并不是对插入汽车的屏蔽的可靠测试。

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

祝你的项目好运!

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(572)
Ck 40:匹配数大于 40(numbers 40)
上一篇
奔驰c级前盖怎么打开:打开键盘盖的方法-锁定灯 而无需实际打开盖-锁定
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(35条)