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 #include "pic24_all.h"
00030
00031
00038 void reverseString(volatile char *psz_s1, volatile char *psz_s2) {
00039 volatile char *psz_s1end;
00040 if (!(*psz_s1)) {
00041 *psz_s2 = 0;
00042 return;
00043 }
00044 psz_s1end = psz_s1;
00045
00046 while (*psz_s1end) psz_s1end++;
00047 psz_s1end--;
00048
00049 while (psz_s1end != psz_s1) {
00050 *psz_s2 = *psz_s1end;
00051 psz_s1end--;
00052 psz_s2++;
00053 }
00054
00055 *psz_s2 = *psz_s1end;
00056 psz_s2++;
00057
00058 *psz_s2 = 0;
00059 }
00060
00061
00062
00063 #define SLAVE_I2C_ADDR 0x60
00064
00065 typedef enum {
00066 STATE_WAIT_FOR_ADDR,
00067 STATE_WAIT_FOR_WRITE_DATA,
00068 STATE_SEND_READ_DATA,
00069 STATE_SEND_READ_LAST
00070 } STATE;
00071
00072 volatile STATE e_mystate = STATE_WAIT_FOR_ADDR;
00073 #define BUFSIZE 64
00074 volatile char sz_1[BUFSIZE+1];
00075 volatile char sz_2[BUFSIZE+1];
00076 volatile uint16 u16_index;
00077
00078
00079 void _ISRFAST _SI2C1Interrupt(void) {
00080 uint8 u8_c;
00081 _SI2C1IF = 0;
00082 switch (e_mystate) {
00083 case STATE_WAIT_FOR_ADDR:
00084 u8_c = I2C1RCV;
00085 u16_index = 0;
00086
00087 if (I2C1STATbits.R_W) {
00088 I2C1TRN = sz_2[u16_index++];
00089 I2C1CONbits.SCLREL = 1;
00090 e_mystate = STATE_SEND_READ_DATA;
00091 } else e_mystate = STATE_WAIT_FOR_WRITE_DATA;
00092 break;
00093 case STATE_WAIT_FOR_WRITE_DATA:
00094
00095 sz_1[u16_index++] = I2C1RCV;
00096 if (sz_1[u16_index-1] == 0) {
00097
00098 reverseString(sz_1,sz_2);
00099 e_mystate = STATE_WAIT_FOR_ADDR;
00100 }
00101 break;
00102 case STATE_SEND_READ_DATA:
00103
00104 I2C1TRN = sz_2[u16_index++];
00105 I2C1CONbits.SCLREL = 1;
00106 if (sz_2[u16_index-1] == 0) e_mystate = STATE_SEND_READ_LAST;
00107
00108 break;
00109 case STATE_SEND_READ_LAST:
00110 e_mystate = STATE_WAIT_FOR_ADDR;
00111 break;
00112 default:
00113 e_mystate = STATE_WAIT_FOR_ADDR;
00114 }
00115
00116 }
00117
00118 int main (void) {
00119 configBasic(HELLO_MSG);
00120 configI2C1(400);
00121 I2C1ADD = SLAVE_I2C_ADDR>>1;
00122 _SI2C1IF = 0;
00123 #ifdef _SI2C1IP
00124 _SI2C1IP = 1;
00125 #else
00126 #ifdef _SI2C1IP0
00127 _SI2C1IP0 = 1;
00128 _SI2C1IP1 = 0;
00129 _SI2C1IP2 = 0;
00130 #endif
00131 #endif
00132 _SI2C1IE = 1;
00133 while (1) doHeartbeat();
00134 }