afLib 1.3 which is supporting both SPI and UART

Dependencies:   vt100 mbed afLib_1_3

Revision:
0:87662653a3c6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/af_utils/mbedSPI.cpp	Mon Apr 23 06:15:26 2018 +0000
@@ -0,0 +1,215 @@
+#include "mbed.h"
+#include "afSPI.h"
+#include "mbedSPI.h"
+#include "afErrors.h"
+#include "msg_types.h"
+#include "vt100.h"
+extern vt100 *tty ;
+
+#if defined (TARGET_KL25Z) || defined (TARGET_TEENSY3_1)
+ #ifndef SPI0_C1
+  #define SPI0_C1 (*(uint8_t *)0x40076000)
+ #endif
+#endif
+
+mbedSPI::mbedSPI(PinName mosi, PinName miso, PinName sckl, PinName cs) :
+    _spi(mosi, miso, sckl), _cs(cs, 1)
+{
+    _spi.format(8, 0) ;
+    _spi.frequency(1000000) ; /* 1MHz */
+
+#if defined (TARGET_KL25Z) || defined (TARGET_TEENSY3_1)
+    #ifndef SPI0_C1
+        #define SPI0_C1 (*(uint8_t *)0x40076000)
+    #endif
+//    SPI0_C1 |= 0x01 ; /* LSB First */
+//    SPI0_C1 &= 0xFE ; /* MSB First */
+#endif
+
+}
+
+void mbedSPI::begin(void)
+{
+}
+
+void mbedSPI::beginSPI(void)
+{
+    _cs = 0 ;
+    SPI0_C1 |= 0x01 ; /* LSB First */
+    wait_us(8) ;
+}
+
+void mbedSPI::endSPI(void)
+{
+    _cs = 1 ;
+    SPI0_C1 &= 0xFE ; /* MSB First */
+    wait_us(1) ;
+    // SPI.endTransaction() // in the original code
+}
+
+/**
+ * on 17-Jan-2018 disable/enable irq added
+ * before and after of each _spi.writes
+ */
+void mbedSPI::transfer(char *bytes, int len)
+{
+    int i ;
+    for (i = 0 ; i < len ; i++ ) {
+        __disable_irq() ; // Disable Interrupts
+        bytes[i] = _spi.write(bytes[i]) ;
+        __enable_irq() ; // Enable Interrupts
+    }
+}
+
+void mbedSPI::checkForInterrupt(volatile int *interrupts_pending, bool idle)
+{
+    // Nothing required here.
+}
+
+int  mbedSPI::exchangeStatus(StatusCommand *tx, StatusCommand *rx)
+{
+    int         result = afSUCCESS ;
+    uint16_t    len = tx->getSize() ;
+    int         *bytes ;
+    char        *rbytes ;
+    int         index = 0 ;
+    bytes = new int[len] ;
+    rbytes = new char[len + 1] ;
+    tx->getBytes(bytes) ;
+    
+    beginSPI() ;
+    for (int i = 0 ; i < len ; i++ ) {
+        rbytes[i] = bytes[i] ;
+    }
+    rbytes[len] = tx->getChecksum() ;
+    transfer(rbytes, len + 1) ;
+    
+    uint8_t cmd = bytes[index++] ;
+    if (cmd != SYNC_REQUEST && cmd != SYNC_ACK) {
+        tty->printf("exchangeStatus bad cmd: %02X\n", cmd) ;
+        result = afERROR_INVALID_COMMAND ;
+    }
+    
+    rx->setBytesToSend(rbytes[index + 0] | (rbytes[index + 1] << 8)) ;
+    rx->setBytesToRecv(rbytes[index + 2] | (rbytes[index + 3] << 8)) ;
+    rx->setChecksum(rbytes[index | 4]);
+    
+    endSPI() ;
+
+    delete [] bytes ;
+    delete [] rbytes ;    
+    return result ;
+}
+
+int  mbedSPI::writeStatus(StatusCommand *c)
+{
+    int         result = afSUCCESS ;
+    uint16_t    len = c->getSize() ;
+    int         *bytes ;
+    char         *rbytes ;
+    int         index = 0 ;
+    bytes = new int[len] ;
+    rbytes = new char[len+1] ;
+    c->getBytes(bytes) ;
+    
+    beginSPI() ;
+    
+    for (int i = 0 ; i < len ; i++ ) {
+        rbytes[i] = bytes[i] ;
+    }
+    rbytes[len] = c->getChecksum() ;
+    transfer(rbytes, len + 1) ;
+    
+    uint8_t cmd = rbytes[index++] ;
+    if (cmd != SYNC_REQUEST && cmd != SYNC_ACK) {
+        tty->printf("writeStatus bad cmd: %02X\n", cmd) ;
+        result = afERROR_INVALID_COMMAND ;
+    }
+    
+    endSPI() ;
+    
+    delete [] rbytes ;
+    delete [] bytes ;
+    
+    return result ;
+}
+
+void mbedSPI::sendBytes(char *bytes, int len)
+{
+    beginSPI() ;
+    
+    transfer(bytes, len) ;
+
+    endSPI() ;
+}
+
+void mbedSPI::recvBytes(char *bytes, int len)
+{
+    beginSPI() ;
+    
+    transfer(bytes, len) ;
+
+    endSPI() ;
+}
+
+void mbedSPI::sendBytesOffset(char *bytes, uint16_t *bytesToSend, uint16_t *offset)
+{
+    uint16_t len = 0;
+
+    len = *bytesToSend > SPI_FRAME_LEN ? SPI_FRAME_LEN : *bytesToSend;
+
+    char *buffer ;
+    buffer = new char[len] ;
+    memset(buffer, 0xff, sizeof(buffer));
+
+    memcpy(buffer, &bytes[*offset], len);
+
+    sendBytes(buffer, len);
+
+    *offset += len;
+    *bytesToSend -= len;
+    
+    delete [] buffer ;
+}
+
+#if 1
+void mbedSPI::recvBytesOffset(char **bytes, uint16_t *bytesLen, uint16_t *bytesToRecv, uint16_t *offset)
+{
+    uint16_t len = 0;
+
+    len = *bytesToRecv > SPI_FRAME_LEN ? SPI_FRAME_LEN : *bytesToRecv;
+
+    if (*offset == 0) {
+        *bytesLen = *bytesToRecv;
+        *bytes = new char[*bytesLen];
+    }
+
+    char *start = *bytes + *offset;
+
+    recvBytes(start, len);
+
+    *offset += len;
+    *bytesToRecv -= len;
+}
+#endif
+
+#if 0
+void mbedSPI::recvBytesOffset(char *bytes, uint16_t *bytesLen, uint16_t *bytesToRecv, uint16_t *offset)
+{
+    uint16_t len = 0;
+
+    len = *bytesToRecv > SPI_FRAME_LEN ? SPI_FRAME_LEN : *bytesToRecv;
+
+    if (*offset == 0) {
+        *bytesLen = *bytesToRecv;
+//        *bytes = new char[*bytesLen];
+    }
+
+    char *start = bytes + *offset;
+
+    recvBytes(start, len);
+
+    *offset += len;
+    *bytesToRecv -= len;
+}
+#endif
\ No newline at end of file