diff options
| -rw-r--r-- | libmaple/spi.c | 28 | ||||
| -rw-r--r-- | libmaple/spi.h | 3 | ||||
| -rw-r--r-- | wirish/comm/HardwareSPI.cpp | 6 | ||||
| -rw-r--r-- | wirish/comm/HardwareSPI.h | 1 | 
4 files changed, 34 insertions, 4 deletions
| diff --git a/libmaple/spi.c b/libmaple/spi.c index ddc8346..4f34d1a 100644 --- a/libmaple/spi.c +++ b/libmaple/spi.c @@ -112,7 +112,7 @@ void spi_init(uint32 spi_num,   * @param spi_num which spi to send on   * @return data shifted back from the slave   */ -void spi_tx(uint32 spi_num, uint8 data) { +uint8 spi_tx_byte(uint32 spi_num, uint8 data) {     SPI *spi;     ASSERT(spi_num == 1 || spi_num == 2); @@ -121,8 +121,32 @@ void spi_tx(uint32 spi_num, uint8 data) {     spi->DR = data; -   while (!(spi->SR & SR_TXE) || (spi->SR & SR_BSY)) +   while (!(spi->SR & SR_TXE) || +           (spi->SR & SR_BSY))        ; + +   return spi->DR; +} + +uint8 spi_tx(uint32 spi_num, uint8 *buf, uint32 len) { +   SPI *spi; +   uint32 i; + +   ASSERT(spi_num == 1 || spi_num == 2); +   spi = (spi_num == 1) ? (SPI*)SPI1_BASE : (SPI*)SPI2_BASE; + +   if (!len) { +      return 0; +   } + +   while (i < len) { +      spi->DR = buf[len]; +      while (!(spi->SR & SR_TXE) || +              (spi->SR & SR_BSY)) +         ; +      i++; +   } +   return spi->DR;  }  static void spi_gpio_cfg(const spi_dev *dev) { diff --git a/libmaple/spi.h b/libmaple/spi.h index cde3b42..25c2c6b 100644 --- a/libmaple/spi.h +++ b/libmaple/spi.h @@ -96,7 +96,8 @@ void spi_init(uint32 spi_num,                uint32 prescale,                uint32 endian,                uint32 mode); -void spi_tx(uint32 spi_num, uint8 data); +uint8 spi_tx_byte(uint32 spi_num, uint8 data); +uint8 spi_tx(uint32 spi_num, uint8 *buf, uint32 len);  static inline uint8 spi_rx(uint32 spi_num) {     SPI *spi; diff --git a/wirish/comm/HardwareSPI.cpp b/wirish/comm/HardwareSPI.cpp index e083ac1..4379a0d 100644 --- a/wirish/comm/HardwareSPI.cpp +++ b/wirish/comm/HardwareSPI.cpp @@ -119,7 +119,11 @@ void HardwareSPI::begin(void) {   * @param data byte to send   */  void HardwareSPI::send(uint8 data) { -   spi_tx(this->spi_num, data); +   spi_tx_byte(this->spi_num, data); +} + +void HardwareSPI::send(uint8 *buf, uint32 len) { +   spi_tx(this->spi_num, buf, len);  } diff --git a/wirish/comm/HardwareSPI.h b/wirish/comm/HardwareSPI.h index b974334..04d67ba 100644 --- a/wirish/comm/HardwareSPI.h +++ b/wirish/comm/HardwareSPI.h @@ -50,6 +50,7 @@ class HardwareSPI {        void begin(void);        void begin(SPIFrequency freq, uint32 endianness, uint32 mode);        void send(uint8 data); +      void send(uint8 *data, uint32 length);        uint8 recv(void);  }; | 
