【转】三种方法让你在I2C通信中同时和多个从机通信

时间:2025-02-09 10:21:03
boolean x=true; //是否调试输出 //CD4053的接入方式 //INH口接地 aY->SCL1 bY->SCL2 cY->SCL3 ->SCL_Arduino #define CD4053_C 10 #define CD4053_B 9 #define CD4053_A 8 //----------1 //CBA 000 不接通 //CBA 100 C接通 //CBA 010 B接通 //CBA 001 A接通 //----------2 //PIN #define PIN_SDA 20 #define PIN_SCL 21 //I2C (sparkfun breakout) #define Register_ID 0 #define Register_2D 0x2D #define Register_X0 0x32 #define Register_X1 0x33 #define Register_Y0 0x34 #define Register_Y1 0x35 #define Register_Z0 0x36 #define Register_Z1 0x37 #include <> int ADXAddress = 0x53; // the default 7-bit slave address int reading = 0; int val=0; int X0,X1,X_out; int Y0,Y1,Y_out; int Z1,Z0,Z_out; double Xg,Yg,Zg; int flag=1; //标志变量 void Wire_Start(){ (ADXAddress); (Register_2D); (8); //measuring enable (); // stop transmitting } void Wire_Get()
{
//--------------X (ADXAddress); // transmit to device (Register_X0); (Register_X1); (); (ADXAddress,2); if(()<=2) { X0 = (); X1 = (); X1=X1<<8; X_out=X0+X1; } //------------------Y (ADXAddress); // transmit to device (Register_Y0); (Register_Y1); (); (ADXAddress,2); if(()<=2) { Y0 = (); Y1 = (); Y1=Y1<<8; Y_out=Y0+Y1; } //------------------Z (ADXAddress); // transmit to device (Register_Z0); (Register_Z1); (); (ADXAddress,2); if(()<=2) { Z0 = (); Z1 = (); Z1=Z1<<8; Z_out=Z0+Z1; } //---------------- Xg=X_out/256.0; Yg=Y_out/256.0; Zg=Z_out/256.0; } void setup() { (); if(x) (9600); delay(100); pinMode(CD4053_A,OUTPUT); pinMode(CD4053_B,OUTPUT); pinMode(CD4053_C,OUTPUT); // enable to measute g data digitalWrite(CD4053_A,HIGH); digitalWrite(CD4053_B,LOW); digitalWrite(CD4053_C,LOW); delay(10); Wire_Start(); //初始化模块1 digitalWrite(CD4053_A,LOW); digitalWrite(CD4053_B,HIGH); delay(10); Wire_Start(); //初始化模块2 digitalWrite(CD4053_B,LOW); digitalWrite(CD4053_C,HIGH); delay(10); Wire_Start(); //初始化模块3 } void loop() { if(x){ ("----"); ((flag+0)); ("----");} switch(flag){ case 1: { digitalWrite(CD4053_A,HIGH); digitalWrite(CD4053_C,LOW); Wire_Get(); //读取模块1 flag=2; break; } case 2:{ digitalWrite(CD4053_B,HIGH); digitalWrite(CD4053_A,LOW); Wire_Get(); //读取模块2 flag=3; break; } case 3:{ digitalWrite(CD4053_C,HIGH); digitalWrite(CD4053_B,LOW); Wire_Get(); //读取模块3 flag=1; break; } } if(x)
{ (
"X= "); (Xg); (" "); ("Y= "); (Yg); (" "); ("Z= "); (Zg); } delay(33); //改变参数可以改变读取频率 }