Dump SPI from input to pc.serial
Revision 0:1ca47c273d0f, committed 2012-01-30
- Comitter:
- cbayley
- Date:
- Mon Jan 30 23:08:52 2012 +0000
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MODSERIAL.lib Mon Jan 30 23:08:52 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/AjK/code/MODSERIAL/#af2af4c61c2f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MySPI/MySPI.c Mon Jan 30 23:08:52 2012 +0000
@@ -0,0 +1,8 @@
+#include "mbed.h"
+#include "MySPI.h"
+
+void MySPI::puts(char *s)
+{
+ while (*s)
+ this->write(*s++);
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MySPI/MySPI.h Mon Jan 30 23:08:52 2012 +0000
@@ -0,0 +1,13 @@
+#include "mbed.h"
+
+#ifndef MY_SPI_H
+#define MY_SPI_H
+
+class MySPI : public SPI
+{
+public:
+ void puts(char * s);
+ //void putc(char c);
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Jan 30 23:08:52 2012 +0000
@@ -0,0 +1,66 @@
+// Relay bytes received as SPI slave to PC-USB-Serial
+
+#include "mbed.h"
+#include "MODSERIAL.h"
+
+//SPISlave slave(p5, NC, p7, p8);
+SPISlave slave(p11, NC, p13, p14);
+MODSERIAL pc(USBTX,NC,1024,0);
+//Serial pc(USBTX,NC);
+DigitalOut ledTX(LED1);
+DigitalOut ledRX(LED2);
+DigitalOut ledOV(LED4);
+Timeout toRXLed;
+
+
+#define fSPI (5000000)
+#define BAUD (115200)
+
+
+void offRXLed(void)
+{
+ ledRX = 0;
+}
+
+void onRX(void)
+{
+ ledRX = 1;
+ toRXLed.attach(offRXLed,0.1);
+}
+
+// This function is called when a character goes from the TX buffer
+// to the Uart THR FIFO register.
+void txCallback(MODSERIAL_IRQ_INFO *q) {
+ ledTX = 1;
+}
+
+// This function is called when TX buffer goes empty
+void txEmpty(MODSERIAL_IRQ_INFO *q) {
+ ledTX = 0;
+}
+
+// This function is called when TX buffer is Overrun
+void txOVR(MODSERIAL_IRQ_INFO *q) {
+ ledOV = 1;
+}
+
+
+int main()
+{
+ pc.baud(BAUD);
+ slave.frequency(fSPI);
+ pc.attach(&txEmpty, MODSERIAL::TxEmpty);
+ pc.attach(&txCallback, MODSERIAL::TxIrq);
+ pc.attach(&txOVR, MODSERIAL::TxOvIrq);
+
+ pc.printf("\n==== SPI 2 USB ready... ===\n");
+
+ while(1)
+ {
+ while ( !slave.receive() );
+ {
+ pc.putc( slave.read() ); // Read byte from master
+ onRX();
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Jan 30 23:08:52 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tinyQ.c Mon Jan 30 23:08:52 2012 +0000
@@ -0,0 +1,57 @@
+#include "string.h"
+#include "tinyQ.h"
+
+
+
+/**
+ * \brief Push an Accessibility Event onto our queue for sending to the iphone
+ * \param q pointer to our tinyQ_t
+ * \param c the Event to send to the iphone
+ * \return null if Q full, 1 on success
+ * \sa Qpop(), Qjump()
+ * \ingroup tinyQ
+ */
+int Qpush( tinyQ_t* q, char c )
+{
+ if ( q->fill == Q_SIZE )
+ return 0;
+
+ __disable_irq();
+ q->fill++;
+ q->data[q->head++] = c;
+ __enable_irq();
+
+ return 1;
+}
+
+
+/**
+ * \brief Pop an Accessibility Event off our queue for sending to the iphone
+ * \param q pointer to our tinyQ_t
+ * \param c pointer to receive the Event
+ * \return null if Q empty, 1 on success
+ * \sa Qpop(), Qjump()
+ * \ingroup tinyQ
+ */
+ int Qpop( tinyQ_t* q, char * c)
+{
+ if (! q->fill )
+ return 0;
+
+ __disable_irq();
+ q->fill--;
+ *c = q->data[q->tail++];
+ __enable_irq();
+
+ return 1;
+}
+
+int Qfree( tinyQ_t* q )
+{
+ return (Q_SIZE - q->fill);
+}
+
+void Qinit( tinyQ_t * q )
+{
+ memset( q, 0, sizeof(q) );
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tinyQ.h Mon Jan 30 23:08:52 2012 +0000
@@ -0,0 +1,44 @@
+/** \defgroup tinyQ Tiny Queue
+ * Tiny Queues implements a 4 byte queue for iPhone events with just 1 byte of management overhead.
+ * Head and Tail pointers both inherently wrap at the end of the buffer and no bounds checking is
+ * necesary IFF the buffer size is set as a power of 2 equal to the width of the pointers !!
+ * i.e head is 2 bits wide so the buffer must be 2^2 = 4 bytes deep.
+ * @{
+ */
+/** NOTE: Q_SIZE MUST be == 2 ^ widthof( tinyQ_t.head ) */
+#define Q_SIZE 256
+
+
+
+/** a tinyQ tracks a 4 byte queue with just 1 byte overhead */
+typedef struct
+{
+ unsigned int head:8; ///< the bit depth MUST be that power of 2 that is the Q_SIZE
+ unsigned int tail:8; ///< the bit depth MUST be that power of 2 that is the Q_SIZE
+ unsigned int fill:9; ///< Must be 1 bit bigger than the head and tail pointers
+ char data[Q_SIZE]; ///< NOTE: Q_SIZE MUST be == 2 ^ widthof( tinyQ_t.head )
+}tinyQ_t;
+
+
+/**
+ * \brief Push an Accessibility Event onto our queue for sending to the iphone
+ * \param q pointer to our tinyQ_t
+ * \param c the Event to send to the iphone
+ * \return null if Q full, 1 on success
+ * \sa Qpop(), Qjump()
+ * \ingroup tinyQ
+ */
+int Qpush( tinyQ_t* q, char c );
+
+/**
+ * \brief Pop an Accessibility Event off our queue for sending to the iphone
+ * \param q pointer to our tinyQ_t
+ * \param c pointer to receive the Event
+ * \return null if Q empty, 1 on success
+ * \sa Qpop(), Qjump()
+ * \ingroup tinyQ
+ */
+int Qpop( tinyQ_t* q, char * c);
+
+int Qfree( tinyQ_t* q );
+void Qinit( tinyQ_t* q );
\ No newline at end of file