|  |  | @@ -1715,6 +1715,87 @@ void SPIClass::transfer(const void * buf, void * retbuf, size_t count) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void SPIClass::transfer16(const void * buf, void * retbuf, size_t count) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (count == 0) return; | 
		
	
		
			
			|  |  |  | uint16_t *p_write = (uint16_t*)buf; | 
		
	
		
			
			|  |  |  | uint16_t *p_read = (uint16_t*)retbuf; | 
		
	
		
			
			|  |  |  | size_t count_read = count; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | uint32_t tcr = port().TCR; | 
		
	
		
			
			|  |  |  | port().TCR = (tcr & 0xfffff000) | LPSPI_TCR_FRAMESZ(15);  // turn on 16 bit mode | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Lets clear the reader queue | 
		
	
		
			
			|  |  |  | port().CR = LPSPI_CR_RRF | LPSPI_CR_MEN;    // clear the queue and make sure still enabled. | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 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)  { | 
		
	
		
			
			|  |  |  | uint16_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)  { | 
		
	
		
			
			|  |  |  | uint16_t b = port().RDR;  // Read any pending RX bytes in | 
		
	
		
			
			|  |  |  | if (p_read) *p_read++ = b; | 
		
	
		
			
			|  |  |  | count_read--; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | port().TCR = tcr;    // restore back | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void SPIClass::transfer32(const void * buf, void * retbuf, size_t count) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (count == 0) return; | 
		
	
		
			
			|  |  |  | uint32_t *p_write = (uint32_t*)buf; | 
		
	
		
			
			|  |  |  | uint32_t *p_read = (uint32_t*)retbuf; | 
		
	
		
			
			|  |  |  | size_t count_read = count; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | uint32_t tcr = port().TCR; | 
		
	
		
			
			|  |  |  | port().TCR = (tcr & 0xfffff000) | LPSPI_TCR_FRAMESZ(31);  // turn on 32 bit mode | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Lets clear the reader queue | 
		
	
		
			
			|  |  |  | port().CR = LPSPI_CR_RRF | LPSPI_CR_MEN;    // clear the queue and make sure still enabled. | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | while (count > 0) { | 
		
	
		
			
			|  |  |  | // Push out the next byte; | 
		
	
		
			
			|  |  |  | port().TDR = p_write? ((*p_write) << 16) | ((*p_write) >> 16) : _transferWriteFill; | 
		
	
		
			
			|  |  |  | p_write++; | 
		
	
		
			
			|  |  |  | 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)  { | 
		
	
		
			
			|  |  |  | uint32_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)  { | 
		
	
		
			
			|  |  |  | uint32_t b = port().RDR;  // Read any pending RX bytes in | 
		
	
		
			
			|  |  |  | if (p_read) *p_read++ = b; | 
		
	
		
			
			|  |  |  | count_read--; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | port().TCR = tcr;    // restore back | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void SPIClass::end() { | 
		
	
		
			
			|  |  |  | // only do something if we have begun |