Я пытаюсь отправить некоторые данные с ПК на чип ATmega328P через программатор USBASP.
Он способен передавать до 4 байтов по SPI. Эти 4 байта можно установить в USB Setup Packet (2 байта для wValue
и 2 байта для wIndex
). Чтобы включить SPI в ATmega328P, я подключил USBASP Reset
контакт к SS
. На стороне ПК я использую 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;
}
Код ПК (С#):
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 работает хорошо, но кажется, что данные в полях wValue
и wIndex
установочного пакета поступают в 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.
Кто-нибудь может это объяснить?
P.S. Для целей программирования этот USBASP работает хорошо.