-1

我想传输数据 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++;
    }
}
4

1 回答 1

0

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

此外,看起来您忘记断言第二条芯片选择线。

因此,一般方法应如下所示:

  1. 读取偶数字节 (A1)
  2. 为第一个 DAC 断言从机选择。
  3. 将数据字节写入 SPIC.DATA
  4. 循环 while SPSR 的位 SPIF == 0
  5. 从 SPIC.DATA 读取以清除 SPIF 位。
  6. 取消断言第一个 DAC 的从选择
  7. 读取奇数字节 (A2)
  8. 断言第二个 DAC 的从机选择
  9. 重复步骤 3-5
  10. 从头开始重复

此外,最好创建处理通过 SPI 写入数据的函数。

于 2015-05-08T14:10:30.850 回答