如何将数据A1A2A3A4 ..从ATxmega128A1的内部存储器通过SPI主机转换为从机形式转换为两个独立的DAC转换器?

时间:2015-05-08 13:10:31

标签: embedded avr atmel atmelstudio

我想传输数据A1A2A3A4。从ATxmega128A1的内部存储器通过SPI主机到从机形成两个独立的DAC转换器,使得DAC1应具有A1A3,DAC2应具有A2A4。

如何在AVR中编写代码

// Transfer data from internal memory via SPI from Master to single Slave
if ( (SWITCHPORTL.IN & PIN2_bm) == 0 )
{
    flip = false;
    j = 0;

    {
        // Switch on LED 2
        LEDPORT.OUTSET = PIN2_bm;
        // Switch on LED 3
        LEDPORT.OUTSET = PIN3_bm;
    }

    while (j < NUM_BYTES)
    {   
        if (flip == false)
        {
            // Set slave select line low (active) for Port C
            PORTC.OUTCLR = PIN4_bm;
        }               
        // Give the data to the data register of the Master
        SPIC.DATA = __far_mem_read(j+SDRAM_ADDR);
        if (flip == true)
        {
            _delay_us(0.7);         // wait for the 2nd 8-bit-block to be send -> delay 0.7us
            // Set slave select line high (inactive)
            PORTC.OUTSET = PIN4_bm;
            _delay_us(1.9);         // delay to adjust to sampling frequency 100 kHz -> 6.9us 200kHz -> 1.9us
        }
        flip = !flip;
        j++;
    }
}

1 个答案:

答案 0 :(得分:0)

您的一般方法是正确的,但为什么不使用SPSR寄存器的SPIF标志?这样就不需要这种精确的_delay_us(0.7)

另外,看起来你忘了断言第二个芯片选择线。

因此,一般方法应该如下:

  1. 读取偶数字节(A1)
  2. 断言第一个DAC的从机选择。
  3. 将数据字节写入SPIC.DATA
  4. SPSR的位SPIF = = 0
  5. 时循环
  6. 从SPIC.DATA读取以清除SPIF位。
  7. 取消第一个DAC的从属选择
  8. 读取奇数字节(A2)
  9. 断言第二个DAC的从机选择
  10. 重复步骤3-5
  11. 从头开始重复
  12. 此外,最好创建处理SPI数据写入的函数。