spi_bitbang.c
Go to the documentation of this file.00001
00043 #include "spi_bitbang.h"
00044 #include "hw/hw_spi.h"
00045
00046 #include "cfg/cfg_spi_bitbang.h"
00047 #include <cfg/module.h>
00048
00049 #include <cpu/irq.h>
00050
00051 void spi_assertSS(void)
00052 {
00053 ATOMIC(SS_ACTIVE());
00054 }
00055
00056 void spi_deassertSS(void)
00057 {
00058 ATOMIC(SS_INACTIVE());
00059 }
00060
00065 uint8_t spi_sendRecv(uint8_t c)
00066 {
00067 uint8_t data = 0;
00068 uint8_t shift = SPI_DATAORDER_START;
00069
00070
00071 ATOMIC(
00072 for (int i = 0; i < 8; i++)
00073 {
00074
00075 if (c & shift)
00076 MOSI_HIGH();
00077 else
00078 MOSI_LOW();
00079
00080 SCK_ACTIVE();
00081 data |= IS_MISO_HIGH() ? shift : 0;
00082
00083 SCK_INACTIVE();
00084 SPI_DATAORDER_SHIFT(shift);
00085 }
00086 );
00087 return data;
00088 }
00089
00090 MOD_DEFINE(spi);
00091 void spi_init(void)
00092 {
00093 ATOMIC(SPI_HW_INIT());
00094 MOD_INIT(spi);
00095 }
00096
00100 void spi_read(void *_buff, size_t len)
00101 {
00102 uint8_t *buff = (uint8_t *)_buff;
00103
00104 while (len--)
00105
00106 *buff++ = spi_sendRecv(0);
00107
00108 }
00109
00113 void spi_write(const void *_buff, size_t len)
00114 {
00115 const uint8_t *buff = (const uint8_t *)_buff;
00116
00117 while (len--)
00118
00119 spi_sendRecv(*buff++);
00120
00121 }