Fix AVRISP PDI protocol - make sure inverted masks have the appropriate parenthesis...
[pub/USBasp.git] / Projects / AVRISP / Lib / PDITarget.c
index 9a94e9a..d012a1b 100644 (file)
@@ -172,9 +172,9 @@ void PDITarget_EnableTargetPDI(void)
        /* Set up the synchronous USART for XMEGA communications - \r
           8 data bits, even parity, 2 stop bits */\r
        UBRR1  = 10;\r
-       UCSR1B = (1 << TXEN1);\r
        UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);\r
 \r
+       /* Send two BREAKs of 12 bits each to enable PDI interface (need at least 16 idle bits) */\r
        PDITarget_SendBreak();\r
        PDITarget_SendBreak();\r
 }\r
@@ -186,7 +186,7 @@ void PDITarget_DisableTargetPDI(void)
        UCSR1C = 0;\r
 \r
        /* Set all USART lines as input, tristate */\r
-       DDRD  &= ~(1 << 5) | (1 << 3);\r
+       DDRD  &= ~((1 << 5) | (1 << 3));\r
        PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));\r
 }\r
 \r
@@ -215,11 +215,14 @@ uint8_t PDITarget_ReceiveByte(void)
 void PDITarget_SendBreak(void)\r
 {\r
        UCSR1B &= ~(1 << RXEN1);\r
-       UCSR1B |= (1 << TXEN1);\r
+       UCSR1B |=  (1 << TXEN1);\r
 \r
-       for (uint8_t i = 0; i < BITS_IN_FRAME; i++)\r
+       for (uint8_t i = 0; i <= BITS_IN_FRAME; i++)\r
        {\r
+               /* Wait for rising edge of clock */\r
                while (PIND & (1 << 5));\r
+               \r
+               /* Wait for falling edge of clock */\r
                while (!(PIND & (1 << 5)));\r
        }\r
 }\r