1.前言

前面画的AD/DA的板子到了,早上刚刚焊接完成,于是就开始写程序了。原本想看一下网上的教程,但是真的找不到好教程,没办法只能自己翻手册去慢慢啃了。这不调试完毕了吗,于是就写一篇文章吧,也相当于给我自己一个参考手册。

2.IIC地址

手册上给出了如下的图片

622b391301354552a66055d341e536a1.png

看起来A0~A2都能变,但是手册上还有一句话

163afb1112f64bfa8dd7d24ea6d8567e.png

在默认状态下A1与A2的值都是00,好吧那就剩A0了

a0a44f405d904e2d8a59a8af9cddcdbf.png

也就是第六脚

当接高的时候就是110 0001也就是0x61

当接地的时候就是110 0000也就是0x60

本文章中使用地址是0x60

3.写入

原厂提供了三种写入模式

2c98520296024e9a947a743d24979f43.png

这里说一下第二种和第三种模式的区别

我们都知道EEPROM的写入是需要花费时间的,如果我们需要流畅写入时,eeprom的写入时间肯定会阻碍dac的输出;但eeprom的好处是断电保持,因此我们默认上电的dac输出就是eeprom的电压,这里大家可以根据实际需要选择合适的模式。

2.1写入寄存器

手册里给出的过程如下

653291faf3e9427585b6153ceba48898.png

这里我来一个个分析

这里是芯片地址,也就是0x60,不多说了

1b5bcceee4224b77a282e5ceb614789e.png

 关键是第二位的,一共包含两个设置信息,前端的C0~C2也就是我们刚刚说到的模式

97ddd78660ba4cc3adbd3621391e82f8.png

这里我们是只写入寄存器,那么就应该是010

1f0d8d50387a469496212e1bd00561bc.png

在设置完模式后我们还可以设置下拉电阻,芯片内部在输出前可以挂载三种电阻,以提高DAC的带载能力,这里我们测试就使用正常模式了,也就是00

ccacf2813231476f9f6825f8558c24c8.png

在图中的这些打叉的位就是不重要位,可以写0也可以写1,不过我推荐写0,否则比较麻烦

311ccd3074bd4fd5bba13d24cdee51f5.png

那么我们最后第二位就是0100 0000也就是0x40

而后面两位就是数据了,由高到低的12位

2db672ee3c7c4ac8806b6d14a47b17dd.png

但是由于IIC一次是8位数据,我们的数据被分为了两端,所以我们处理程序的时候要注意一下

125a7b14defb4ca69fec43463ab879cf.png

发送第一段的时候,可以直接右移,将低四位给忽略掉

而发送低四位的时候,可以先将高八位忽略,但是由于发送的数据是右对齐,而我们芯片内部数据是左对齐,所以我们要将处理过的数据再左移四位

我们来测试一下,这里我输出电压是1.2V

那么我的数据应该是1.2/3.3*4096=1489也就是0x5D1

波形如下

8ac59ecd2e1d4092915c415ea5449ab9.png

测试效果如下,可以看到还是准的

81c9cb86d6e249879a5bb5eb7063d9a7.jpeg

2.2写入寄存器与EEPROM

波形与上一个是类似的

67b832bd52bc406da835beecd4d896b7.png

唯一变的是C0~C2,我们要换成011

e401667061fa444da0908bf3c03241df.png

那第二位的数据也就是0110 0000也就是0x60

这次我输出1V电压那么数据应该是1/3.3*4096=1241也就是4D9

波形如下

110fa4abf2d44c8a83bbe7d574a0827c.png

实测如下

a4c4e256360a4ea8bf6eed8964b14b0f.jpeg

2.3快速读写

相较于写寄存器,快速读写会少一位数据

0cf7f47532a14ac78511406e3f41e475.png

其中第二位的第1,2个数据都是0以此表示快速模式,然后选择下拉电阻这里是00

5b6c18b7871e42b5b3ae05bc6e9f42f5.png

第二位的高四位和第三位全部都是数据,总共12位

031b7691dfdb4008a61ff6c11103cbd9.png

因此我们处理数据要重新变

82ea44a2d2374f83b283993cd685be94.png

我们第二位的数据因为都是高位,所以我们可以直接右移8位,直接把低位的数据覆盖掉,同时高位的数据会补0,刚好就是四个0,我们就不用清了,如果各位觉得不保险还可以手动清。

低八位的数据我们直接对高四位的数据清除就行了

我们来测试一下,这次测试0.8V

 波形如下

18545ac1a6744440b3dc94c74b6d970d.png

实测

04cf2e5ae36d481fad29c822cc467c9c.jpeg

没毛病

4.读取

这里说一下为什么要读取

还记得芯片里有eeprom不?啊哈!没错,这个eeprom写入也是要时间的,手册上给出的时间默认是25ms最长50ms

c8aa86e0d9b042a6aec33831575c789d.png

因此我们可以读一下数据来看看是否写入完毕了。

其过程如下

68d1b2c96c1445baa9f86e54abf4819c.png

第一位是地址,不多说了。我们从第二位开始看

首先就是判忙位,为1写入完毕,为0表示正在写入

9e8ab9a5fa0444229786fb920bc236de.png

之后是POR,这是什么?

这是复位的状态,当芯片内部发生错误时,芯片会自动复位。通过读取这一位相当于判断芯片是否正常工作

e1a39115defe4bd9968295e784811e84.png

然后是PD0,PD1,可以查看当前设置的下拉电阻

2e727c2843174c1d978b6bab91941fca.png

之后的3,4位是寄存器内部值

337d2e6a64d94ce1a6424562e4498859.png

5,6位是eeprom内部值

d0b2e47314f242ca9ab4805de2638f94.png

因此我们整段程序除开地址位一共是5位数据要读取

我们来测试一下

fb7fae5b707a474b9bf0f0e28fedbddd.png

OK,没问题

5.总结

总的来说这个DAC的读写还是比较简单的,不知道为啥网上的教程总是不放波形图,也不分析,每次干看教程总是看得人头疼,哎。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐