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.




9/12/2009 16:59
11/12/2009 19:17
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
11/12/2009 23:30
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.