葱头同学 发表于 2013-8-27 16:56:46

arduino i2c的wire库使用求教

本帖最后由 葱头同学 于 2013-8-29 19:21 编辑

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

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

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

    程序代码:
#include <Wire.h>
#define Register_w 0x9A
#define Register_r 0x9B
int DAC7Address = 0x4D;
byte Ctrl_MS = 15;
byte LS = 255;
void setup()
{
Wire.begin();
delay(100);
Wire.beginTransmission(DAC7Address);
Wire.write(Register_w);
Wire.write(Ctrl_MS);
Wire.write(LS);
Wire.endTransmission();
}

void loop()
{
}

    时序:





    芯片文档:

葱头同学 发表于 2013-8-28 13:38:26

伯德 发表于 2013-8-28 09:35 static/image/common/back.gif
看来自己解决了

学习就是个不断碰壁的过程:D

葱头同学 发表于 2013-8-27 22:37:33

修改了一下代码 用串口看Wire.endTransmission()返回值为0 说明从机地址正确有回应了 数据也成功传输 可是没有电压输出#include <Wire.h>
#define DAC7571 0x4D
void setup()
{
Wire.begin();
Serial.begin(9600);
}

void loop()
{
Wire.beginTransmission(DAC7571);
Wire.write(0x9A);
Wire.write(0x0F);
Wire.write(0xFF);
Wire.endTransmission();
Serial.println(Wire.endTransmission());
}

葱头同学 发表于 2013-8-27 22:40:23

本帖最后由 葱头同学 于 2013-8-28 13:29 编辑

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

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

void loop()
{

Wire.beginTransmission(DAC7571);
Wire.write(0x0F);
Wire.write(0xFF);
Wire.endTransmission();

}参考了PCF8591的代码:
http://tronixstuff.com/2013/06/17/tutorial-arduino-and-pcf8591-adc-dac-ic/

伯德 发表于 2013-8-28 09:35:20

看来自己解决了

woody088 发表于 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嗎?

woody088 发表于 2013-8-29 16:10:59

我知道為什麼了-

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

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

葱头同学 发表于 2013-8-29 19:19:27

woody088 发表于 2013-8-29 16:10 static/image/common/back.gif
我知道為什麼了-

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

是的 一开始还以为是程序问题英文真的是一道坎啊

woody088 发表于 2013-8-30 11:02:28

原來...庫的中文說明也有寫
:P

mc.six 发表于 2015-4-14 20:52:58

好呀,认真学习了

进阶的熊猫 发表于 2015-7-28 23:14:53

#define DAC7571 (0x9A >> 1)和#define DAC7571 0x4D有什么区别吗?我很好奇!

15275285755 发表于 2016-4-27 15:00:45

有没有会使用PCF8575的IO扩展模块的,他也是I2C通讯
页: [1]
查看完整版本: arduino i2c的wire库使用求教