| @@ -328,11 +328,13 @@ uint8_t SPIClass::setCS(uint8_t pin) | |||
| } | |||
| void SPIClass::transfer(void *buf, size_t count) { | |||
| void SPIClass::transfer(void *buf, size_t count) | |||
| { | |||
| if (count == 0) return; | |||
| uint8_t *p_write = (uint8_t *)buf; | |||
| uint8_t *p_read = p_write; | |||
| size_t count_read = count; | |||
| bool lsbfirst = (SPI0_CTAR0 & SPI_CTAR_LSBFE) ? true : false; | |||
| // Lets clear the reader queue | |||
| SPI0_MCR = SPI_MCR_MSTR | SPI_MCR_CLR_RXF | SPI_MCR_PCSIS(0x1F); | |||
| @@ -349,10 +351,10 @@ void SPIClass::transfer(void *buf, size_t count) { | |||
| } | |||
| while (count > 0) { | |||
| // Push out the next byte; | |||
| uint16_t w = (*p_write++) << 8; | |||
| uint16_t w = (*p_write++) << 8; | |||
| w |= *p_write++; | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| if (count == 2) | |||
| KINETISK_SPI0.PUSHR = w | SPI_PUSHR_CTAS(1); | |||
| else | |||
| @@ -367,13 +369,13 @@ void SPIClass::transfer(void *buf, size_t count) { | |||
| *p_read++ = w; // Read any pending RX bytes in | |||
| count_read--; | |||
| } else { | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| *p_read++ = w >> 8; | |||
| *p_read++ = (w & 0xff); | |||
| count_read -= 2; | |||
| } | |||
| } | |||
| } while ((sr & (15 << 12)) > (3 << 12)); | |||
| } | |||
| // now lets wait for all of the read bytes to be returned... | |||
| @@ -385,6 +387,7 @@ void SPIClass::transfer(void *buf, size_t count) { | |||
| *p_read++ = w; // Read any pending RX bytes in | |||
| count_read--; | |||
| } else { | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| *p_read++ = w >> 8; | |||
| *p_read++ = (w & 0xff); | |||
| count_read -= 2; | |||
| @@ -533,11 +536,13 @@ uint8_t SPI1Class::setCS(uint8_t pin) | |||
| return 0; | |||
| } | |||
| void SPI1Class::transfer(void *buf, size_t count) { | |||
| void SPI1Class::transfer(void *buf, size_t count) | |||
| { | |||
| if (count == 0) return; | |||
| uint8_t *p_write = (uint8_t *)buf; | |||
| uint8_t *p_read = p_write; | |||
| size_t count_read = count; | |||
| bool lsbfirst = (SPI1_CTAR0 & SPI_CTAR_LSBFE) ? true : false; | |||
| // Lets clear the reader queue | |||
| SPI1_MCR = SPI_MCR_MSTR | SPI_MCR_CLR_RXF | SPI_MCR_PCSIS(0x1F); | |||
| @@ -551,10 +556,10 @@ void SPI1Class::transfer(void *buf, size_t count) { | |||
| } | |||
| while (count > 0) { | |||
| // Push out the next byte; | |||
| uint16_t w = (*p_write++) << 8; | |||
| uint16_t w = (*p_write++) << 8; | |||
| w |= *p_write++; | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| KINETISK_SPI1.PUSHR = w | SPI_PUSHR_CTAS(1); | |||
| count -= 2; // how many bytes to output. | |||
| // Make sure queue is not full before pushing next byte out | |||
| @@ -566,13 +571,13 @@ void SPI1Class::transfer(void *buf, size_t count) { | |||
| *p_read++ = w; // Read any pending RX bytes in | |||
| count_read--; | |||
| } else { | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| *p_read++ = w >> 8; | |||
| *p_read++ = (w & 0xff); | |||
| count_read -= 2; | |||
| } | |||
| } | |||
| } while ((sr & (15 << 12)) > (0 << 12)); // SPI1 and 2 only have 1 item queue | |||
| } | |||
| // now lets wait for all of the read bytes to be returned... | |||
| @@ -584,6 +589,7 @@ void SPI1Class::transfer(void *buf, size_t count) { | |||
| *p_read++ = w; // Read any pending RX bytes in | |||
| count_read--; | |||
| } else { | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| *p_read++ = w >> 8; | |||
| *p_read++ = (w & 0xff); | |||
| count_read -= 2; | |||
| @@ -723,11 +729,13 @@ uint8_t SPI2Class::setCS(uint8_t pin) | |||
| return 0; | |||
| } | |||
| void SPI2Class::transfer(void *buf, size_t count) { | |||
| void SPI2Class::transfer(void *buf, size_t count) | |||
| { | |||
| if (count == 0) return; | |||
| uint8_t *p_write = (uint8_t *)buf; | |||
| uint8_t *p_read = p_write; | |||
| size_t count_read = count; | |||
| bool lsbfirst = (SPI2_CTAR0 & SPI_CTAR_LSBFE) ? true : false; | |||
| // Lets clear the reader queue | |||
| SPI2_MCR = SPI_MCR_MSTR | SPI_MCR_CLR_RXF | SPI_MCR_PCSIS(0x1F); | |||
| @@ -741,10 +749,10 @@ void SPI2Class::transfer(void *buf, size_t count) { | |||
| } | |||
| while (count > 0) { | |||
| // Push out the next byte; | |||
| uint16_t w = (*p_write++) << 8; | |||
| uint16_t w = (*p_write++) << 8; | |||
| w |= *p_write++; | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| KINETISK_SPI2.PUSHR = w | SPI_PUSHR_CTAS(1); | |||
| count -= 2; // how many bytes to output. | |||
| // Make sure queue is not full before pushing next byte out | |||
| @@ -756,13 +764,13 @@ void SPI2Class::transfer(void *buf, size_t count) { | |||
| *p_read++ = w; // Read any pending RX bytes in | |||
| count_read--; | |||
| } else { | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| *p_read++ = w >> 8; | |||
| *p_read++ = (w & 0xff); | |||
| count_read -= 2; | |||
| } | |||
| } | |||
| } while ((sr & (15 << 12)) > (0 << 12)); // SPI2 and 2 only have 1 item queue | |||
| } | |||
| // now lets wait for all of the read bytes to be returned... | |||
| @@ -774,6 +782,7 @@ void SPI2Class::transfer(void *buf, size_t count) { | |||
| *p_read++ = w; // Read any pending RX bytes in | |||
| count_read--; | |||
| } else { | |||
| if (lsbfirst) w = __builtin_bswap16(w); | |||
| *p_read++ = w >> 8; | |||
| *p_read++ = (w & 0xff); | |||
| count_read -= 2; | |||