#include <lpc214x.h> #include <stdio.h> #define PLOCK 0x00000400 // for PLL #define THRE (1<<5) // Transmit Holding Register Empty #define RDR (1<<0) // Receiver Data Ready #define MULVAL 15 #define DIVADDVAL 1 #define NEW_LINE 0xA // Character for new line, analogous to '\n' #define ENTER 0xD // ASCII code for ENTER void sysInit(); void gsminit(); void gsmcall(); void string_0(unsigned char *); unsigned char gsmrec(); void delay(unsigned int); void eval(unsigned char, int); void initClocks(void); void setupPLL0(void); void feedSeq(void); void connectPLL0(void); int main(void) { int flag=0; unsigned char ch1='\0'; //initClocks(); // Set CCLK=60Mhz and PCLK=60Mhz sysInit(); gsminit(); gsmcall(); delay(5000); ch1=gsmrec(); delay(50000000); if(ch1=='\0') flag=1; eval(ch1,flag); return 0; } void sysInit() { PINSEL0 |= 0X00000005; PINSEL1 = 0x00000000; IO1DIR = 0xFFFFFFFF; IO1SET = 0xFFFFFFFF; U0LCR = 0x00000083; //8-bit data, no parity, 1-stop bit U0DLL = 0x00000061; //for Baud rate=9600,DLL=82 U0LCR = 0x00000003; //DLAB = 0 //U0LCR = 3 | (1<<7) ; /* 8 bits, no Parity, 1 Stop bit | DLAB set to 1 */ //U0DLL = 110; //U0DLM = 1; //U0FDR = (MULVAL<<4) | DIVADDVAL; /* MULVAL=15(bits - 7:4) , DIVADDVAL=0(bits - 3:0) */ //U0LCR &= 0x0F; // Set DLAB=0 to lock MULVAL and DIVADDVAL, BaudRate is now ~9600 } unsigned char recch(void) { while( !(U0LSR & RDR ) ) // wait till any data arrives into Rx FIFO {;} return U0RBR; } void gsminit() { unsigned char rec=0; while(1) { string_0("AT\r\n"); rec=recch(); if((rec=='0')||(rec=='K')) {break;} } string_0("AT+IPR=9600\r"); // AT COMMAND FOR BAUD RATE delay(2000); string_0("AT+CREG?\r\n"); delay(2000); string_0("AT+CMGF=1\r\n"); delay(2000); string_0("AT+CNMI = 2,1,0,0,0\r\n"); delay(2000); } void gsmcall() { string_0("ATD+919757257894;\r\n");//AT COMMAND FOR CALL DIALING delay(2000); } void sendch(unsigned char ch) { while ( !(U0LSR & THRE ) ) {;} U0THR = ch; } void string_0(unsigned char *str) { unsigned int i=0; while(str[i]!='\0') { sendch(str[i]); i++; } } unsigned char gsmrec() { unsigned char chh; string_0("AT+CMGD=1,4\r\n"); string_0("AT+CMGR=1\r\n"); delay(2000); chh=recch(); return chh; } void delay(unsigned int n) { int i,j,c=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { c++;} } } void eval(unsigned char ch, int flag) { if((ch =='s')||(ch=='S')||(flag==1)) { while(1) { IO1SET = 0xFFFFFFFF; delay(2000); IO1CLR = 0xFFFFFFFF; delay(2000); } } else { IO1CLR = 0xFFFFFFFF; } } void initClocks(void) { setupPLL0(); feedSeq(); //sequence for locking PLL to desired freq. connectPLL0(); feedSeq(); //sequence for connecting the PLL as system clock //SysClock is now ticking @ 60Mhz! VPBDIV = 0x01; // PCLK is same as CCLK i.e 60Mhz //Using PLL settings as shown in : www.ocfreaks.com/.../ //PLL0 Now configured! }
//---------PLL Related Functions :---------------
void setupPLL0(void) { //Note : Assuming 12Mhz Xtal is connected to LPC2148. PLL0CON = 0x01; // PPLE=1 & PPLC=0 so it will be enabled // but not connected after FEED sequence PLL0CFG = 0x24; // set the multipler to 5 (i.e actually 4) // i.e 12x5 = 60 Mhz (M - 1 = 4)!!! // Set P=2 since we want FCCO in range!!! // So , Assign PSEL =01 in PLL0CFG as per the table. } void feedSeq(void) { PLL0FEED = 0xAA; PLL0FEED = 0x55; } void connectPLL0(void) { // check whether PLL has locked on to the desired freq by reading the lock bit // in the PPL0STAT register while( !( PLL0STAT & PLOCK )); // now enable(again) and connect PLL0CON = 0x03; }