【问题标题】:AVR (Atmega 324A ) DAC interfacing via SPIAVR (Atmega 324A) DAC 通过 SPI 接口
【发布时间】:2015-10-07 07:29:13
【问题描述】:

数据表:(Atmega 324A)http://www.atmel.com/images/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdf

数据表:(DAC)http://www.ti.com/lit/ds/symlink/dac101s101.pdf

你好!!

我正在学习 c 中的嵌入式编程,所以请多多包涵。
我正在尝试使用通过 SPI 连接到 ATmega324A 的 DAC (DAC101S101) 生成波。 Dac 是单向的。现在我只是想从 dac 获得输出。我制作了一个 lut,我将使用它来获得所需的正弦波。另外,如何调制波的频率? (比如让我们说 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);
}


}

谢谢!!!!

【问题讨论】:

    标签: embedded avr spi atmega dac


    【解决方案1】:

    说实话,这有点奇怪。 SPI 不是 ADC/DAC 的“普通”接口。它通常是 I2S 或其他具有单调帧时钟的东西,因此可以保证频率响应。

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

    查看数据手册,数据首先发送到 DAC MSb。它必须是 2 个无关位,两个“模式位”,然后是 10 位数据,然后是两个无关位。发送 16 位后,将 SYNC/ 设置为高电平(至少 20ns),然后您可以重复循环。如果在提高 SYNC/ 之前发送少于 16 位,则“命令”将被忽略。

    我不知道 AVR 在您写入 SPI 寄存器时会做什么。它可能会降低 SS//SYNC/ 8 位,然后再次升高。这不适用于这部分。你可能不得不把数据放到它上面。

    【讨论】:

    • 大多数微控制器都可以选择关闭 SPI 中的自动 /SS,在这种情况下,引脚会成为 GPIO。所以唯一需要的“位爆炸”应该是 /SS 引脚本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多