123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #define INCLUDE_FROM_XPROGTARGET_C
- #include "XPROGTarget.h"
- #if defined(ENABLE_XPROG_PROTOCOL) || defined(__DOXYGEN__)
- bool IsSending;
- void XPROGTarget_EnableTargetPDI(void)
- {
- IsSending = false;
-
- DDRD |= (1 << 5) | (1 << 3);
- DDRD &= ~(1 << 2);
-
- PORTD |= (1 << 3);
- _delay_us(100);
-
- UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1);
- UCSR1B = (1 << TXEN1);
- UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
-
- XPROGTarget_SendIdle();
- XPROGTarget_SendIdle();
- }
- void XPROGTarget_EnableTargetTPI(void)
- {
- IsSending = false;
-
- AUX_LINE_DDR |= AUX_LINE_MASK;
- AUX_LINE_PORT &= ~AUX_LINE_MASK;
- _delay_us(100);
-
- DDRD |= (1 << 5) | (1 << 3);
- DDRD &= ~(1 << 2);
-
- UBRR1 = ((F_CPU / 2 / XPROG_HARDWARE_SPEED) - 1);
- UCSR1B = (1 << TXEN1);
- UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
-
- XPROGTarget_SendIdle();
- XPROGTarget_SendIdle();
- }
- void XPROGTarget_DisableTargetPDI(void)
- {
-
- if (IsSending)
- XPROGTarget_SetRxMode();
-
- UCSR1A = ((1 << TXC1) | (1 << RXC1));
- UCSR1B = 0;
- UCSR1C = 0;
-
- DDRD &= ~((1 << 5) | (1 << 3));
- PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
- }
- void XPROGTarget_DisableTargetTPI(void)
- {
-
- if (IsSending)
- XPROGTarget_SetRxMode();
-
- UCSR1A |= (1 << TXC1) | (1 << RXC1);
- UCSR1B = 0;
- UCSR1C = 0;
-
- DDRD &= ~((1 << 5) | (1 << 3));
- PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
-
- AUX_LINE_DDR &= ~AUX_LINE_MASK;
- AUX_LINE_PORT &= ~AUX_LINE_MASK;
- }
- void XPROGTarget_SendByte(const uint8_t Byte)
- {
-
- if (!(IsSending))
- XPROGTarget_SetTxMode();
-
- while (!(UCSR1A & (1 << UDRE1)));
- UCSR1A |= (1 << TXC1);
- UDR1 = Byte;
- }
- uint8_t XPROGTarget_ReceiveByte(void)
- {
-
- if (IsSending)
- XPROGTarget_SetRxMode();
-
- while (!(UCSR1A & (1 << RXC1)) && TimeoutTicksRemaining);
- return UDR1;
- }
- void XPROGTarget_SendIdle(void)
- {
-
- if (!(IsSending))
- XPROGTarget_SetTxMode();
-
- for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)
- {
-
- while (PIND & (1 << 5));
- while (!(PIND & (1 << 5)));
- while (PIND & (1 << 5));
- }
- }
- static void XPROGTarget_SetTxMode(void)
- {
-
- while (PIND & (1 << 5));
- while (!(PIND & (1 << 5)));
- while (PIND & (1 << 5));
- PORTD |= (1 << 3);
- DDRD |= (1 << 3);
- UCSR1B &= ~(1 << RXEN1);
- UCSR1B |= (1 << TXEN1);
- IsSending = true;
- }
- static void XPROGTarget_SetRxMode(void)
- {
- while (!(UCSR1A & (1 << TXC1)));
- UCSR1A |= (1 << TXC1);
- UCSR1B &= ~(1 << TXEN1);
- UCSR1B |= (1 << RXEN1);
- DDRD &= ~(1 << 3);
- PORTD &= ~(1 << 3);
- IsSending = false;
- }
- #endif
|