2015-10-07 157 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