使用USBASP编程器进行SPI通信

时间:2013-05-17 18:27:13

标签: avr libusb spi

我正试图通过USBASP编程器将一些数据从PC发送到ATmega328P芯片。

能够通过SPI传输最多4个字节。这4个字节可以在USB Setup Packet中设置(wValue为2个字节,wIndex为2个字节)。要在ATmega328P中启用SPI,我已将USBASP Reset引脚连接到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 - &gt; ATmega328P SPI通信运行良好,但似乎安装包的wValuewIndex字段中的数据被USBASP损坏,因为我得到了这个输出(虽然它应该是常数 - [0,200] ,0,200]):

[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数字显示屏上看到这些数字。

任何人都可以解释一下吗?

P.S。出于编程目的,此USBASP运行良好。

2 个答案:

答案 0 :(得分:1)

问题出在SPI上。我的ATmega328P默认设置为8MHz内部时钟和1/8分频器,因此频率为1MHz,对于正确的SPI通信来说太小了。我通过将ATmega328P设置为外部16mHz晶体来解决这个问题。

答案 1 :(得分:0)

您还可以在 libusb 中将数据传输速率设置为 750kb,或者如果该程序不支持更改传输速率,请使用 avrdude 之类的程序可以做到这一点。