Subversion Repositories Code-Repo

Rev

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

Rev 129 Rev 147
Line 1... Line 1...
1
#include "maindefs.h"
1
#include "defines.h"
2
#include "spi.h"
2
#include "spi.h"
3
 
3
 
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 = PPS_SPI2_CLK_IN; // SPI2 CLK Input  (Pin RB4)
9
    RPINR22 = PPS_SPI2_CLK_IN; // SPI2 CLK Input
10
    PPS_SPI2_CLK_OUT = 11; // SPI2 CLK Output (Pin RB4)
10
    PPS_SPI2_CLK_OUT = 11; // SPI2 CLK Output
11
#ifndef SPI2_WRITE_ONLY
-
 
12
    RPINR21 = PPS_SPI2_MISO; // SPI2 Data Input (Pin RB3)
-
 
13
#endif
-
 
14
    PPS_SPI2_MOSI = 10; // SPI2 Data Output   (MOSI) (Pin RB2)
-
 
15
 
11
 
16
    SPI_CLK_TRIS = 0; // SPI2 clock pin       (Pin RB4)
-
 
17
#ifndef SPI2_WRITE_ONLY
12
#ifndef SPI2_WRITE_ONLY
-
 
13
    RPINR21 = PPS_SPI2_MISO; // SPI2 Data Input
18
    SPI_MISO_TRIS = 1; // SPI2 data in pin     (Pin RB3)(MISO)
14
    SPI_MISO_TRIS = 1; // SPI2 data in pin (MISO)
19
#endif
15
#endif
-
 
16
    
-
 
17
    SPI_CLK_TRIS = 0; // SPI2 clock pin
-
 
18
    PPS_SPI2_MOSI = 10; // SPI2 Data Output (MOSI)
20
    SPI_MOSI_TRIS = 0; // SPI2 data out pin    (Pin RB2)(MOSI)
19
    SPI_MOSI_TRIS = 0; // SPI2 data out pin (MOSI)
21
 
20
 
22
    SPI_SLAVE_SELECT_TRIS = 0; // SPI2 slave select    (Pin RB7)
21
    SPI_SLAVE_SELECT_TRIS = 0; // SPI2 slave select
23
    SPI_SLAVE_SELECT_LAT = 1; // SPI2 SS high (Idle)
22
    SPI_SLAVE_SELECT_LAT = 1; // SPI2 SS high (Idle)
24
 
23
 
25
    SPI_RESET_TRIS = 0; // SPI2 reset   (Pin RB6)
24
    SPI_RESET_TRIS = 0; // SPI2 reset
26
    SPI_RESET_LAT = 1; // SPI2 reset active low
25
    SPI_RESET_LAT = 1; // SPI2 reset active low
27
 
26
 
28
    SPI_DC_SELECT_TRIS = 0; // SPI2 D/C select (Pin RB5)
27
    SPI_DC_SELECT_TRIS = 0; // SPI2 D/C select
29
    SPI_DC_SELECT_LAT = 0;
28
    SPI_DC_SELECT_LAT = 0;
30
 
29
 
31
    SSP2STATbits.SMP = 0; // Input is sampled in the middle of data output time
30
    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
31
    SSP2STATbits.CKE = 0; // Transmit occurs on transition from Idle to active clock state
33
 
32
 
Line 40... Line 39...
40
    PIE3bits.SSP2IE = 1; // Enable MSSP2 interrupt
39
    PIE3bits.SSP2IE = 1; // Enable MSSP2 interrupt
41
#else
40
#else
42
    PIE3bits.SSP2IE = 0;
41
    PIE3bits.SSP2IE = 0;
43
#endif
42
#endif
44
 
43
 
-
 
44
#ifndef SPI2_WRITE_ONLY
45
    spi_data_p->buffer_in_len = 0;
45
    spi_data_p->buffer_in_len = 0;
46
    spi_data_p->buffer_in_read_ind = 0;
46
    spi_data_p->buffer_in_read_ind = 0;
47
    spi_data_p->buffer_in_write_ind = 0;
47
    spi_data_p->buffer_in_write_ind = 0;
-
 
48
#endif
48
    spi_data_p->buffer_out_ind = 0;
49
    spi_data_p->buffer_out_ind = 0;
49
    spi_data_p->buffer_out_len = 0;
50
    spi_data_p->buffer_out_len = 0;
50
}
51
}
51
 
52
 
52
void SPI2_Recv_Interrupt_Handler() {
-
 
53
    unsigned char c;
-
 
54
 
-
 
55
    if (SSP2STATbits.BF) { // Check if data receive flag is set
-
 
56
        if (spi_data_p->buffer_in_len == MAXSPIBUF - 1) {
-
 
57
            DBG_PRINT_SPI("SPI2: (ERROR) buffer overflow\r\n");
-
 
58
            c = SSP2BUF; // Read SSP2BUF to clear it
-
 
59
        } else {
-
 
60
            // Save received data into buffer
-
 
61
            spi_data_p->buffer_in[spi_data_p->buffer_in_write_ind] = SSP2BUF;
-
 
62
            if (spi_data_p->buffer_in_write_ind == MAXSPIBUF - 1) {
-
 
63
                spi_data_p->buffer_in_write_ind = 0;
-
 
64
            } else {
-
 
65
                spi_data_p->buffer_in_write_ind++;
-
 
66
            }
-
 
67
            spi_data_p->buffer_in_len++;
-
 
68
 
-
 
69
            // Put next byte in SSP2BUF for transmit
-
 
70
            if (spi_data_p->buffer_out_ind != spi_data_p->buffer_out_len) {
-
 
71
                SSP2BUF = spi_data_p->buffer_out[spi_data_p->buffer_out_ind];
-
 
72
                spi_data_p->buffer_out_ind++;
-
 
73
            } else {
-
 
74
                SPI_SLAVE_SELECT_LAT = 1; // Bring SS line high
-
 
75
                spi_data_p->buffer_out_ind = 0;
-
 
76
                spi_data_p->buffer_out_len = 0;
-
 
77
            }
-
 
78
        }
-
 
79
    }
-
 
80
}
-
 
81
 
-
 
82
void SPI2_Write(unsigned char *msg, unsigned int length) {
53
void SPI2_Write(unsigned char *msg, unsigned int length) {
83
#ifdef SPI2_USE_INTERRUPT
54
#ifdef SPI2_USE_INTERRUPT
84
    unsigned char i;
55
    unsigned char i;
85
    spi_data_p->buffer_out_len = length;
56
    spi_data_p->buffer_out_len = length;
86
    spi_data_p->buffer_out_ind = 1;
57
    spi_data_p->buffer_out_ind = 1;
Line 115... Line 86...
115
#endif
86
#endif
116
}
87
}
117
 
88
 
118
void SPI2_Write_Repeat(unsigned char c, unsigned int length) {
89
void SPI2_Write_Repeat(unsigned char c, unsigned int length) {
119
#ifdef SPI2_USE_INTERRUPT
90
#ifdef SPI2_USE_INTERRUPT
120
    // TODO
91
    // TODO Implement interrupts for SPI2
121
#else
92
#else
122
    unsigned int i = 0;
93
    unsigned int i = 0;
123
    unsigned char tmp = 0;
94
    unsigned char tmp = 0;
124
    SPI_SLAVE_SELECT_LAT = 0;
95
    SPI_SLAVE_SELECT_LAT = 0;
125
    while (i != length) {
96
    while (i != length) {
Line 142... Line 113...
142
    }
113
    }
143
    SPI_SLAVE_SELECT_LAT = 1;
114
    SPI_SLAVE_SELECT_LAT = 1;
144
#endif
115
#endif
145
}
116
}
146
 
117
 
-
 
118
#ifndef SPI2_WRITE_ONLY
-
 
119
void SPI2_Recv_Interrupt_Handler() {
-
 
120
    unsigned char c;
-
 
121
 
-
 
122
    if (SSP2STATbits.BF) { // Check if data receive flag is set
-
 
123
        if (spi_data_p->buffer_in_len == MAXSPIBUF - 1) {
-
 
124
            DBG_PRINT_SPI("SPI2: (ERROR) buffer overflow\r\n");
-
 
125
            c = SSP2BUF; // Read SSP2BUF to clear it
-
 
126
        } else {
-
 
127
            // Save received data into buffer
-
 
128
            spi_data_p->buffer_in[spi_data_p->buffer_in_write_ind] = SSP2BUF;
-
 
129
            if (spi_data_p->buffer_in_write_ind == MAXSPIBUF - 1) {
-
 
130
                spi_data_p->buffer_in_write_ind = 0;
-
 
131
            } else {
-
 
132
                spi_data_p->buffer_in_write_ind++;
-
 
133
            }
-
 
134
            spi_data_p->buffer_in_len++;
-
 
135
 
-
 
136
            // Put next byte in SSP2BUF for transmit
-
 
137
            if (spi_data_p->buffer_out_ind != spi_data_p->buffer_out_len) {
-
 
138
                SSP2BUF = spi_data_p->buffer_out[spi_data_p->buffer_out_ind];
-
 
139
                spi_data_p->buffer_out_ind++;
-
 
140
            } else {
-
 
141
                SPI_SLAVE_SELECT_LAT = 1; // Bring SS line high
-
 
142
                spi_data_p->buffer_out_ind = 0;
-
 
143
                spi_data_p->buffer_out_len = 0;
-
 
144
            }
-
 
145
        }
-
 
146
    }
-
 
147
}
-
 
148
 
147
void SPI2_Read(unsigned char length) {
149
void SPI2_Read(unsigned char length) {
148
#ifdef SPI2_USE_INTERRUPT
150
#ifdef SPI2_USE_INTERRUPT
149
    unsigned char i;
151
    unsigned char i;
150
    spi_data_p->buffer_out_len = length;
152
    spi_data_p->buffer_out_len = length;
151
    spi_data_p->buffer_out_ind = 1;
153
    spi_data_p->buffer_out_ind = 1;
Line 189... Line 191...
189
            spi_data_p->buffer_in_read_ind++;
191
            spi_data_p->buffer_in_read_ind++;
190
        }
192
        }
191
        spi_data_p->buffer_in_len--;
193
        spi_data_p->buffer_in_len--;
192
    }
194
    }
193
    return i;
195
    return i;
194
}
-
 
195
196
}
-
 
197
#endif
-
 
198