Subversion Repositories Code-Repo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
121 Kevin 1
#include "maindefs.h"
2
#include "spi.h"
3
 
4
static SPI_DATA spi_data;
5
 
6
void SPI2_Init(unsigned char speed) {
7
    // Set up SPI2 with specified pins
8
    RPINR22 = 7; // SPI2 CLK Input  (Pin RB4)
9
    RPOR7 = 11; // SPI2 CLK Output (Pin RB4)
10
#ifndef SPI2_WRITE_ONLY
11
    RPINR21 = 6; // SPI2 Data Input (Pin RB3)
12
#endif
13
    RPOR5 = 10; // SPI2 Data Output   (MOSI) (Pin RB2)
14
 
15
    TRISBbits.TRISB4 = 0; // SPI2 clock pin       (Pin RB4)
16
#ifndef SPI2_WRITE_ONLY
17
    TRISBbits.TRISB3 = 1; // SPI2 data in pin     (Pin RB3)(MISO)
18
#endif
19
    TRISBbits.TRISB2 = 0; // SPI2 data out pin    (Pin RB2)(MOSI)
20
 
21
    TRISBbits.TRISB7 = 0; // SPI2 slave select    (Pin RB7)
22
    LATBbits.LATB7 = 1; // SPI2 SS high (Idle)
23
 
24
    TRISBbits.TRISB6 = 0; // SPI2 reset   (Pin RB6)
25
    LATBbits.LATB6 = 1; // SPI2 reset active low
26
 
27
    TRISBbits.TRISB5 = 0; // SPI2 D/C select (Pin RB5)
28
    LATBbits.LATB5 = 0;
29
 
30
    SSP2STATbits.SMP = 0; // Input is sampled in the middle of data output time
31
    SSP2STATbits.CKE = 0; // Transmit occurs on transition from Idle to active clock state
32
 
123 Kevin 33
    SSP2CON1bits.SSPM = speed;
34
//    if (speed == SPI2_FOSC_4)
35
//        SSP2CON1bits.SSPM = 0b0000; // Clock = FOSC/4
36
//    else if (speed == SPI2_FOSC_8)
37
//        SSP2CON1bits.SSPM = 0b1010; // Clock = FOSC/8
38
//    else if (speed == SPI2_FOSC_16)
39
//        SSP2CON1bits.SSPM = 0b0001; // Clock = FOSC/16
40
//    else
41
//        SSP2CON1bits.SSPM = 0b0010; // Clock = FOSC/64
121 Kevin 42
 
43
    SSP2CON1bits.CKP = 1; // Idle state for clock is a high level
44
    SSP2CON1bits.SSPEN = 1; // Enable MSSP module
45
 
46
#ifdef SPI2_USE_INTERRUPT
47
    PIE3bits.SSP2IE = 1; // Enable MSSP2 interrupt
48
#else
49
    PIE3bits.SSP2IE = 0;
50
#endif
51
 
52
    spi_data.buffer_in_len = 0;
53
    spi_data.buffer_in_read_ind = 0;
54
    spi_data.buffer_in_write_ind = 0;
55
    spi_data.buffer_out_ind = 0;
56
    spi_data.buffer_out_len = 0;
57
}
58
 
59
void SPI2_Recv_Interrupt_Handler() {
60
    unsigned char c;
61
 
62
    if (SSP2STATbits.BF) { // Check if data receive flag is set
63
        if (spi_data.buffer_in_len == MAXSPIBUF - 1) {
122 Kevin 64
            DBG_PRINT_SPI("SPI2: (ERROR) buffer overflow\r\n");
121 Kevin 65
            c = SSP2BUF; // Read SSP2BUF to clear it
66
        } else {
67
            // Save received data into buffer
68
            spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
69
            if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
70
                spi_data.buffer_in_write_ind = 0;
71
            } else {
72
                spi_data.buffer_in_write_ind++;
73
            }
74
            spi_data.buffer_in_len++;
75
 
76
            // Put next byte in SSP2BUF for transmit
77
            if (spi_data.buffer_out_ind != spi_data.buffer_out_len) {
78
                SSP2BUF = spi_data.buffer_out[spi_data.buffer_out_ind];
79
                spi_data.buffer_out_ind++;
80
            } else {
81
                LATBbits.LATB2 = 1; // Bring SS line high
82
                spi_data.buffer_out_ind = 0;
83
                spi_data.buffer_out_len = 0;
84
            }
85
        }
86
    }
87
}
88
 
89
void SPI2_Write(unsigned char *msg, unsigned int length) {
90
#ifdef SPI2_USE_INTERRUPT
91
    unsigned char i;
92
    spi_data.buffer_out_len = length;
93
    spi_data.buffer_out_ind = 1;
94
    for (i = 0; i < length; i++) {
95
        spi_data.buffer_out[i] = msg[i];
96
    }
97
    LATBbits.LATB7 = 0; // Bring SS line low
98
    SSP2BUF = spi_data.buffer_out[0]; // Transmit first byte
99
#else
100
    unsigned int i = 0;
101
    unsigned char tmp = 0;
102
    LATBbits.LATB7 = 0;
103
    while (i != length) {
104
        SSP2BUF = msg[i];
105
        i++;
106
        while (!SSP2STATbits.BF);
107
 
108
#ifndef SPI2_WRITE_ONLY
109
        spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
110
        if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
111
            spi_data.buffer_in_write_ind = 0;
112
        } else {
113
            spi_data.buffer_in_write_ind++;
114
        }
115
        spi_data.buffer_in_len++;
116
#else
117
        // Read data in buffer to clear it
118
        tmp = SSP2BUF;
119
#endif
120
    }
121
    LATBbits.LATB7 = 1;
122
#endif
123
}
124
 
125
void SPI2_Write_Repeat(unsigned char c, unsigned int length) {
126
#ifdef SPI2_USE_INTERRUPT
127
    // TODO
128
#else
129
    unsigned int i = 0;
130
    unsigned char tmp = 0;
131
    LATBbits.LATB7 = 0;
132
    while (i != length) {
133
        SSP2BUF = c;
134
        i++;
135
        while (!SSP2STATbits.BF);
136
 
137
#ifndef SPI2_WRITE_ONLY
138
        spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
139
        if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
140
            spi_data.buffer_in_write_ind = 0;
141
        } else {
142
            spi_data.buffer_in_write_ind++;
143
        }
144
        spi_data.buffer_in_len++;
145
#else
146
        // Read data in buffer to clear it
147
        tmp = SSP2BUF;
148
#endif
149
    }
150
    LATBbits.LATB7 = 1;
151
#endif
152
}
153
 
154
void SPI2_Read(unsigned char length) {
155
#ifdef SPI2_USE_INTERRUPT
156
    unsigned char i;
157
    spi_data.buffer_out_len = length;
158
    spi_data.buffer_out_ind = 1;
159
    for (i = 0; i < length; i++) {
160
        spi_data.buffer_out[i] = 0x0;
161
    }
162
    LATBbits.LATB7 = 0; // Bring SS line low
163
    SSP2BUF = spi_data.buffer_out[0]; // Transmit first byte
164
#else
165
    unsigned char i = 0;
166
    LATBbits.LATB7 = 0;
167
 
168
    for (i = 0; i < length; i++) {
169
        SSP2BUF = 0x0;
170
        while (!SSP2STATbits.BF);
171
 
172
        spi_data.buffer_in[spi_data.buffer_in_write_ind] = SSP2BUF;
173
        if (spi_data.buffer_in_write_ind == MAXSPIBUF - 1) {
174
            spi_data.buffer_in_write_ind = 0;
175
        } else {
176
            spi_data.buffer_in_write_ind++;
177
        }
178
        spi_data.buffer_in_len++;
179
    }
180
    LATBbits.LATB7 = 1;
181
#endif
182
}
183
 
184
unsigned char SPI2_Buffer_Len() {
185
    return spi_data.buffer_in_len;
186
}
187
 
188
unsigned char SPI2_Buffer_Read(unsigned char* buffer) {
189
    unsigned char i = 0;
190
    while (spi_data.buffer_in_len != 0) {
191
        buffer[i] = spi_data.buffer_in[spi_data.buffer_in_read_ind];
192
        i++;
193
        if (spi_data.buffer_in_read_ind == MAXSPIBUF - 1) {
194
            spi_data.buffer_in_read_ind = 0;
195
        } else {
196
            spi_data.buffer_in_read_ind++;
197
        }
198
        spi_data.buffer_in_len--;
199
    }
200
    return i;
201
}