Subversion Repositories Code-Repo

Rev

Rev 128 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 128 Rev 129
Line 4... Line 4...
4
static SPI_DATA spi_data;
4
static SPI_DATA spi_data;
5
static SPI_DATA *spi_data_p = &spi_data;
5
static SPI_DATA *spi_data_p = &spi_data;
6
 
6
 
7
void SPI2_Init(unsigned char speed) {
7
void SPI2_Init(unsigned char speed) {
8
    // Set up SPI2 with specified pins
8
    // Set up SPI2 with specified pins
9
    RPINR22 = 7; // SPI2 CLK Input  (Pin RB4)
9
    RPINR22 = PPS_SPI2_CLK_IN; // SPI2 CLK Input  (Pin RB4)
10
    RPOR7 = 11; // SPI2 CLK Output (Pin RB4)
10
    PPS_SPI2_CLK_OUT = 11; // SPI2 CLK Output (Pin RB4)
11
#ifndef SPI2_WRITE_ONLY
11
#ifndef SPI2_WRITE_ONLY
12
    RPINR21 = 6; // SPI2 Data Input (Pin RB3)
12
    RPINR21 = PPS_SPI2_MISO; // SPI2 Data Input (Pin RB3)
13
#endif
13
#endif
14
    RPOR5 = 10; // SPI2 Data Output   (MOSI) (Pin RB2)
14
    PPS_SPI2_MOSI = 10; // SPI2 Data Output   (MOSI) (Pin RB2)
15
 
15
 
16
    TRISBbits.TRISB4 = 0; // SPI2 clock pin       (Pin RB4)
16
    SPI_CLK_TRIS = 0; // SPI2 clock pin       (Pin RB4)
17
#ifndef SPI2_WRITE_ONLY
17
#ifndef SPI2_WRITE_ONLY
18
    TRISBbits.TRISB3 = 1; // SPI2 data in pin     (Pin RB3)(MISO)
18
    SPI_MISO_TRIS = 1; // SPI2 data in pin     (Pin RB3)(MISO)
19
#endif
19
#endif
20
    TRISBbits.TRISB2 = 0; // SPI2 data out pin    (Pin RB2)(MOSI)
20
    SPI_MOSI_TRIS = 0; // SPI2 data out pin    (Pin RB2)(MOSI)
21
 
21
 
22
    TRISBbits.TRISB7 = 0; // SPI2 slave select    (Pin RB7)
22
    SPI_SLAVE_SELECT_TRIS = 0; // SPI2 slave select    (Pin RB7)
23
    LATBbits.LATB7 = 1; // SPI2 SS high (Idle)
23
    SPI_SLAVE_SELECT_LAT = 1; // SPI2 SS high (Idle)
24
 
24
 
25
    TRISBbits.TRISB6 = 0; // SPI2 reset   (Pin RB6)
25
    SPI_RESET_TRIS = 0; // SPI2 reset   (Pin RB6)
26
    LATBbits.LATB6 = 1; // SPI2 reset active low
26
    SPI_RESET_LAT = 1; // SPI2 reset active low
27
 
27
 
28
    TRISBbits.TRISB5 = 0; // SPI2 D/C select (Pin RB5)
28
    SPI_DC_SELECT_TRIS = 0; // SPI2 D/C select (Pin RB5)
29
    LATBbits.LATB5 = 0;
29
    SPI_DC_SELECT_LAT = 0;
30
 
30
 
31
    SSP2STATbits.SMP = 0; // Input is sampled in the middle of data output time
31
    SSP2STATbits.SMP = 0; // Input is sampled in the middle of data output time
32
    SSP2STATbits.CKE = 0; // Transmit occurs on transition from Idle to active clock state
32
    SSP2STATbits.CKE = 0; // Transmit occurs on transition from Idle to active clock state
33
 
33
 
34
    SSP2CON1bits.SSPM = speed;
34
    SSP2CON1bits.SSPM = speed;
35
//    if (speed == SPI2_FOSC_4)
-
 
36
//        SSP2CON1bits.SSPM = 0b0000; // Clock = FOSC/4
-
 
37
//    else if (speed == SPI2_FOSC_8)
-
 
38
//        SSP2CON1bits.SSPM = 0b1010; // Clock = FOSC/8
-
 
39
//    else if (speed == SPI2_FOSC_16)
-
 
40
//        SSP2CON1bits.SSPM = 0b0001; // Clock = FOSC/16
-
 
41
//    else
-
 
42
//        SSP2CON1bits.SSPM = 0b0010; // Clock = FOSC/64
-
 
43
 
35
 
44
    SSP2CON1bits.CKP = 1; // Idle state for clock is a high level
36
    SSP2CON1bits.CKP = 1; // Idle state for clock is a high level
45
    SSP2CON1bits.SSPEN = 1; // Enable MSSP module
37
    SSP2CON1bits.SSPEN = 1; // Enable MSSP module
46
 
38
 
47
#ifdef SPI2_USE_INTERRUPT
39
#ifdef SPI2_USE_INTERRUPT
Line 77... Line 69...
77
            // Put next byte in SSP2BUF for transmit
69
            // Put next byte in SSP2BUF for transmit
78
            if (spi_data_p->buffer_out_ind != spi_data_p->buffer_out_len) {
70
            if (spi_data_p->buffer_out_ind != spi_data_p->buffer_out_len) {
79
                SSP2BUF = spi_data_p->buffer_out[spi_data_p->buffer_out_ind];
71
                SSP2BUF = spi_data_p->buffer_out[spi_data_p->buffer_out_ind];
80
                spi_data_p->buffer_out_ind++;
72
                spi_data_p->buffer_out_ind++;
81
            } else {
73
            } else {
82
                LATBbits.LATB2 = 1; // Bring SS line high
74
                SPI_SLAVE_SELECT_LAT = 1; // Bring SS line high
83
                spi_data_p->buffer_out_ind = 0;
75
                spi_data_p->buffer_out_ind = 0;
84
                spi_data_p->buffer_out_len = 0;
76
                spi_data_p->buffer_out_len = 0;
85
            }
77
            }
86
        }
78
        }
87
    }
79
    }
Line 93... Line 85...
93
    spi_data_p->buffer_out_len = length;
85
    spi_data_p->buffer_out_len = length;
94
    spi_data_p->buffer_out_ind = 1;
86
    spi_data_p->buffer_out_ind = 1;
95
    for (i = 0; i < length; i++) {
87
    for (i = 0; i < length; i++) {
96
        spi_data_p->buffer_out[i] = msg[i];
88
        spi_data_p->buffer_out[i] = msg[i];
97
    }
89
    }
98
    LATBbits.LATB7 = 0; // Bring SS line low
90
    SPI_SLAVE_SELECT_LAT = 0; // Bring SS line low
99
    SSP2BUF = spi_data_p->buffer_out[0]; // Transmit first byte
91
    SSP2BUF = spi_data_p->buffer_out[0]; // Transmit first byte
100
#else
92
#else
101
    unsigned int i = 0;
93
    unsigned int i = 0;
102
    unsigned char tmp = 0;
94
    unsigned char tmp = 0;
103
    LATBbits.LATB7 = 0;
95
    SPI_SLAVE_SELECT_LAT = 0;
104
    while (i != length) {
96
    while (i != length) {
105
        SSP2BUF = msg[i];
97
        SSP2BUF = msg[i];
106
        i++;
98
        i++;
107
        while (!SSP2STATbits.BF);
99
        while (!SSP2STATbits.BF);
108
 
100
 
Line 117... Line 109...
117
#else
109
#else
118
        // Read data in buffer to clear it
110
        // Read data in buffer to clear it
119
        tmp = SSP2BUF;
111
        tmp = SSP2BUF;
120
#endif
112
#endif
121
    }
113
    }
122
    LATBbits.LATB7 = 1;
114
    SPI_SLAVE_SELECT_LAT = 1;
123
#endif
115
#endif
124
}
116
}
125
 
117
 
126
void SPI2_Write_Repeat(unsigned char c, unsigned int length) {
118
void SPI2_Write_Repeat(unsigned char c, unsigned int length) {
127
#ifdef SPI2_USE_INTERRUPT
119
#ifdef SPI2_USE_INTERRUPT
128
    // TODO
120
    // TODO
129
#else
121
#else
130
    unsigned int i = 0;
122
    unsigned int i = 0;
131
    unsigned char tmp = 0;
123
    unsigned char tmp = 0;
132
    LATBbits.LATB7 = 0;
124
    SPI_SLAVE_SELECT_LAT = 0;
133
    while (i != length) {
125
    while (i != length) {
134
        SSP2BUF = c;
126
        SSP2BUF = c;
135
        i++;
127
        i++;
136
        while (!SSP2STATbits.BF);
128
        while (!SSP2STATbits.BF);
137
 
129
 
Line 146... Line 138...
146
#else
138
#else
147
        // Read data in buffer to clear it
139
        // Read data in buffer to clear it
148
        tmp = SSP2BUF;
140
        tmp = SSP2BUF;
149
#endif
141
#endif
150
    }
142
    }
151
    LATBbits.LATB7 = 1;
143
    SPI_SLAVE_SELECT_LAT = 1;
152
#endif
144
#endif
153
}
145
}
154
 
146
 
155
void SPI2_Read(unsigned char length) {
147
void SPI2_Read(unsigned char length) {
156
#ifdef SPI2_USE_INTERRUPT
148
#ifdef SPI2_USE_INTERRUPT
Line 158... Line 150...
158
    spi_data_p->buffer_out_len = length;
150
    spi_data_p->buffer_out_len = length;
159
    spi_data_p->buffer_out_ind = 1;
151
    spi_data_p->buffer_out_ind = 1;
160
    for (i = 0; i < length; i++) {
152
    for (i = 0; i < length; i++) {
161
        spi_data_p->buffer_out[i] = 0x0;
153
        spi_data_p->buffer_out[i] = 0x0;
162
    }
154
    }
163
    LATBbits.LATB7 = 0; // Bring SS line low
155
    SPI_SLAVE_SELECT_LAT = 0; // Bring SS line low
164
    SSP2BUF = spi_data_p->buffer_out[0]; // Transmit first byte
156
    SSP2BUF = spi_data_p->buffer_out[0]; // Transmit first byte
165
#else
157
#else
166
    unsigned char i = 0;
158
    unsigned char i = 0;
167
    LATBbits.LATB7 = 0;
159
    SPI_SLAVE_SELECT_LAT = 0;
168
 
160
 
169
    for (i = 0; i < length; i++) {
161
    for (i = 0; i < length; i++) {
170
        SSP2BUF = 0x0;
162
        SSP2BUF = 0x0;
171
        while (!SSP2STATbits.BF);
163
        while (!SSP2STATbits.BF);
172
 
164
 
Line 176... Line 168...
176
        } else {
168
        } else {
177
            spi_data_p->buffer_in_write_ind++;
169
            spi_data_p->buffer_in_write_ind++;
178
        }
170
        }
179
        spi_data_p->buffer_in_len++;
171
        spi_data_p->buffer_in_len++;
180
    }
172
    }
181
    LATBbits.LATB7 = 1;
173
    SPI_SLAVE_SELECT_LAT = 1;
182
#endif
174
#endif
183
}
175
}
184
 
176
 
185
unsigned char SPI2_Buffer_Len() {
177
unsigned char SPI2_Buffer_Len() {
186
    return spi_data_p->buffer_in_len;
178
    return spi_data_p->buffer_in_len;