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             /* Shift the i-th bit to MOSI */
00075             if (c & shift)
00076                 MOSI_HIGH();
00077             else
00078                 MOSI_LOW();
00079             /* Assert clock */
00080             SCK_ACTIVE();
00081             data |= IS_MISO_HIGH() ? shift : 0;
00082             /* De-assert clock */
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         /* Read byte from spi and put it in buffer. */
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         /* Write byte pointed at by *buff to spi */
00119         spi_sendRecv(*buff++);
00120 
00121 }