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
SPI Clock Frekansı nedir abi?
Ferhat spi clock hızı _SPI_FPCLK_DIV2
nucleo dahili 64 mhz de
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.
@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.
Dma nın inceliklerini güzelliklerini ve eksilerini yeni yeni keşfediyorum 😊.