ARM7 – SPI Haberleşme (C)
|Bu uygulamada LPC2148’in SPI modulunu kullanacağız. LPC2000 serisinin , microchip 8-16bit işlemcilerine göre çok daha fonksiyonel ve kullanışlı. Örneğin göndereceğiniz bit sayısını (4-16bit) seçebiliyorsunuz bence bu çok önemli bir faktör özellikle hız gerektiren uygulamalarda, ayrıca yine bus frekansı microchip işlemcilerine göre çok daha hızlı , bu özellikte grafik lcd vs. sürerken önemli oluyor.Zaten tüm hız gerektiren uygulama IC’leri SPI ile haberleşir.
Aşağıya eklediğim program ile 74hc595’e SPI modulü ile yazıyoruz ve latch ediyoruz.74hc595 ile haberleşmek için 3 uç kullanılır. Serial data, serial clock ve latch (program içinde load yazdım çünkü bu pin hem datayı çıkış registerlerine yüklüyor hemde latch ediyor) kullanılıyor. Data ve clock için SPI0’ın data ve clock pinleri bağlanır , latch için ise P0.7 portu bağlanır.
/*****************************************************************************/ // Aykut ULUSAN, Elektronik Mühendisi, IZMIR /*****************************************************************************/ #include "lpc214x.h" // Nxp LPC2148 için header file #define SPI_PIN_CONFIG 0x1500 // SSEL kullanmiyacagiz #define PCLK 30000000 //30Mhz #define HC595_LOAD 0x80 // P0.7'yi latch icin kullanacagiz #define HC595_LOAD_HIGH IOSET0=HC595_LOAD #define HC595_LOAD_LOW IOCLR0=HC595_LOAD void sistem_init(){ // Processor clock=5*12Mhz=60Hz PLL0CFG=0x24; // PLLCON ve PLLCFG registerleri içerigi degistirildiginde , asagidaki // proses uygulanir, 1) PLL0FEED=0xAA ve 2)PLL0FEED=0x55 PLL0FEED=0xAA; // Feed process PLL0FEED=0x55; PLL0CON=0x1; // PLL'i enable et PLL0FEED=0xAA; // Feed process PLL0FEED=0x55; while(!(PLL0STAT&0x400)) ; // PLL kitleninceye kadar bekle (5*12Mhz=60Mhz'e kitlenir) PLL0CON=0x3; // PLL'i clock kaynagi gibi bagla PLL0FEED=0xAA; // Feed process PLL0FEED=0x55; MAMCR=0x2; // MAM full Enable MAMTIM=0x4; // MAM fetch cycles = 4CCLK VPBDIV=0x02; // 30 MHz } void DLY_MS(long ms){ long i,j; for (i = 0; i<ms; i++ ) for (j = 0; j<7500; j++ ); } void SPI0_SETUP(void){ IO0DIR|=HC595_LOAD; // P0.7'yi port olarak kullanacagiz IO0CLR=HC595_LOAD; // P0.7=0 PINSEL0|=0x1500; // pinler SPI için kullanılacak S0SPCR= (0<<3) | // CPHA = 0 , clock'un ilk kenarinda data sample yapilir (0<<4) | // CPOL = 0 ,clock aktif high (1<<5) | // MSTR=1 master mode (0<<6); // ilk önce 7. bit(msb) gönderilir S0SPCCR=30; //1Mhz clock hizi } void SPI0_SEND(unsigned char da_ta){ S0SPDR=da_ta; // datayi yukle while(!(S0SPSR&0x80)); // data gonderme tamamlandiginda S0SPRS'nin 7. biti(SPIF) set olur IOSET0=HC595_LOAD; // latch et IOCLR0=HC595_LOAD; da_ta=S0SPDR; // SPIF flag'i clear etmek icin okunur } int main(void){ unsigned char i=0; sistem_init(); SPI0_SETUP(); // SPI0'i hazirla while(1){ SPI0_SEND(i++); // gonder DLY_MS(200); } }
SPI modul kullanımı öğrenildikten sonra SPI ile haberleşen tüm elektronik komponentleri kontrol edebilirsiniz.
Benim yaptığım bazı uygulamarların resimleri aşağıdadır.
:(ya kardeşim buna girmiş hahahahha;)8)
slm iyi çalışmalar bütün bu programları keilde mi yazıyorsunuz ?keil ile ilgili döküman varmı elinizde ben ccs c kullanıyorum ve ansi c dilini çok iyi biliyorum fakat kaynak ve program bulamadıgım için arm işlemciler ile çalışamıyorum benim elimde Keil uVision3 versionu var ama yazdıgım programları proteusda deneyemiyorum 🙁 bana yardımçı olcak bir döküman gönderirseniz çok sevinirim teşekkürler iyi çalışmalar
Türkçe döküman yok, ingilizceniz varsa keil sitesinde döküman var. Proteus kullanmıyorum ama sanırım LPC21xx serisi var. Elinizde keil varsa deneyebilirsiniz ama doğru işlemciyi seçmeniz ve doğru işlemci için yazılmış olması gerekir.
Merhabalar
Kusura bakmayın rahatsız ediyorum. Ben arm işlemcili mcu kullanmak istiyorum Bu konuda baya arastırma yaptım ama sanırım kafam karıstı biraz. ilk once benim bir development kit almam gerekiyor sanırım sonra jtag gerekiyor sanırım bu debug için yanlıs anlamadıysam. programı arm a atmak için de jlink olur sanırım. bu development kit ile beraber bu jtag ve jlink gelmiyormu. birde samsung un bu atmel in mi st nin mi yoksa nxp nin mi ARM ı fonksiyonellik, kod ve kaynak bulma açısından onerirsiniz.Birde prosedurun işleyiişi pc tarafında c dili ile derleme imkanına sahip arayuz lu bir(mesela keil) derleyici ile yazdıgım kodu jlink ile development kite atıyorum ve boylelikle kod yazma ve arm a atma işlevi oluyor mu yani pic de hex uretip programlayıcı ile atmak ile aynı sey mi sanırım bu konuda yanılıyorum bu konuda beni bilgilendirirmisiniz. birde youtube dan bazı arm ile ilgili videolar gordum arm ın içine işletim sistemi atılabiliyormu..Bazı videolar izledim youtube dan sanki dokunmatik ekran laptop yada herhangi bir pocket urun kullanır gibi projeler vardı… sorularım cok basit sacma ve komik gelebilir kusuruma bakmazsınız umarım hakkınızı helal edin.
Merhaba,
Soruların gayet mantıklı ve güzel sorular. Jtag illa şart değil, jtag olursa programını adım adım çalıştırabilirsin ve ilgili registerleri real time okuyabilirsin. Ama bunun yerine Uart üzerinden veya sadece bir porta bağlı led ile bile bu işlemleri yapmanın yolları var ama tercih meselesi, ayrıcada programlama için kullanılıyor tabii ki.
Arm tabanlı işlemciler uart üzerinden programlanabiliyor, dahili olarak gömülü bootloader barındırıyor. Uart donanımını kart dışına alırsan pic gibi (picte 5 uç yetiyor) 6 pin ile program yazıp okuyabilirsin ayrıca aynı uart portunu debug için bile kullanabilirsin.
Firma olarak ise en ucuz ve en çok olanak sunan işlemcileri seçmek avantajlı. NXP ve ST firması şuanda bu konuda bayağı iyi.
İşletim sistemi kurma işlemleri Arm9 ve üzeri için gerçekleştirilebiliyor çünkü hız faktörü çok önemli.
Hangi development kit alayım diye sorarsan, Cortex tabanlı ST’den stm32 veya NXP’den LPC serisinden almanı tavsiye ederim.