极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11529|回复: 4

ADXL345三轴加速度传感器在I2C通信时 地址的选择问题

[复制链接]
发表于 2015-1-20 10:44:50 | 显示全部楼层 |阅读模式
本帖最后由 UerRob 于 2015-1-22 11:00 编辑

用的mega2560 只有一个SDA和SCL 所以打算改变传感器的地址来挂载多个器件。
ADXL345 I2C通信的时候不是可以用SD0口的置高低电平在两个地址中选择吗..
不过我试了给它置高电平和低电平,不过一直都是在同一个地址0x53上可以正常通信。
将代码中地址换为0x1D无论高低电平都无法正常获取数据了。

我用地址扫描检测无论高低地址都是0x53
地址扫描代码:http://www.geek-workshop.com/thread-287-1-1.html
结果:



代码

  1. //I2C (sparkfun breakout)
  2. #define Register_ID 0
  3. #define Register_2D 0x2D
  4. #define Register_X0 0x32
  5. #define Register_X1 0x33
  6. #define Register_Y0 0x34
  7. #define Register_Y1 0x35
  8. #define Register_Z0 0x36
  9. #define Register_Z1 0x37
  10. #include <Wire.h>
  11. int ADXAddress = 0x53; // the default 7-bit slave address
  12. int reading = 0;
  13. int val=0;
  14. int X0,X1,X_out;
  15. int Y0,Y1,Y_out;
  16. int Z1,Z0,Z_out;
  17. double Xg,Yg,Zg;


  18. void setup()
  19. {
  20. Wire.begin();
  21. Serial.begin(9600);
  22. delay(100);
  23. // enable to measute g data
  24. Wire.beginTransmission(ADXAddress);
  25. Wire.write(Register_2D);
  26. Wire.write(8); //measuring enable
  27. Wire.endTransmission(); // stop transmitting
  28. }


  29. void loop()
  30. {
  31. //--------------X
  32. Wire.beginTransmission(ADXAddress); // transmit to device
  33. Wire.write(Register_X0);
  34. Wire.write(Register_X1);
  35. Wire.endTransmission();
  36. Wire.requestFrom(ADXAddress,2);
  37. if(Wire.available()<=2)
  38. {
  39. X0 = Wire.read();
  40. X1 = Wire.read();
  41. X1=X1<<8;
  42. X_out=X0+X1;
  43. }
  44. //------------------Y
  45. Wire.beginTransmission(ADXAddress); // transmit to device
  46. Wire.write(Register_Y0);
  47. Wire.write(Register_Y1);
  48. Wire.endTransmission();
  49. Wire.requestFrom(ADXAddress,2);
  50. if(Wire.available()<=2)
  51. {
  52. Y0 = Wire.read();
  53. Y1 = Wire.read();
  54. Y1=Y1<<8;
  55. Y_out=Y0+Y1;
  56. }
  57. //------------------Z
  58. Wire.beginTransmission(ADXAddress); // transmit to device
  59. Wire.write(Register_Z0);
  60. Wire.write(Register_Z1);
  61. Wire.endTransmission();
  62. Wire.requestFrom(ADXAddress,2);
  63. if(Wire.available()<=2)
  64. {
  65. Z0 = Wire.read();
  66. Z1 = Wire.read();
  67. Z1=Z1<<8;
  68. Z_out=Z0+Z1;
  69. }
  70. //----------------
  71. Xg=X_out/256.0;
  72. Yg=Y_out/256.0;
  73. Zg=Z_out/256.0;


  74. Serial.print("X= ");
  75. Serial.print(Xg);
  76. Serial.print(" ");
  77. Serial.print("Y= ");
  78. Serial.print(Yg);
  79. Serial.print(" ");
  80. Serial.print("Z= ");
  81. Serial.print(Zg);
  82. Serial.println(" ");
  83. //==================




  84. delay(200);
  85. }
复制代码



谁遇到过...感激不尽

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-1-21 19:30:11 | 显示全部楼层
UerRob 发表于 2015-1-21 13:22
CS不是在I2C通信时必须置高么

这样不就达到你要选择芯片的目的了吗?
回复 支持 反对

使用道具 举报

发表于 2015-1-20 17:06:27 | 显示全部楼层
何不控制cs呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-21 13:22:02 | 显示全部楼层
林定祥 发表于 2015-1-20 17:06
何不控制cs呢?

CS不是在I2C通信时必须置高么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-22 11:00:04 | 显示全部楼层
林定祥 发表于 2015-1-21 19:30
这样不就达到你要选择芯片的目的了吗?

厉害!这确实是个不错的方法哈!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-22 16:09 , Processed in 0.045515 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表