-1

A1A2A3A4のデータを転送したいです。ATxmega128A1 の内部メモリから SPI マスタを介してスレーブ フォームへ、DAC1 が A1A3 を、DAC2 が A2A4 を持つように 2 つの別個の DAC コンバータに変換します。

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)ます。

また、2 番目のチップ セレクト ラインをアサートするのを忘れているようです。

したがって、一般的なアプローチは次のようになります。

  1. 偶数バイトの読み取り (A1)
  2. 最初の DAC のスレーブ選択をアサートします。
  3. データ バイトを SPIC.DATA に書き込む
  4. SPSR のビット SPIF == 0 の間ループします。
  5. SPIC.DATA から読み取り、SPIF ビットをクリアします。
  6. 最初の DAC のスレーブ選択をディアサートする
  7. 奇数バイトの読み取り (A2)
  8. 2 番目の DAC のスレーブ選択をアサートする
  9. 手順 3 ~ 5 を繰り返します
  10. 最初から繰り返す

また、SPI 経由のデータ書き込みを処理する関数を作成することをお勧めします。

于 2015-05-08T14:10:30.850 に答える