muszę zrealizować następujące działanie: odczyt z pamięci EEPROM około 512kb danych i transfer tych danych przez UART do komputera. Teraz pytanie jak to najlepiej zrobić?
Moja koncepcja była taka:
w pętli while() uruchamiam transmisję danych z EEPROMU z pollingiem i włączam przerwanie UARTA data register empty. W obsłudze przerwania przesyłam ostatnią daną (ogon) z bufora cyklicznego, gdy koniec bufora jest równy jego początkowi to kasuję przerwanie i nic nie wysyłam.
Mam jednak kilka wątpliwości odnośnie transmisji przez TWI: chcę tę transmisję uruchomić raz i odczytać od razu całe 512kb pamięci, to znaczy wysyłam sygnał startu z żądaniem pisania do slave, wysyłam adres w jego pamięci i wysyłam powtórzony symbol startu z żądaniem czytania ze slave'a. W związku z tym, czy z transmisją przez TWI nie będzie żadnych problemów wskutek "przerw" w transmisji? Przerwa taka zaistnieje np. żeby obsłużyć przerwanie od UARTa czy żeby "zawinąć" bufor cykliczny (zrobić operację and początku (głowy) bufora z maską bufora). Czy po prostu powinienem tutaj tak dobrać prędkość transmisji przez TWI żebym zdążył wszystko obsłużyć zanim kolejna dana z pamięci zniszczy poprzednio odebraną daną.
Mam nadzieję, że stosunkowo jasno to opisałem
edit:
kawałek kodu dla lepszego zrozumienia problemu:
Kod:
void from_eep_mem_to_buf ( void )
{
uint16_t i = 0;
uint8_t tmp_head;
TWI_start();
TWI_write(0xA0);
TWI_write(0);
TWI_start();
TWI_write(0xA0 + 1);
for ( i = 0; i <= 65535; i++)
{
tmp_head = (Buf_Head) & CYCLIC_BUF_MASK;
while (tmp_head == Buf_Tail) {}
Cyclic_Buf [tmp_head] = TWI_read((i == 65535) ? NACK : ACK);
}
}
i przerwanie:
Kod:
ISR ( USART_UDRE_vect )
{
if ( Buf_Head != Buf_Tail ) //check if indexes are different
{
Buf_Tail = ( Buf_Tail + 1 ) & CYCLIC_BUF_MASK; //new index
UDR = Cyclic_Buf [Buf_Tail]; //transmit value from cyclic buffer
}
else UCSRB &= ~(1<<UDRIE);
}