STM32 AD5304驅動程式

2021-07-16 23:10:27 字數 2117 閱讀 3298

乙個專案需要用到四路dac,stm32內建2路dac,當然,也可以使用pwmdac的方法得到。考慮使用環境比較惡劣,盡量都使用的整合晶元,以及快速開發。這裡我選用了adi的ad5304,因為對精度要求不高,所以八位dac也足夠使用要求。如果需要更高精度的,它和ad5314(十位)以及ad5324(十二位)可以pin to pin替換。

接下來就是苦逼的煎熬模式了,其他的功能都還算順利的除錯完成。只有ad5304有問題,資料一直出不來。有時出來了卻不是我設定的值。我反覆對照datasheet中的時序圖,就是下面這貨。

很明顯,每次傳輸的資料是16byte,在傳送資料之前,cs(sync)先要給個下降沿訊號(先拉高再拉低),注意,是保持拉低狀態,然後din資料在每個sclk的時鐘訊號的下降沿時將資料傳送給ad5304,在16位資料傳送結束後,將片選cs(sync)置高(置低亦可).到這裡都很正常,畢竟adi是個大公司,而且這樣符合spi的時序。很簡單嘛,感覺分分鐘就可以寫好。

ok,具體每個位的資料是什麼意思呢?這個在datasheet中也有介紹。如下:

可以看到,ad53x4系列的控制方式也很類似,只是有效的資料位不同。這個圖可以看的很明白,最高位(bit15)是要設定的通道的高位,bit14是通道的地位,接下來是兩個位的說明是這樣的。。。

pd是是否使能的管腳,ldac是只讓所設定的通道置數還是要四個通道同時置數。剩下的就是設定的資料位。也很簡單明瞭,還是感覺可以分分鐘解決掉。

接下來就是配置stm32的對應管腳,由於stm32自帶的兩個spi有別的器件的操作,所以我使用的是模擬spi,而且也挺簡單,完全可以很快實現功能。

下面, 好戲開始了。

驅動程式寫好了,燒進去,量輸出電壓(我設定的是最大值,也沒用2.5v的基準.直接就是3.3v的電壓簡單處理下,畢竟精度要求並不高),值不對!!!什麼鬼,寫錯了?

我反覆看了幾遍,又對著資料看了很多遍,就是不對,哪的問題??不曉得嘛。怎麼辦~~~~~~~

就這樣,弄了兩個晚上。找不到原因,難道是因為我沒錢貪便宜買的拆機貨的緣故?真的是便宜沒好貨嗎?

各種測試,各種猜測實驗。

完全感覺要絕望鳥。

到這時候我都沒懷疑過回事資料不對,畢竟 adi啊,這麼大一公司,而且是老外搞的,我覺得肯定都是一絲不苟的工作,肯定不會忽悠人,亂標引數。我也從網上那亂七八糟的各種賣晶元的鏈結中找到乙個官方的使用的乙個配置,雖然用的微控制器不一樣,但是驅動看了是類似的,沒寫錯。

在我深深懷疑是晶元問題的時候,偶然的,死馬當活馬醫,我試著改了下pd和ldac的值。奇蹟出現了,輸出資料對了!!

我改的是讓pd=1,ldac=0,這樣輸出的每個通道都正常。這裡,有人也許要問,那ldac=1時肯定也有輸出,只是輸出四個通道都應該是一樣的吧,事實是並沒有,輸出的資料都是錯誤的,具體什麼問題我也就不管了,目的是盡快將專案結掉,人家做的**可以用就可以了。不求甚解嘛。。。

廢話辣麼多,下面貼**,有需要的可以看看,別在吭哧吭哧的像我似的瞎搞。附件是同樣的檔案。

#define ad5304_sclk   pbout(6)

#define ad5304_cs     pbout(7)

#define ad5304_mosi   pbout(5)

void ad5304_init(void)

void ad5304_valueset(u8 adc_address, u8 _dac_data)      

else

ad5304_sclk = 1;//spi_clk=1;

delay_us(10);

ad5304_sclk = 0;//spi_clk=0;

delay_us(10);

}ad5304_cs = 1;    //cs=1

delay_us(100);

}void dac_outoff(void) //輸出dac為0,即關閉

void dac_valueset(u8 *pbuff) //設定dac的輸出值

TSL2561 STM32驅動程式

define iic scl pin gpio pin 9 define iic sda pin gpio pin 8 define gpio iic gpiob define rcc apb2periph gpioiic rcc apb2periph gpiob define iic sda ou...

STM32 UART串列埠驅動程式

示例1.通過uart1進行資料傳送 uart 1 的初始化 brief uart1 initialise.param none.retval none.void uart1 init void 將資料0xba通過uart1傳送出 usart senddata usart1,0xba send dat...

stm32 esp8266驅動程式

esp8266模組是串列埠通訊,通訊的協議是at指令,要正確的配置對應的at指令模組才可以工作,這裡就需要知道at指令有沒有配置成功,這個比較容易實現,一般傳送at指令配置成功的話,晶元都會返回至少乙個ok,當然還有其它資料,我們只需要去解析有沒有接收到ok就知道指令傳送是否成功了。我這裡是作為tc...