Код: #include "lpc23xx.h"
typedef volatile unsigned int *reg32_t;
//#define MAMCR (*(reg32_t)0xE01FC000) #define IOPIN (*(reg32_t)0xE0028010) #define IOSET (*(reg32_t)0xE0028014) #define IODIR (*(reg32_t)0xE0028018) #define IOCLR (*(reg32_t)0xE002801C) #define IOPINSEL0 (*(reg32_t)0xE002C00C)
#define OSCEN 5
#define LEDMASK 0x1 //0xFFFFFFFF
volatile unsigned char ch = 0x20; volatile unsigned long port2; volatile unsigned long port4; volatile unsigned long port2n; volatile unsigned long port4n; volatile unsigned long porttemp = 0ul; volatile unsigned long port2out;
volatile unsigned long ticks = 0; volatile unsigned long tx_now; volatile unsigned long tx_last;
void Init_MCU() { SCS = 0x00000029;//|= (1 << OSCEN); CLKSRCSEL = 1; /*// disconnect/disable PLLCON = 0x0; PLLFEED = 0xaa; PLLFEED = 0x55; // configure CLKSRCSEL = 1; // Switch to main oscillator input (12 MHz) PLLCFG = (0x2 << 9) | 0x19; // Fcco=2*10*12/2=120 MHz PLLFEED = 0xaa; PLLFEED = 0x55; // enable PLLCON = 0x1; PLLFEED = 0xaa; PLLFEED = 0x55; // wait for lock while (!(PLLSTAT & (1 << 26))); // connect PLLCON = 0x3; PLLFEED = 0xaa; PLLFEED = 0x55; // set CPU clock to 120/6 = 20 MHz CCLKCFG = 5;*/
//FIO2DIR |= 0xFFFFFFFF;//0x00000400; //FIO2MASK |= 0xFFFFFFFF;//0x00000400;
//FIO0DIR |= 0xFFFFFFFF; //FIO0MASK |= 0xFFFFFFFF;
//FIO1 - LEDs output FIO1DIR |= 0xFFFFFFFF; FIO1MASK |= 0x0000000;//0xFFFFFFFE; //0x0000000;
FIO4DIR |= 0x0000000 | (1ul << 28); //P4.28 -> TxD3 as output FIO4MASK |= 0x0000000;
FIO2DIR |= 0x0000000 | (1ul << 2) | (1ul << 0) | (1ul << 8); //CTS to GSM and TxD to GSM and CTS to PC (MAIN RS232) as outputs FIO2MASK |= 0x0000000;
FIO0DIR |= 0x0000000 | (1ul << 20) | (1ul << 22); //ON/~OFF and ~RESET as outputs FIO0MASK |= 0x0000000; FIO0PIN = 0ul;//1ul << 20; pin P0.20 - On/OFF should be LOW for at least 685ms for power up and internal VCC2.8 to be out
//FIO3DIR |= 0xFFFFFFFF; //FIO3MASK |= 0xFFFFFFFF;
//IOPINSEL0 = 0x00000000; //IODIR |= LEDMASK;
PINSEL4 = 0x00000000; }
static void ledOn(int led) { IOCLR = led; }
static void ledOff(int led) { IOSET = led; }
void delay(unsigned long long d) { for(; d; --d); }
int TestLED(void) { unsigned long i, j;
//ledInit(); ledOff(LEDMASK); for(i = 0; i < 256000; i++) delay(20000000); ledOn(LEDMASK); for(i = 0; i < 256000; i++) delay(20000000); return 0; }
void Get_Ports() { port2 = FIO2PIN; port4 = FIO4PIN; }
void Set_Ports() { FIO2PIN = port2out; FIO4PIN = port4n; }
void main() { Init_MCU();
FIO1PIN = ~0x00ul; //turn off leds
while(1) { FIO2PIN = ((FIO4PIN & (1ul << 29)) >> 29) | //read External RxD and Send to GSM ((FIO2PIN & (1ul << 9)) >> 7) | //External CTS (from PC) to GSM_RTS ((FIO2PIN & (1ul << 7)) << 1); //GSM CTS (from GSM) to PC_RTS FIO4PIN = ((FIO2PIN & (1ul << 1)) << 27); //read GSM TxD and send to RS232-TxD
/* //External CTS (from PC) to GSM_RTS: FIO2PIN |= ((FIO2PIN & (1ul << 9)) >> 7); //GSM CTS (from GSM) to PC_RTS: FIO2PIN |= ((FIO2PIN & (1ul << 7)) << 1); */
//check for gsm halted tx_now = FIO2PIN & (1ul << 1); if (tx_now == tx_last) { ticks++; if (ticks >= 21000000ul) //6 000 000 => ~8.5 seconds; 21 000 000 => ~30 seconds { //reset_gsm: FIO0PIN |= 1ul << 22; ticks = 600000ul; //600 000 => ~100 ms while(--ticks) ; FIO0PIN &= ~(1ul << 22);
ticks = 0; } } else { ticks = 0; } tx_last = tx_now;
//Debug & display: FIO1PIN = 0xFFFFFFFC | ((((FIO4PIN & (1ul << 29)) >> 29) & 1ul) | (((FIO4PIN & (1ul << 28)) >> 27) & 2ul)); //Display RxD & Txd on LEDs: 0,1 //FIO4PIN = ((FIO4PIN & (1ul << 29)) >> 1) & (1ul << 28); //echo on TxD } }
|