2015-10-07 57 views
0

中文手冊:(的Atmega 324A)http://www.atmel.com/images/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdfAVR(324A的Atmega)DAC經由SPI接口

中文手冊:(DAC)http://www.ti.com/lit/ds/symlink/dac101s101.pdf

您好!!

我在c學習嵌入式編程,所以請耐心等待。
我正嘗試使用通過SPI連接到ATmega324A的DAC(DAC101S101)生成一個波形。 Dac是單向的。現在我只是試圖從dac獲得輸出。我已經做了一個我將用來獲得所需的正弦波。另外,如何調製波的頻率? (比如讓說,4000Hz的)(另外我連接了外部振盪器到的ATmega芯片。)

i Have connected: 
PB5 -- MOSI -------> DIN (DAC) 
PB7 -- SCK -------> SCK (DAC) 
PA1 --------------->#Sync(DAC) 

void init_SPI_Master(void) { 
/* 
* Set MOSI and SCK output, all others input 
* DDR_SPI = (1<<DD_MOSI)| (1<<DD_SCK);  
* 
* (for ATmega 324A 
* 
* DDRB = (1<<DDB5) | (1<<DDB7) 
* 
*/ 

DDRB = (1<<5) | (1<<7); 

/* 
*Enable SPI, Master, set clock rate fck/16; 
* 
*/ 

SPCR0 = (1<<SPE0) | (1<< MSTR0) | (1<<SPR00) | (1<<CPOL0); 

} 

void Tx_SPI_Master (unsigned char data) { 
/* 
* Start transmition 
* 
*/ 

SPDR0 = data; 

/* 
* is Tx complete ? 
* 
*/ 


} 


int main(void) 
{ 
unsigned char data1 = 0x04; 
unsigned char data2 = 0xFC; 
DDRA = 1 << 1; 
PORTA = 1 << 1; 
init_SPI_Master(); 
while(1) 
{ 
    //TODO:: Please write your application code 
    //sync: i'm not sure as how to provide sync to the dac 
    // according to the datasheet as soon as the sync bit goes low the 
    // register starts accepting data into Din. 
    // so right now i am trying to input 0000001111111100 into 
    // the dac. 
    PORTA = 1 << PINA1; 
    PORTA = 0 << PINA1; 


    Tx_SPI_Master(data1); 
    Tx_SPI_Master(data2); 
} 


} 

謝謝!!!!

回答

0

說實話,這是一個奇怪的DAC。 SPI不是ADC/DAC的「正常」接口。它通常是I2S,或其他具有單調幀時鐘的其他設備,因此可以保證頻率響應。

無論如何,DAC更新速率由SYNC/控制。在SYNC/變低之後,DAC將更新16個週期。

看數據表,數據首先發送到DAC MSb。它必須是2無關位,兩個'模式位',然後是10位數據,其次是兩個不關心位。一旦你發送了16位,設置爲SYNC/高(至少20ns),那麼你可以重複這個循環。如果您在提升SYNC/之前發送少於16位,則'命令'將被忽略。

我不知道當你寫入SPI寄存器時AVR會做什麼。它可能會降低SS//SYNC/ 8位,然後再提高它。這不適用於這部分。你可能不得不把數據放到它的位置。

+0

大多數微控制器都可以選擇關閉SPI中的自動/ SS功能,在這種情況下,該引腳將成爲GPIO。所以唯一需要的「位元音」應該是/ SS引腳本身。 – Lundin