STM103 nucleo tft çalışmasında dma ve normal spi register spiden ağır çalışıyor.

Başlatan Murat Mert, 28 Aralık 2019, 13:03:53

Murat Mert

S.A.
Sn. Arkadaşlar daha önce arduino kütüphanesinden faydalanıp yaptığım ili9341 kütüphanesini spi dma ile denemek istedim. Sonuşlar şaşırtıcı ve hayal kırıklığı oldu benim için.
  Normal donanımsal spi kütüphanesi ile yapmıştım. DMA ile yaptım şaşırtıcı aynı hızda hiç değişiklik yok...
  Birde register olarak yapayım dedim hepsinden hızlı oldu şaşırdım.
DMA da böyle olması normal mi şaşırdım hızlı olacak ümidi vardı.  :)

SPI ayarları:
SPI2_Init_Advanced(_SPI_FPCLK_DIV2_SPI_MASTER _SPI_8_BIT _SPI_CLK_IDLE_LOW |_SPI_FIRST_CLK_EDGE_TRANSITION |
_SPI_MSB_FIRST _SPI_SS_DISABLE _SPI_SSM_ENABLE _SPI_SSI_1, &_GPIO_MODULE_SPI2_PB13_14_15);
normal spi yazma:
SPI2_Write(spi_veri 0xFF);
register spi yazma:
SPI2_DR = (spi_veri 0xFF);
spi dma ayar ve yollama
void SPI1_DMA() iv IVT_INT_DMA1_Channel5 ics ICS_AUTO 
{

if (
DMA1_ISR.TCIF5 == 1) {
   
DMA1_IFCR.CGIF5 1;    //clear transfer complete flag
   
DMA1_CCR5.EN 0
 }
 
}


void spi_write(char veri1char veri2char mod)
{
  
spi1_Tx[0] = (veri1 0xFF);
  
spi1_Tx[1] = (veri2 0xFF);
  
DMA1_CNDTR5 mod;         //yollanan byte adet
  
DMA1_CCR5.EN 1;  // dma yollama aktif
}


void DMA1_Tx_SPI2_Config() 
{  
  
DMA1_CPAR5 0x4000380C;// spi2_transfer registeri
  
DMA1_CMAR5 = &spi2_Tx;  // transfer için byte miz
  
DMA1_CNDTR5 2;  // pakette yollayacak olduğumuz paket sayısı

  
DMA1_CCR5.MEM2MEM 0;    //Memory to memory mode disabled
  
DMA1_CCR5.MINC 1;      //Memory increment mode enabled
  
DMA1_CCR5.CIRC 0;      //Circular mode disabled

  
DMA1_CCR5.PL0 0;      //high prioruty
  
DMA1_CCR5.PL1 1;

  
DMA1_CCR5.PSIZE0 0;   // Peripheral size 8 bit
  
DMA1_CCR5.PSIZE1 0;

  
DMA1_CCR5.MSIZE00;    //Memory size 8 bit
  
DMA1_CCR5.MSIZE1 0;   //

  
DMA1_CCR5.B4 1;      //read from memory DIR biti enable

  
DMA1_CCR5.TCIE 1;    // transfer complete biti enable 
 //DMA1_CCR5.HTIE=0;     // transfer half yarım data biti 
  //DMA1_CCR5.PINC=1;
 

  
DMA1_CCR5.TEIE 1;    //enable transfer complete
  
DMA1_CCR5.EN 0;      //disable DMA1 chanel 5 
}


void spi_dma_init()


  
RCC_AHBENR.DMA1EN 1;   //enable DMA Clock  
  
SPI2_CR2bits.TXDMAEN=1//enable spi1_Tx DMA
  
SPI2_CR2bits.TXEIE=0;
  
SPI2_SRbits.TXE=0
  
  
DMA1_Tx_SPI2_Config();    
}

sıkıntıyı tesbit edemedim. Böyle olması normal mi acaba???

Çalışma videoları

normal spi

dma spi

register spi
mert07


Murat Mert

mert07

Mucit23

Hız olarak çok kötü değil ama süre ölçmek açısından bir frame yada ekranın tamamının doldurulması ne kadar sürede tamamlanıyor ona bakmak lazım.

Paralel data aktarsaydın dma ile ciddi bir fark görebilirsin. Gerçi bu farkı yine gözle fark edemezdin.  :) Ekran çözünürlüğü çok yüksek değil.

Bana kalırsa çok yapacak birşey yok. Ama mesela Resim felan yani const data aktaracaksan dma kullanman çok faydalı olur. Onun dışında text gibi işlemler için lokal bölgelerde işlem yapacaksan dma ya çok da gerek yok gibi.

Murat Mert

@Mucit23 registerler ile yaptığım stm32f103c8 de 72 MHz de daha hızlı oldu. Baya fark olunca ne bileyim dma sanki çok hızlı olur gibime gitmişti. Neyse hayırlısı Allah'tan artık. Teşekkürler.
mert07

Murat Mert

Dma nın inceliklerini güzelliklerini ve eksilerini yeni yeni keşfediyorum 😊.
mert07