|
|
|
|
|
|
|
|
//pinMode(10, OUTPUT); |
|
|
//pinMode(10, OUTPUT); |
|
|
//digitalWriteFast(10, HIGH); |
|
|
//digitalWriteFast(10, HIGH); |
|
|
port->CR = LPSPI_CR_RST; |
|
|
port->CR = LPSPI_CR_RST; |
|
|
|
|
|
|
|
|
|
|
|
// Lets initialize the Transmit FIFO watermark to FIFO size - 1... |
|
|
|
|
|
// BUGBUG:: I assume queue of 16 for now... |
|
|
|
|
|
port->FCR = LPSPI_FCR_TXWATER(15); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
uint8_t SPIClass::pinIsChipSelect(uint8_t pin) |
|
|
uint8_t SPIClass::pinIsChipSelect(uint8_t pin) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SPIClass::transfer(const void * buf, void * retbuf, size_t count) |
|
|
void SPIClass::transfer(const void * buf, void * retbuf, size_t count) |
|
|
{ |
|
|
{ |
|
|
const uint8_t *tx = (const uint8_t *)buf; |
|
|
|
|
|
uint8_t *rx = (uint8_t *)retbuf; |
|
|
|
|
|
|
|
|
|
|
|
// inefficient, but simplest possible way to get started |
|
|
|
|
|
while (count > 0) { |
|
|
|
|
|
uint8_t b = 0; |
|
|
|
|
|
if (tx) b = *tx++; |
|
|
|
|
|
if (rx) { |
|
|
|
|
|
*rx++ = transfer(b); |
|
|
|
|
|
} else { |
|
|
|
|
|
transfer(b); |
|
|
|
|
|
} |
|
|
|
|
|
count--; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (count == 0) return; |
|
|
|
|
|
uint8_t *p_write = (uint8_t*)buf; |
|
|
|
|
|
uint8_t *p_read = (uint8_t*)retbuf; |
|
|
|
|
|
size_t count_read = count; |
|
|
|
|
|
|
|
|
|
|
|
// Pass 1 keep it simple and don't try packing 8 bits into 16 yet.. |
|
|
|
|
|
// Lets clear the reader queue |
|
|
|
|
|
//port->CR = LPSPI_CR_RRF; |
|
|
|
|
|
|
|
|
|
|
|
while (count > 0) { |
|
|
|
|
|
// Push out the next byte; |
|
|
|
|
|
port->TDR = p_write? *p_write++ : _transferWriteFill; |
|
|
|
|
|
count--; // how many bytes left to output. |
|
|
|
|
|
// Make sure queue is not full before pushing next byte out |
|
|
|
|
|
do { |
|
|
|
|
|
if ((port->RSR & LPSPI_RSR_RXEMPTY) == 0) { |
|
|
|
|
|
uint8_t b = port->RDR; // Read any pending RX bytes in |
|
|
|
|
|
if (p_read) *p_read++ = b; |
|
|
|
|
|
count_read--; |
|
|
|
|
|
} |
|
|
|
|
|
} while ((port->SR & LPSPI_SR_TDF) == 0) ; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// now lets wait for all of the read bytes to be returned... |
|
|
|
|
|
while (count_read) { |
|
|
|
|
|
if ((port->RSR & LPSPI_RSR_RXEMPTY) == 0) { |
|
|
|
|
|
uint8_t b = port->RDR; // Read any pending RX bytes in |
|
|
|
|
|
if (p_read) *p_read++ = b; |
|
|
|
|
|
count_read--; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|