极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 40025|回复: 11

arduino i2c的wire库使用求教

[复制链接]
发表于 2013-8-27 16:56:46 | 显示全部楼层 |阅读模式
本帖最后由 葱头同学 于 2013-8-29 19:21 编辑

     想外接一个DA转换来使用,买了一个12位I2C接口的DAC7571,按照芯片文档的时序图用arduino的wire库写了一个测试例程,但是发现芯片输出脚没有输出。

    芯片地址接地的时候扫出来两个:72和76 接高电平也是扫出来两个:72和77

    三个地址都用过,也是一样没输出
   
    是不是scl脚的脉冲频率有要求啊?如果要设置这个脉冲频率,在wire库中用什么函数来设置呢?

    程序代码:
  1. #include <Wire.h>
  2. #define Register_w 0x9A
  3. #define Register_r 0x9B
  4. int DAC7Address = 0x4D;
  5. byte Ctrl_MS = 15;
  6. byte LS = 255;
  7. void setup()
  8. {
  9.   Wire.begin();
  10.   delay(100);
  11.   Wire.beginTransmission(DAC7Address);
  12.   Wire.write(Register_w);
  13.   Wire.write(Ctrl_MS);
  14.   Wire.write(LS);
  15.   Wire.endTransmission();
  16. }

  17. void loop()
  18. {
  19. }
复制代码


    时序:





    芯片文档:

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2013-8-28 13:38:26 | 显示全部楼层
伯德 发表于 2013-8-28 09:35
看来自己解决了

学习就是个不断碰壁的过程
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2013-8-27 22:37:33 | 显示全部楼层
修改了一下代码 用串口看Wire.endTransmission()返回值为0 说明从机地址正确有回应了 数据也成功传输 可是没有电压输出
  1. #include <Wire.h>
  2. #define DAC7571 0x4D
  3. void setup()
  4. {
  5.   Wire.begin();
  6.   Serial.begin(9600);
  7. }

  8. void loop()
  9. {
  10.   Wire.beginTransmission(DAC7571);
  11.   Wire.write(0x9A);
  12.   Wire.write(0x0F);
  13.   Wire.write(0xFF);
  14.   Wire.endTransmission();
  15.   Serial.println(Wire.endTransmission());
  16. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-27 22:40:23 | 显示全部楼层
本帖最后由 葱头同学 于 2013-8-28 13:29 编辑

成功输出5V电压 代码改为:

时序图中的 slave address 需要移位
  1. #include <Wire.h>
  2. #define DAC7571 (0x9A >> 1)
  3. void setup()
  4. {
  5.   Wire.begin();
  6. }

  7. void loop()
  8. {

  9.   Wire.beginTransmission(DAC7571);
  10.   Wire.write(0x0F);
  11.   Wire.write(0xFF);
  12.   Wire.endTransmission();

  13. }
复制代码
参考了PCF8591的代码:
http://tronixstuff.com/2013/06/17/tutorial-arduino-and-pcf8591-adc-dac-ic/
回复 支持 反对

使用道具 举报

发表于 2013-8-28 09:35:20 | 显示全部楼层
看来自己解决了
回复 支持 反对

使用道具 举报

发表于 2013-8-29 11:56:18 | 显示全部楼层
本帖最后由 woody088 于 2013-8-29 15:35 编辑

看上圖DAC7571設備位址的規範:
1.紅色框框處為原廠預設的設備位址 6-BIT : 100110
2.然後再看藍色框框A0處為可以讓使用者自訂的末端設備位址位元:
   假如您DAC7571的A0腳位接HIGH(電源+)那 A0=1;
   反之假如您DAC7571的A0腳位接LOW(電源接地)那 A0=0
   也就是容許一組I2C線上同時接2顆DAC7571來使用(一顆A0:接HIGH電源+,另一顆A0:接LOW電源接地)
3.最後一個是讀/寫位元(紫色框框)不用多說,
   "0"代表要準備對DAC7571的暫存器進行寫入的動作
   "1"代表要準備對DAC7571的暫存器進行讀取的動作

大部分I2C裝置都直接用規格書所提供的裝置位址就OK了!
但為什麼在Arduino中用DAC7571卻要將位址右移一位才可以,真的很奇怪!

有人用邏輯分析儀試過 Wire.beginTransmission() 這個指令到底在SDA上會發送出幾個bit嗎?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2013-8-29 16:10:59 | 显示全部楼层
我知道為什麼了-

在使用Wire.h函式庫時,如看IC規格書時,裝置位址格式中的最後的一個 bit(讀/寫位元) 我們必須忽略它(因為在使用Wire.h庫函式時這個讀/寫位元的值它會自動幫你填上,雖然我們在寫sketch代碼時看不到)
所以-我們要將 讀/寫位元 忽略它拿掉(樓主用的方式是將整個位址右移,或是直接用人腦除以2後答案填上 都行)後 一定會變成7個bit的裝置位址,也符合I2C裝置位址規範(0~127)。

下面是範例,圖片最下面有英文解釋

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-29 19:19:27 | 显示全部楼层
woody088 发表于 2013-8-29 16:10
我知道為什麼了-

在使用Wire.h函式庫時,如看IC規格書時,裝置位址格式中的最後的一個 bit(讀/寫位元) 我 ...

是的 一开始还以为是程序问题  英文真的是一道坎啊
回复 支持 反对

使用道具 举报

发表于 2013-8-30 11:02:28 | 显示全部楼层
原來...庫的中文說明也有寫

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2015-4-14 20:52:58 | 显示全部楼层
好呀,认真学习了
回复 支持 反对

使用道具 举报

发表于 2015-7-28 23:14:53 | 显示全部楼层
#define DAC7571 (0x9A >> 1)和#define DAC7571 0x4D有什么区别吗?我很好奇!
回复 支持 反对

使用道具 举报

发表于 2016-4-27 15:00:45 | 显示全部楼层
有没有会使用PCF8575的IO扩展模块的,他也是I2C通讯
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 19:57 , Processed in 0.045979 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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