aboutsummaryrefslogtreecommitdiff
path: root/spi.c
diff options
context:
space:
mode:
authorCamil Staps2017-01-31 23:15:28 +0100
committerCamil Staps2017-01-31 23:15:28 +0100
commit631204a1feffa8cf3795060370b14dfb9f53f533 (patch)
tree001d32e0157127607f7c088881f098c2eca841a1 /spi.c
Diffstat (limited to 'spi.c')
-rw-r--r--spi.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/spi.c b/spi.c
new file mode 100644
index 0000000..f20f732
--- /dev/null
+++ b/spi.c
@@ -0,0 +1,61 @@
+#include <xc.h>
+#include "spi.h"
+
+void spi_init(void) {
+ SSPSTAT = 0x40;
+ SSPCON1 = 0x2a;
+ SSPADD = 39; // 200 kHz @ 32MHz
+
+ SPI_SDI = 0;
+ SPI_SCK = 0;
+ SPI_SDO = 0;
+
+ SPI_SDI_TRIS = 1;
+ SPI_SCK_TRIS = 0;
+ SPI_SDO_TRIS = 0;
+
+ SSPCLKPPS = SPI_SCK_PPS_IN;
+ SSPDATPPS = SPI_SDI_PPS;
+
+ SPI_SCK_PPS_OUT = 0x21;
+ SPI_SDO_PPS = 0x23;
+}
+
+uint8_t spi_exchange(uint8_t data) {
+ SSPCON1bits.WCOL = 0;
+ SSPBUF = data;
+ while (!SSPSTATbits.BF);
+ return SSPBUF;
+}
+
+uint8_t spi_exchange_buffer(uint8_t *in, uint8_t buflen, uint8_t *out) {
+ uint8_t written = 0;
+
+ if (buflen != 0) {
+ if (in != NULL) {
+ while (written < buflen) {
+ if (out == NULL)
+ spi_exchange(in[written]);
+ else
+ out[written] = spi_exchange(in[written]);
+ written++;
+ }
+ } else if (out != NULL)
+ while (written < buflen)
+ out[written++] = spi_exchange(DUMMY_DATA);
+ }
+
+ return written;
+}
+
+inline bool spi_is_buffer_full(void) {
+ return SSPSTATbits.BF;
+}
+
+inline bool spi_has_write_collision_occured(void) {
+ return SSPCON1bits.WCOL;
+}
+
+inline void spi_clear_write_collision_status(void) {
+ SSPCON1bits.WCOL = 0;
+}