3

USBASPプログラマーを介して、PCからATmega328Pチップにデータを送信しようとしています。

SPI 経由で最大 4 バイトを送信できます。この 4 バイトは、USB Setup Packet で設定できます ( の場合は 2 バイト、 の場合はwValue2 バイトwIndex)。ATmega328P で SPI を有効にするために、USBASPResetピンを に接続しましたSS。PC 側ではlibusb、USB セットアップ パケットの送信に使用しています。

ATmega328P コード:

int main()
{
    char spiData = 0;

    // Enable SPI
    SPCR |= 1 << SPE;
    DDRB |= 1 << 4;

    // Main cycle
    while(1)
    {
        while(!(SPSR & (1 << SPIF))); // Wait for transmission end
        spiData = SPDR; // Read SPI Data Register
        // Do something with first byte

        while(!(SPSR & (1 << SPIF)));
        spiData = SPDR;
        // Do something with second byte

        while(!(SPSR & (1 << SPIF)));
        spiData = SPDR;
        // Do something with third byte

        while(!(SPSR & (1 << SPIF)));
        spiData = SPDR;
        // Do something with fourth byte
    }
    return 0;
}

PC コード (C#):

static void Main(string[] args)
{
    // Find USBASP
    var device = UsbDevice.OpenUsbDevice(new UsbDeviceFinder(0x16C0, 0x05DC));

    // Set Clock and RESET pin to enable SPI
    int bytesTrasferred;
    var usbSetupPacket = new UsbSetupPacket(0xC0, 1, 0, 0, 0);
    device.ControlTransfer(ref usbSetupPacket, null, 0, out bytesTrasferred);

    // Send Setup Packets
    while (Console.ReadKey(true).Key == ConsoleKey.Enter)
    {
        byte[] buffer = new byte[4];
        usbSetupPacket = new UsbSetupPacket(0xC0, 3, 200, 200, 0);
        device.ControlTransfer(ref usbSetupPacket, buffer, 4, out bytesTrasferred);
        Console.WriteLine("Done. Return result: [{0}, {1}, {2}, {3}]", buffer[0], buffer[1], buffer[2], buffer[3]);
    }

    // Disable SPI
    usbSetupPacket = new UsbSetupPacket(0xC0, 2, 0, 0, 0);
    device.ControlTransfer(ref usbSetupPacket, null, 0, out bytesTrasferred);

    // Free resources
    device.Close();
    UsbDevice.Exit();
}

USBASP -> ATmega328P SPI 通信は正常に動作しますが、Setup Packet のデータwValuewIndexフィールドが USBASP で破損しているように見えます。

[0, 153, 0, 128]
[0, 136, 0, 128]
[1, 209, 1, 217]
[1, 128, 0, 145]
[1, 153, 0, 128]
[0, 145, 1, 209]
[1, 217, 1, 136]
[0, 209, 1, 209]
[1, 217, 1, 136]
so on...

また、これらの数値は ATmega328P に接続された LED ディジット ディスプレイにも表示されます。

誰もそれを説明できますか?

PS プログラミング目的では、この USBASP はうまく機能します。

4

2 に答える 2

3

ただし、問題は SPI にありました。私の ATmega328P は、デフォルトで 1/8 分周器を備えた 8MHz の内部クロックに設定されていたので、適切な SPI 通信には小さすぎる 1MHz の周波数を持っていました。ATmega328Pを外部16mHz水晶に設定することでそれを修正しました。

于 2013-05-20T19:09:50.007 に答える