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

Başlatan Murat Mert, 28 Aralık 2019, 10: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 veri1, char veri2, char 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.MSIZE0= 0;    //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