Merge pull request #146 from adafruit/spi_bitbang_mode3
Spi bitbang mode3
This commit is contained in:
commit
fccaf61a79
|
|
@ -2,6 +2,24 @@
|
||||||
|
|
||||||
// #define DEBUG_SERIAL Serial
|
// #define DEBUG_SERIAL Serial
|
||||||
|
|
||||||
|
#ifdef BUSIO_USE_FAST_PINIO
|
||||||
|
#define BUSIO_SET_CLOCK_LOW() (*clkPort = *clkPort & ~clkPinMask)
|
||||||
|
#define BUSIO_SET_CLOCK_HIGH() (*clkPort = *clkPort | clkPinMask)
|
||||||
|
#define BUSIO_READ_MISO() (*misoPort & misoPinMask)
|
||||||
|
#define BUSIO_WRITE_MOSI(value) \
|
||||||
|
do { \
|
||||||
|
if (value) \
|
||||||
|
*mosiPort = *mosiPort | mosiPinMask; \
|
||||||
|
else \
|
||||||
|
*mosiPort = *mosiPort & ~mosiPinMask; \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define BUSIO_SET_CLOCK_LOW() digitalWrite(_sck, LOW)
|
||||||
|
#define BUSIO_SET_CLOCK_HIGH() digitalWrite(_sck, HIGH)
|
||||||
|
#define BUSIO_READ_MISO() digitalRead(_miso)
|
||||||
|
#define BUSIO_WRITE_MOSI(value) digitalWrite(_mosi, value)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* @brief Create an SPI device with the given CS pin and settings
|
* @brief Create an SPI device with the given CS pin and settings
|
||||||
* @param cspin The arduino pin number to use for chip select
|
* @param cspin The arduino pin number to use for chip select
|
||||||
|
|
@ -181,84 +199,70 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) {
|
||||||
if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) {
|
if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) {
|
||||||
towrite = send & b;
|
towrite = send & b;
|
||||||
if ((_mosi != -1) && (lastmosi != towrite)) {
|
if ((_mosi != -1) && (lastmosi != towrite)) {
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
BUSIO_WRITE_MOSI(towrite);
|
||||||
if (towrite)
|
|
||||||
*mosiPort = *mosiPort | mosiPinMask;
|
|
||||||
else
|
|
||||||
*mosiPort = *mosiPort & ~mosiPinMask;
|
|
||||||
#else
|
|
||||||
digitalWrite(_mosi, towrite);
|
|
||||||
#endif
|
|
||||||
lastmosi = towrite;
|
lastmosi = towrite;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
BUSIO_SET_CLOCK_HIGH();
|
||||||
*clkPort = *clkPort | clkPinMask; // Clock high
|
|
||||||
#else
|
|
||||||
digitalWrite(_sck, HIGH);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (bitdelay_us) {
|
if (bitdelay_us) {
|
||||||
delayMicroseconds(bitdelay_us);
|
delayMicroseconds(bitdelay_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_miso != -1) {
|
if (_miso != -1) {
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
if (BUSIO_READ_MISO())
|
||||||
if (*misoPort & misoPinMask) {
|
reply |= b;
|
||||||
#else
|
}
|
||||||
if (digitalRead(_miso)) {
|
|
||||||
#endif
|
BUSIO_SET_CLOCK_LOW();
|
||||||
|
|
||||||
|
} else if (_dataMode == SPI_MODE3) {
|
||||||
|
|
||||||
|
if (_mosi != -1) { // transmit on falling edge
|
||||||
|
BUSIO_WRITE_MOSI(send & b);
|
||||||
|
}
|
||||||
|
|
||||||
|
BUSIO_SET_CLOCK_LOW();
|
||||||
|
|
||||||
|
if (bitdelay_us) {
|
||||||
|
delayMicroseconds(bitdelay_us);
|
||||||
|
}
|
||||||
|
|
||||||
|
BUSIO_SET_CLOCK_HIGH();
|
||||||
|
|
||||||
|
if (bitdelay_us) {
|
||||||
|
delayMicroseconds(bitdelay_us);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_miso != -1) { // read on rising edge
|
||||||
|
if (BUSIO_READ_MISO()) {
|
||||||
reply |= b;
|
reply |= b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
} else { // || _dataMode == SPI_MODE1)
|
||||||
*clkPort = *clkPort & ~clkPinMask; // Clock low
|
|
||||||
#else
|
|
||||||
digitalWrite(_sck, LOW);
|
|
||||||
#endif
|
|
||||||
} else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3)
|
|
||||||
|
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
BUSIO_SET_CLOCK_HIGH();
|
||||||
*clkPort = *clkPort | clkPinMask; // Clock high
|
|
||||||
#else
|
|
||||||
digitalWrite(_sck, HIGH);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (bitdelay_us) {
|
if (bitdelay_us) {
|
||||||
delayMicroseconds(bitdelay_us);
|
delayMicroseconds(bitdelay_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_mosi != -1) {
|
if (_mosi != -1) {
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
BUSIO_WRITE_MOSI(send & b);
|
||||||
if (send & b)
|
|
||||||
*mosiPort = *mosiPort | mosiPinMask;
|
|
||||||
else
|
|
||||||
*mosiPort = *mosiPort & ~mosiPinMask;
|
|
||||||
#else
|
|
||||||
digitalWrite(_mosi, send & b);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
BUSIO_SET_CLOCK_LOW();
|
||||||
*clkPort = *clkPort & ~clkPinMask; // Clock low
|
|
||||||
#else
|
|
||||||
digitalWrite(_sck, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (_miso != -1) {
|
if (_miso != -1) {
|
||||||
#ifdef BUSIO_USE_FAST_PINIO
|
if (BUSIO_READ_MISO()) {
|
||||||
if (*misoPort & misoPinMask) {
|
|
||||||
#else
|
|
||||||
if (digitalRead(_miso)) {
|
|
||||||
#endif
|
|
||||||
reply |= b;
|
reply |= b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_miso != -1) {
|
}
|
||||||
buffer[i] = reply;
|
if (_miso != -1) {
|
||||||
}
|
buffer[i] = reply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue