2

我有一个有趣的问题,它可能或不可能仅适用于 Due。我没有资源在 2 个 Arduino ATMegas 上测试 I2C。这是问题:

我有两个Due:主人有一个以太网盾,以后会用到;现在用于轻松区分主从。I2C 工作正常,但设置如下: 1 块 12V 电池连接到与主机相连的 Due 的 DC“圆形”输入:3.3V 和 GND 在两块板之间连接在一起:1 条用于上传草图的 USB 电缆。

当我从主设备上拔下 USB 以在从设备上上传草图时,两个板在 USB 拔出阶段都保持开启 - 由于 12 DC。草图已上传,USB 停留在从机端进行串行监控。

THE ISSUE:当12V电池未校正到主控时;在 USB 拔出阶段,两个板都关闭。将相同的草图上传到从机后,串行监视器显示从机没有收到任何信息。

我假设 I2C 设置和上传草图是有冲突的。我该如何解决这个问题,所以我不需要一直给会费供电。这是使用 12V 电池电源的代码。

/**************************************************************************************************
  MASTER
****************************************************************************************************/
#include <Wire.h>

byte ISend[4];

void setup()
{
   Wire1.begin(); // join i2c bus (address optional for master)
   intToByteA((unsigned long)72992);
}

void loop()
{ 
   Wire1.beginTransmission(4); // transmit to device #4
   for(int i = 0; i < 4; i++)
   {
      Wire1.write(ISend[i]);
   } 
   Wire1.endTransmission();
   delay(500); 
}

void intToByteA(unsigned long num)
{
   for (int i = 0; i < 4; i++)
   {
      ISend[i] = (byte)((num >> (8 * i)) & 0xFF);
   }
}

/*********************************************************************************************/


/************************************************************************************************
 SLAVE
*************************************************************************************************/
#include <Wire.h>

byte IReceive[4];

void setup()
{
  Wire1.begin(4);                // join i2c bus with address #4
  Wire1.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  delay(223);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  unsigned long test = 11;
  for(int i = 0; i < 4; i++)
  {
     IReceive[i] = Wire1.read();
  } 
  test = byteAToInt();
  Serial.println(test);
}

unsigned long byteAToInt()
{
  unsigned long temp = 0;
  for (int i = 0; i < 4; i++)
  {
     temp += (((unsigned long)IReceive[i]) << (8 * i));
  }
  return temp; 
}
4

0 回答 0