8通道模擬信號(hào)輸出,8Bit分辨率,數(shù)字轉(zhuǎn)模擬芯片DAC5578芯片的使用(I2C通訊協(xié)議)

個(gè)人的學(xué)習(xí)記錄,方便大家學(xué)習(xí)交流以及日后個(gè)人復(fù)習(xí),因?yàn)槲抑皇沁厡W(xué)邊做,如果存在錯(cuò)誤,請(qǐng)?jiān)谠u(píng)論區(qū)留下你的意見。
大部分資料來自于TI官網(wǎng)的DAC5578芯片數(shù)據(jù)手冊(cè),吃生肉很難受。
這個(gè)芯片輸出的最低電壓是0.2V,最高電壓也比VCC稍低
DAC5578芯片數(shù)據(jù)手冊(cè)下載地址:http://www.ti.com/cn/lit/ds/symlink/dac5578.pdf
DAC5578電源電壓范圍:2.7V?到5.5V
此次學(xué)習(xí)使用的電壓是3.3V。
驅(qū)動(dòng)芯片 : STM32F103C8? ?(感覺51單片機(jī)也行,但沒有實(shí)際使用過)
目標(biāo):使用 DAC5578?輸出模擬信號(hào)
代碼鏈接:https://pan.baidu.com/s/1_y0r4LiE4hXPTwtAZUIUjg? 提取碼 : fb1m
主要內(nèi)容在?User \ main.c?里
DAC5578引腳分布:

引腳說明:? ? ????????
AVDD?: 電源正極
GND : 電源負(fù)極
?VREFIN??: 基準(zhǔn)電壓,接電源正極
LDAC : 使緩存區(qū)數(shù)據(jù)更新到DAC輸出端,低電平觸發(fā)
ADDR0 : 芯片地址設(shè)置,
置0時(shí)(接GND),芯片地址為 1001 000,
置1時(shí)(接VCC),芯片地址為 1001 010,
浮空時(shí)(什么都不接),芯片地址為 1001 100 。
?CLR : 芯片重啟端,下降沿觸發(fā)
SCL :?I2C串行通訊時(shí)鐘端 (時(shí)鐘端)
SDA : I2C串行通訊數(shù)據(jù)端?(數(shù)據(jù)端)
VOUTA到VOUTH : 模擬信號(hào)輸出端
我是在面包板上用貼片轉(zhuǎn)直插的PCB進(jìn)行試驗(yàn),最好刮一刮導(dǎo)線的接觸面,保證接觸良好,電源電壓夠高,不然會(huì)導(dǎo)致數(shù)據(jù)寫入失敗。


數(shù)據(jù)傳輸使用的引腳需要上拉電阻,手冊(cè)上阻值范圍為1K到10K,個(gè)人使用的是5K電阻,然后接到單片機(jī)上,這里 SCL 我接到?PB0 ,SDA 接到 PB1。
單片機(jī)引腳需設(shè)為開漏輸出(寫 0?輸出低電平,寫 1 浮空),初始化時(shí)置為 1 。
浮空:對(duì)地電阻非常大,且電壓值幾乎為零
接下面的說明里,主機(jī)?代表單片機(jī),從機(jī)?代表DAC5578,時(shí)鐘端代表SCL,?數(shù)據(jù)端代表SDA?
單片機(jī)引腳定義:

最下面的兩個(gè)定義用來操縱引腳,例如??
DAC5578_SCL(LOW) 會(huì)使時(shí)鐘端變?yōu)?,DAC5578_SCL(HIGH) 會(huì)使時(shí)鐘端變?yōu)?
DAC5578_SDA(LOW) 會(huì)使數(shù)據(jù)端變?yōu)?,DAC5578_SDA(HIGH) 會(huì)使數(shù)據(jù)端變?yōu)?
初始化函數(shù):

通訊啟動(dòng):
主機(jī)發(fā)出啟動(dòng)信號(hào):?時(shí)鐘端為1時(shí),數(shù)據(jù)端出現(xiàn)下降沿(由1變0),等待。

?延時(shí)函數(shù)?和 通訊啟動(dòng)函數(shù):? ? ?

寫入數(shù)據(jù):
每次改變DAC5578的輸出都需要寫入4次數(shù)據(jù),每次寫入1字節(jié)(8Bit)
寫入?1Bit 數(shù)據(jù)的方法如下:
? ? ????拉低時(shí)鐘端 ,? 數(shù)據(jù)端送入數(shù)據(jù),等待,
????????拉高時(shí)鐘端 ,? 等待(數(shù)據(jù)起效);? ?
寫入1個(gè)字節(jié)(8Bit)需要將上面的流程執(zhí)行8次。

? ? ? ? 時(shí)鐘端?為0時(shí),數(shù)據(jù)端送入數(shù)據(jù),
????????時(shí)鐘端為 1?時(shí),數(shù)據(jù)起效。
? ? ? ? 數(shù)據(jù)先寫高位,再寫低位,每次寫入?1字節(jié),
????????例如 1011 0100 (0xb4) ,它的最高位是?1 ,接著是?0、1、 1、 0、 1、 0、 0。
? ? ? ?每次寫完?1個(gè)字節(jié)?,就需要接收一次來自從機(jī)的響應(yīng)(ACK),確認(rèn)寫入成功。?
? ? ? ?主機(jī)將時(shí)鐘端拉低,數(shù)據(jù)端拉高(釋放引腳),等待,??
???????時(shí)鐘端拉高,等待,
? ? ? ?檢查數(shù)據(jù)端的電平,若為?0?,寫入成功,不然,寫入失敗。


注意:數(shù)據(jù)端必須要有合適的上拉電阻,過大過小都不能用,且單片機(jī)的引腳必須是開漏模式(寫 0 輸出低電平,?寫 1?浮空),不然會(huì)干擾到從機(jī)的響應(yīng)信號(hào)!
數(shù)據(jù)寫入函數(shù):

因?yàn)樵O(shè)為開漏輸出,這時(shí)主機(jī)的 數(shù)據(jù)端 是浮空的,從機(jī)若發(fā)出響應(yīng),便會(huì)將自己的 數(shù)據(jù)端? 拉低,主機(jī)就會(huì)讀取到 0?,不然,受上拉電阻的影響,主機(jī)將會(huì)讀取到 1 。
使用 LED?展示寫入結(jié)果,LED的相關(guān)程序在我提供的文件里有,在這不作詳解。
當(dāng)主機(jī)收到從機(jī)的第四個(gè)響應(yīng)后,主機(jī)應(yīng)發(fā)出通訊結(jié)束的信號(hào)。
通訊結(jié)束:
????????????數(shù)據(jù)端和時(shí)鐘端都置為 0 ,拉高時(shí)鐘端,等待,拉高數(shù)據(jù)端。

通訊結(jié)束函數(shù):

寫入的數(shù)據(jù)里,每個(gè)字節(jié)的作用如下:
第1個(gè)字節(jié)的前7位時(shí)芯片的地址位,ADDR0引腳接VCC時(shí),該芯片的地址為?1001 010?。
最后一位寫 0 (Write)表示主機(jī)要寫入數(shù)據(jù),寫 1?(Read)表示主機(jī)要讀取數(shù)據(jù),
簡(jiǎn)稱(R/W)位。
所以這個(gè)字節(jié)的數(shù)據(jù)為? 1001 0100? (0x94)。
第二個(gè)字節(jié)的前四位是指令,寫 0010 (選擇DAC端口,并即刻輸出DAC信號(hào),需要LDAC一直為0),后四位選擇輸出端口(通道),數(shù)據(jù)與端口的對(duì)應(yīng)關(guān)系如下

寫 0000?選中VOUTA ,寫 0001?選中VOUTB,......,寫 1111?選中全部端口。
如果要改變 VOUTA 的輸出信號(hào),則這個(gè)字節(jié)的數(shù)據(jù)為 0010 0000? ?(0x20)。
如果要改變 VOUTC的輸出信號(hào),則這個(gè)字節(jié)的數(shù)據(jù)為 0010?0010? ?(0x22)。
芯片的其他指令請(qǐng)參考數(shù)據(jù)手冊(cè)第 31 頁。
第三和第四字節(jié)的數(shù)據(jù)大小可以調(diào)節(jié)輸出的電壓的大小,DAC5578的分辨率只有 8Bit,所以只有第三字節(jié)有效,第四字節(jié)寫什么都行。
第三字節(jié)可選擇的數(shù)值范圍是 0 到 255,理想狀況下,寫入0時(shí),輸出電壓為 0V,寫入255時(shí),輸出電壓與VREFIN的電壓相同。
實(shí)際上,該芯片寫入 0?時(shí),輸出的電壓值為 0.2V,最大值也比VREFIN的電壓略低,但對(duì)于我現(xiàn)在的應(yīng)用場(chǎng)景,這些都在允許的范圍內(nèi)。
第四字節(jié)是預(yù)留給 DAC6578 (10Bit分辨率)?和 DAC7578 (12Bit分辨率)?的,在DAC5578里,這個(gè)字節(jié)沒有用,但必須寫。
設(shè)置輸出電壓的函數(shù):

主函數(shù):

最后的運(yùn)行結(jié)果應(yīng)為,LED2穩(wěn)定閃爍,LED1微弱的發(fā)出亮光后滅掉,萬用表測(cè)量VoutA的電壓是1.65V左右。
一定要保證電源電壓足夠大,之前我有時(shí)同樣的程序,時(shí)不時(shí)寫入失敗就因?yàn)閷?dǎo)線接觸不好,供電電壓只有2.6V左右,真是坑爹呢。
請(qǐng)務(wù)必確認(rèn)電路連接的正確,一開始VREFIN我什么都沒接,浪費(fèi)了一個(gè)早上,差點(diǎn)就放棄了
程序里所有的延時(shí)函數(shù)都可以不要,依然能穩(wěn)定驅(qū)動(dòng)芯片,我一開始看數(shù)據(jù)手冊(cè)上寫什么,就做什么了。手冊(cè)上給出了這個(gè)芯片的其他功能,但我還不會(huì)用,也沒什么興趣就不看了。
STM32自身也帶有I2C通訊協(xié)議的外設(shè),但我第一次解讀這些全英文的數(shù)據(jù)手冊(cè),為了穩(wěn)一點(diǎn)還是自己模擬I2C通訊好了,這也是我第一次接觸I2C協(xié)議,大家自己嘗試一下,可能比這么寫還快哦。
第一次干這種事一開始感覺就是摸黑走路呢,非常感謝翻譯軟件的存在,過去的一周時(shí)間里也有過幾次放棄的念頭,用其他芯片代替好了,但那很浪費(fèi)單片機(jī)引腳和錢,也懷疑過芯片質(zhì)量,但最后算一切順利了呢。
覺得這個(gè)專欄對(duì)你有所幫助的請(qǐng)點(diǎn)個(gè)贊,投個(gè)幣,還有收藏,當(dāng)然,關(guān)注就是對(duì)我的最大支持啦。雖然我也不知道下一次更新是什么時(shí)候,會(huì)更新什么就是了。
感覺有些地方?jīng)]看懂的請(qǐng)留下你的評(píng)論。當(dāng)然,去Bing搜索更快些。
最后附上使用DAC5578輸出不斷變化的電壓的GIF。
