程序使用2对应的I2C进行擦除

时间:2013-03-19 12:04:24

标签: arduino i2c

我有一个有趣的问题,对于Due而言可能是也可能不是。我没有资源在2个Arduino ATMegas上测试I2C。这是问题所在:

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

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

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

我认为I2C设置和上传草图是相互矛盾的。我怎样才能解决这个问题,所以我不需要一直给Dues上电。以下是使用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; 
}

0 个答案:

没有答案