Embedded AVR(Atmega 324A)DAC通过SPI接口

Embedded AVR(Atmega 324A)DAC通过SPI接口,embedded,avr,spi,atmega,dac,Embedded,Avr,Spi,Atmega,Dac,数据表:Atmega 324A 数据表:DAC 你好 我正在学习c语言的嵌入式编程,请耐心听我说。 我试图使用DAC DAC101S101生成一个波形,该DAC DAC101S101通过SPI连接到ATmega324A。Dac是单向的。现在我只是想从dac得到一个输出。我已经做了一个lut,我将使用它来获得所需的正弦波。还有,我如何调节波的频率?比如说,我把一个外部振荡器连接到了ATmega芯片上 i Have connected: PB5 -- MOSI -------> DIN

数据表:Atmega 324A

数据表:DAC

你好

我正在学习c语言的嵌入式编程,请耐心听我说。 我试图使用DAC DAC101S101生成一个波形,该DAC DAC101S101通过SPI连接到ATmega324A。Dac是单向的。现在我只是想从dac得到一个输出。我已经做了一个lut,我将使用它来获得所需的正弦波。还有,我如何调节波的频率?比如说,我把一个外部振荡器连接到了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);
}


}

谢谢

老实说,这有点奇怪。SPI不是ADC/DAC的“正常”接口。它通常是I2S,或者其他带有单调帧时钟的东西,所以频率响应是有保证的

无论如何,DAC更新速率由SYNC/控制。同步/变低后,DAC将更新16个周期

查看数据表,首先将数据发送到DAC MSb。它必须是2个不关心位,两个“模式位”,然后是10位数据,然后是两个不关心位。发送16位后,将SYNC/high设置为至少20ns,然后可以重复该循环。如果在引发SYNC/之前发送的数据少于16位,则“命令”将被忽略


我不知道当你写入SPI寄存器时AVR会做什么。它可能会将SS//SYNC/降低8位,然后再次升高。这不适用于此部件。您可能需要将bang数据转换到它。

大多数微控制器都可以选择关闭SPI中的自动/SS,在这种情况下,该引脚就变成了GPIO。因此,唯一需要的位应该是/SS引脚本身。