/* Master SPI Test Program for Slave 68HC11 Remote I/O */ /* Based on 68HC912B32 Master Imagecraft C Vs. 6 March, 2000 Don Carveth */ /* Include the Vectors.c file with no ISR Handlers defined */ #include #include char print_buff[80]; char sendSPI(char); unsigned char pins[8] = {1u, 2u, 4u, 8u, 16u, 32u, 64u, 128u}; unsigned char spi_bufout[14] = {0x01u, 'A','B','C','D','E','F','G','H','I','J','K','L','M'}; /* A, B, etc, for testing */ unsigned char spi_bufin[14] = {'0','1','2','3','4','5','6','7','8','9','0','A','B','C'}; char slvMessageOut[] = "Hello - testing...testing...testing. Oh when the Saints, bum bum bum bum.."; char slvCharIn; int SPISendDelay = 120; /* set SPI delay between characters */ int count_test = 0; unsigned int t1,t2,t3,t4; int LC = 0; /* Loop Counter */ unsigned char k; unsigned char slvPORTA, slvPORTC; /* *********************** UTILITY ROUTINES *************************** */ int pin_stat(unsigned char volatile * port, int pin) { if ((*port & pins[pin]) == 0u) return 0; else return 1; } void pin_set(unsigned char volatile * port, int pin) { *port = *port | pins[pin]; } void pin_clr(unsigned char volatile * port, int pin) { *port = *port & ~pins[pin]; } void msleep(int ms) { int i,j; for (i = 1; i < ms; i++) for (j = 1; j < 650; j++); /* to give 1 ms*/ } void run_led(void) { if (pin_stat(&PORTP,7) == 0) pin_set(&PORTP,7); else pin_clr(&PORTP,7); } /* ********************* INITIALIZE ************************* */ void initialize(void) { setbaud(BAUD9600); SC0CR1 = 0x0u; /* SCI Setup */ SC0CR2 = 0x2Cu; /* Tx, Rx enable, Rx int enable */ DDRP = 0x80u; /* Run LED PP7 */ DDRS = 0xEEu; /* SPI Setup */ SP0CR1 = 0x52u; SP0CR2 = 0x0u; SP0BR = 0x02u; /* 02 for 1M, 03 for 500k, 04 for 250k, 07 for 31k */ TSCR = 0x80u; /* Enable timer and counters !!!!!! */ TMSK2 = 0x03u; /* Timer divide by 8 - 1 tick per usec, rolls over every 65 ms*/ asm("andcc #0xEF"); /* Interrupts on */ } /* ************************ MISC ROUTINES ******************** */ void print_info(void) { printf(&print_buff[0], "%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d,%5d\n", spi_bufin[1], spi_bufin[2], spi_bufin[3], spi_bufin[4], spi_bufin[5], spi_bufin[6], spi_bufin[7], spi_bufin[8], spi_bufin[9], spi_bufin[10], spi_bufin[11], spi_bufin[12]); } void print_times(void) /* For checking routine execution times */ { printf(&print_buff[0],"%8d%8d%8d%8d",t1,t2,t3,t4); } char sendSPI(char c) { int k; SP0DR = c; /* Load char and start transfer */ for (k= 0; k < SPISendDelay; k++); /*wait for flag and slave to load regs */ c = SP0SR; /* Clear SPI flag */ c = SP0DR; /* return SPI slave character */ return c; } /* ******************** SLAVE INTERACTION ROUTINES ************ */ void slv_get_ports(void) /* Get / send slave port data */ { int i; for (i = 0; i < 14; i++) /* Limit value must match with slave */ spi_bufin[i] = sendSPI(spi_bufout[i]); /* Send / Receive SPI chars */ slvPORTA = spi_bufin[9]; /* Assign recieved port data to labels */ slvPORTC = spi_bufin[10]; } void slvSendMessage(void) /* Send the string stored in slvMessageOut to the slave */ { int k = 0; sendSPI(0x02); /* Let slave know a message is coming */ do { sendSPI(slvMessageOut[k]); /* Save message characters */ k++; } while (slvMessageOut[k-1] != 0); /* send until a null character is found */ } void slvGetMessage(void) /* Gets slave SCI messages by polling state of pin PT2 */ { if (pin_stat(&PORTT,2)) { /* Checks state of "Slave Char Rec'd" line */ sendSPI(0x04); sendSPI('X'); /* Dummy send to get slave to load first char */ do putchar(sendSPI('Z')); /* Dummy send - get slave char and sends to SCI port */ while (pin_stat(&PORTT,2)); /* Checks state of "Slave Char Rec'd" line */ } } /* ************************ MAIN ******************************* */ void main(void) { initialize(); for (;;) /* Loop forever */ { t1 = TCNT; /* Used for routine execution time testing */ slvGetMessage(); slv_get_ports(); t2 = TCNT; print_info(); /* Turn this off to display slave SCI received characters properly */ slvSendMessage(); t3 = TCNT; run_led(); /* print_times(); */ t4 = TCNT; msleep(100); /* 100 ms delay to set loop cycle time */ LC++; } }