2013-05-17 2 views
1

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가 잘 작동합니다.

답변

1

문제는 SPI에서 발생했습니다. 내 ATmega328P는 기본적으로 1/8 분배기가있는 8MHz 내부 클럭으로 설정되었으므로 적절한 SPI 통신을하기에는 너무 작은 1MHz 주파수를 사용했습니다. ATmega328P를 외부 16mHz 크리스털로 설정하여이를 수정했습니다.