+ /* Throw away the start, parity and stop bits to leave only the data */\r
+ return (uint8_t)(SoftUSART_Data >> 1);\r
+#endif\r
+}\r
+\r
+void PDITarget_SendBreak(void)\r
+{\r
+#if defined(PDI_VIA_HARDWARE_USART)\r
+ /* Switch to Tx mode if currently in Rx mode */\r
+ if (!(IsSending))\r
+ {\r
+ PORTD |= (1 << 3);\r
+ DDRD |= (1 << 3);\r
+\r
+ UCSR1B &= ~(1 << RXEN1);\r
+ UCSR1B |= (1 << TXEN1);\r
+ \r
+ IsSending = true;\r
+ }\r
+\r
+ /* Need to do nothing for a full frame to send a BREAK */\r
+ for (uint8_t i = 0; i <= BITS_IN_FRAME; i++)\r
+ {\r
+ /* Wait for a full cycle of the clock */\r
+ while (PIND & (1 << 5));\r
+ while (!(PIND & (1 << 5)));\r
+ }\r
+#else\r
+ /* Switch to Tx mode if currently in Rx mode */\r
+ if (!(IsSending))\r
+ {\r
+ BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;\r
+ BITBANG_PDIDATA_DDR |= BITBANG_PDIDATA_MASK;\r
+\r
+ IsSending = true;\r
+ }\r
+ \r
+ while (SoftUSART_BitCount);\r
+\r
+ /* Need to do nothing for a full frame to send a BREAK */\r
+ SoftUSART_Data = 0x0FFF;\r
+ SoftUSART_BitCount = BITS_IN_FRAME;\r
+#endif\r
+}\r
+\r
+void PDITarget_SendAddress(uint32_t Address)\r
+{\r
+ PDITarget_SendByte(Address >> 24);\r
+ PDITarget_SendByte(Address >> 26);\r
+ PDITarget_SendByte(Address >> 8);\r
+ PDITarget_SendByte(Address & 0xFF);\r
+}\r
+\r
+bool PDITarget_WaitWhileNVMBusBusy(void)\r
+{\r
+ uint8_t AttemptsRemaining = 255;\r
+\r
+ /* Poll the STATUS register to check to see if NVM access has been enabled */\r
+ while (AttemptsRemaining--)\r
+ {\r
+ PDITarget_SendByte(PDI_CMD_LDCS | PDI_STATUS_REG);\r
+ if (PDITarget_ReceiveByte() & PDI_STATUS_NVM)\r
+ return true;\r
+ }\r