00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "pic24_all.h"
00031
00036 void reverseString(volatile char *psz_s1, volatile char *psz_s2);
00037
00038 #define CONFIG_SLAVE_ORDY() CONFIG_RB2_AS_DIG_OUTPUT()
00039 #define SLAVE_ORDY _LATB2
00040
00041 typedef enum {
00042 STATE_WAIT_FOR_STRING,
00043 STATE_SEND_REV_STRING,
00044 STATE_LAST_REVCHAR_STRING,
00045 } STATE;
00046
00047 volatile STATE e_mystate = STATE_WAIT_FOR_STRING;
00048 #define BUFSIZE 63
00049 volatile char sz_1[BUFSIZE+1];
00050 volatile char sz_2[BUFSIZE+1];
00051 volatile uint16 u16_index;
00052
00053 void _ISR _SPI1Interrupt (void) {
00054 uint16 u16_tmp;
00055 switch (e_mystate) {
00056 case STATE_WAIT_FOR_STRING:
00057
00058 sz_1[u16_index] = SPI1BUF;
00059 u16_index++;
00060 if (sz_1[u16_index-1] == 0) {
00061
00062
00063 reverseString(sz_1,sz_2);
00064
00065 u16_index = 0;
00066 SPI1BUF = sz_2[u16_index];
00067 u16_index++;
00068 SLAVE_ORDY = 1;
00069 e_mystate = STATE_SEND_REV_STRING;
00070 }
00071 break;
00072 case STATE_SEND_REV_STRING:
00073 u16_tmp = SPI1BUF;
00074
00075 SPI1BUF = sz_2[u16_index];
00076 u16_index++;
00077 if (sz_2[u16_index-1] == 0) {
00078
00079 SLAVE_ORDY = 0;
00080 e_mystate = STATE_LAST_REVCHAR_STRING;
00081 }
00082 break;
00083 case STATE_LAST_REVCHAR_STRING:
00084 u16_index = 0;
00085 u16_tmp = SPI1BUF;
00086
00087 e_mystate = STATE_WAIT_FOR_STRING;
00088 break;
00089 default:
00090 e_mystate = STATE_WAIT_FOR_STRING;
00091 }
00092 _SPI1IF = 0;
00093 }
00094
00095 void reverseString(volatile char *psz_s1, volatile char *psz_s2) {
00096 volatile char *psz_s1end;
00097 if (!(*psz_s1)) {
00098 *psz_s2 = 0;
00099 return;
00100 }
00101 psz_s1end = psz_s1;
00102
00103 while (*psz_s1end) psz_s1end++;
00104 psz_s1end--;
00105
00106 while (psz_s1end != psz_s1) {
00107 *psz_s2 = *psz_s1end;
00108 psz_s1end--;
00109 psz_s2++;
00110 }
00111
00112 *psz_s2 = *psz_s1end;
00113 psz_s2++;
00114
00115 *psz_s2 = 0;
00116 }
00117
00118 void configSPI1(void) {
00119
00120 SPI1CON1 = CLK_POL_ACTIVE_HIGH |
00121 SPI_CKE_ON |
00122 SLAVE_ENABLE_ON |
00123 SPI_MODE8_ON |
00124 MASTER_ENABLE_OFF;
00125
00126 CONFIG_SDO1_TO_RP(6);
00127 CONFIG_RP6_AS_DIG_PIN();
00128 CONFIG_SCK1IN_TO_RP(7);
00129 CONFIG_RP7_AS_DIG_PIN();
00130 CONFIG_SDI1_TO_RP(5);
00131 CONFIG_RP5_AS_DIG_PIN();
00132 CONFIG_SS1IN_TO_RP(3);
00133 CONFIG_RP3_AS_DIG_PIN();
00134 CONFIG_SLAVE_ORDY();
00135 SLAVE_ORDY = 0;
00136 u16_index = 0;
00137 _SPI1IF = 0;
00138 _SPI1IP = 3;
00139 _SPI1IE = 1;
00140 SPI1STATbits.SPIROV = 0;
00141 SPI1STATbits.SPIEN = 1;
00142 }
00143
00144
00145 int main (void) {
00146 configClock();
00147 configHeartbeat();
00148 configSPI1();
00149 while (1) doHeartbeat();
00150 }