#include "sms_spi.h" void spi_init(SPI *spi, Tristate *TH, Tristate *TR, EXCH spixfn) { spi->TH = TH; spi->TR = TR; spi->lastTH = *TH; spi->bitcnt = 0; spi->bit = false; spi->rx = 0; spi->tx = 0xff; spi->spixfn = spixfn; } byte spi_rd(SPI *spi) { return (byte)spi->bit; // return in bit 0 } void spi_pulse(SPI *spi) { if (*spi->TH != spi->lastTH) { spi->lastTH = *spi->TH; if (spi->lastTH == TRI_HIGH) { spi->rx <<= 1; if (*spi->TR == TRI_HIGH) { spi->rx++; } spi->bit = spi->tx >> 7; spi->tx <<= 1; spi->bitcnt++; if (spi->bitcnt == 8) { spi->tx = spi->spixfn(spi->rx); spi->bitcnt = 0; } } } }