USBASP 프로그래머를 통해 PC에서 ATmega328P 칩으로 일부 데이터를 보내려고합니다.SPICE 통신용 USBASP 프로그래머 사용
SPI를 통해 최대 4 바이트를 전송할 수 있습니다. 이 4 바이트는 USB 설정 패킷 (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 -> 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에 연결된 LED 숫자 디스플레이에 표시되어 있습니다.
누구든지 설명 할 수 있습니까?
P.S. 프로그래밍 목적으로이 USBASP가 잘 작동합니다.