mokrowski napisał(a):
MoherPower napisał(a):
Teraz masz:
8MHz / 2 (dzielnik SPI) = 4 MHz (wysyłanie _bitów_) -> 4.000.000 bit/s
możesz mieć:
25MHz / 2 (dzielnik SPI) = 12.5 MHz (wysyłanie _bitów_) -> 12.500.000 bit/s
Co do ustawień to SPI2X oraz dzielnik 2 to już szczyt możliwości samej kostki.
http://3.14.by/en/read/arduino-liquid-nitrogen-overclockingzastanawiam się troszkę w kwesti tych wyliczeń. otóż.
mam wyświetlacz 320*240 co daje mi 76800 pikseli.
tak wygląda funkcja kasowania lcd.
Kod:
[syntax=c]void ILI9325c_Clear( uint16_t Color)
{
uint32_t index=0;
uint8_t color_high=(Color >> 8), color_low=(Color & 0xFF);
ILI9325c_SetCursor(0,0);
ILI9325c_WriteIndex(0x0022);
SPI_ILI9325c_SELECT;
ILI9325c_WriteDataStart();
for( index = 0; index < (uint32_t)MAX_X * MAX_Y; index++ )
{
SPI_Transmit(color_high); /* Write D8..D15 */
SPI_Transmit(color_low); /* Write D0..D7 */
}
SPI_ILI9325c_RELEASE;
}[/syntax]
a zatem poza stratą kilku taktów zegara na ustawienie lini CS, konwersje 16 bit na 2x8 bit i wyslanie komend sterujących, mamy praktycznie pentlę w której cały czas wysyłamy do SPI to samo.
i teraz tak ..
76800 pikseli * 16 bit = 1,228,800 bitów. czyli 1/10 ilości jaką mogę wysłać w 1 sek przy taktowaniu 25MHz (ja wsadziłęm kwarc 32Mhz). Z tego wynikało by że mogę mieć frame rate 10 klatek na sek. Ale tu ciekawostka
przy wykożystaniu wskazanej funkcji oraz (dla całkowitej jasności) funkcji
Kod:
[syntax=c]uint8_t SPI_Transmit( uint8_t bajt ) {
SPDR = bajt;
while( !(SPSR & (1<<SPIF)) );
return SPDR;
}[/syntax]
w rzeczywistości uzyskuję ok 1,5 sek na zapełnienie ekranu!!! to jest 15 razy wolniej niż byśmy oczekiwali na podstawie teoretycznych wyliczeń. gdzie tak mocno zatykamy transmisję???