Test program running on MAX32625MBED. Control through USB Serial commands using a terminal emulator such as teraterm or putty.

Dependencies:   MaximTinyTester CmdLine MAX541 USBDevice

Revision:
76:0397493d7baf
Parent:
75:0900a57f2e5d
Child:
77:3a6e2a5cd7d9
--- a/MAX11043/MAX11043.cpp	Sun Feb 23 12:34:49 2020 +0000
+++ b/MAX11043/MAX11043.cpp	Mon Feb 24 08:11:55 2020 +0000
@@ -48,6 +48,23 @@
 #define MAX11043_EOC_INTERRUPT_POLLING 0
 #endif // MAX11043_EOC_INTERRUPT_POLLING
 //--------------------------------------------------
+// SPI is not interrupt-safe, so use EventQueue to defer execution to user context.
+#ifndef MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#define MAX11043_EOC_INTERRUPT_EVENTQUEUE 1
+#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#if MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#if MAX11043_EOC_INTERRUPT_EVENTQUEUE
+// SPI is not interrupt-safe, so use EventQueue to defer execution to user context.
+#include "mbed_events.h"
+#define MYONEOCTHREADEVENTFLAG_ENABLE_SPI (1UL << 0)
+EventFlags myOnEOCThread_event_flags;
+Thread myOnEOCThread;
+extern void myOnEOCThread_handler();
+#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+//--------------------------------------------------
 // Diagnostic: Use MAX32625MBED pin D5 as DigitalOut EOC#-detected
 #ifndef MAX11043_ScopeTrigger_MAX32625MBED_D5
 #define MAX11043_ScopeTrigger_MAX32625MBED_D5 1
@@ -225,6 +242,12 @@
     //
     // EOC Event Output from device
 // MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion
+#if MAX11043_EOC_INTERRUPT_EVENTQUEUE
+    // SPI is not interrupt-safe, so use EventQueue to defer execution to user context.
+    myOnEOCThread.start(myOnEOCThread_handler);
+#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+// MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion
 #if MAX11043_EOC_INTERRUPT_POLLING
 // MAX11043 EOC End Of Conversion input should be InterruptIn(PinName:EOC_pin).fall(onEOCFallingEdge);
 // Workaround using DigitalIn(PinName:EOC_pin) polled to sync with EOC falling edge for ADC reads
@@ -238,8 +261,41 @@
     // interruptEOC.fall(&onEOCFallingEdge);
     EOC_pin.fall(&onEOCFallingEdge);
 #endif // MAX11043_EOC_INTERRUPT_POLLING
+}
 
+// MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion
+// SPI is not interrupt-safe, so use EventQueue to defer execution to user context.
+#if MAX11043_EOC_INTERRUPT_EVENTQUEUE
+void myOnEOCThread_handler()
+{
+    while (true) {
+        //signal_wait(int32_t signals, uint32_t millisec=osWaitForever)
+        //flags_read = myOnEOCThread_event_flags.wait_any(MYONEOCTHREADEVENTFLAG_ENABLE_SPI);
+        // myOnEOCThread_event_flags.wait_any(MYONEOCTHREADEVENTFLAG_ENABLE_SPI, osWaitForever, false); // clear=false: don't auto clear the flag
+        myOnEOCThread_event_flags.wait_any(MYONEOCTHREADEVENTFLAG_ENABLE_SPI, osWaitForever, true); // clear=true: auto clear the flag
+        //
+        extern MAX11043 g_MAX11043_device;
+#if MAX11043_ScopeTrigger_MAX32625MBED_D5
+// Diagnostic: Use MAX32625MBED pin D5 as DigitalOut EOC#-detected
+        digitalInOut5.write(0); // ScopeTrigger
+        digitalInOut5.write(1); // ScopeTrigger
+        digitalInOut5.write(0); // ScopeTrigger
+        digitalInOut5.write(1); // ScopeTrigger
+#endif // MAX11043_ScopeTrigger_MAX32625MBED_D5
+        extern SPI spi; // declared in Test_Main_MAX11043.cpp
+        spi.write((char*)mosiData_onEOCFallingEdge, byteCount_onEOCFallingEdge, (char*)misoData_onEOCFallingEdge, byteCount_onEOCFallingEdge);
+        // TODO1: update adca
+        //g_MAX11043_device.adca = (misoData_onEOCFallingEdge[1] << 8) | misoData_onEOCFallingEdge[2];
+        // TODO1: update adcb
+        //g_MAX11043_device.adcb = (misoData_onEOCFallingEdge[3] << 8) | misoData_onEOCFallingEdge[4];
+        // TODO1: update adcc
+        //g_MAX11043_device.adcc = (misoData_onEOCFallingEdge[5] << 8) | misoData_onEOCFallingEdge[6];
+        // TODO1: update adcd
+        //g_MAX11043_device.adcd = (misoData_onEOCFallingEdge[7] << 8) | misoData_onEOCFallingEdge[8];
+    }
 }
+#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE
 
 // MAX11043 ADC Read operations must be synchronized to EOC End Of Conversion
 #if MAX11043_EOC_INTERRUPT_POLLING
@@ -261,7 +317,12 @@
     digitalInOut5.write(1); // ScopeTrigger
 #endif // MAX11043_ScopeTrigger_MAX32625MBED_D5
 #endif
-#if 1
+#if MAX11043_EOC_INTERRUPT_EVENTQUEUE
+    // SPI is not interrupt-safe, so use EventQueue to defer execution to user context.
+    myOnEOCThread_event_flags.set(MYONEOCTHREADEVENTFLAG_ENABLE_SPI);
+#else // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#endif // MAX11043_EOC_INTERRUPT_EVENTQUEUE
+#if 0
     // TODO: read 4 channels in response to EOC# falling edge
     //     WIP MAX11043 interrupt CRASH on Menu item HH CONVRUN High
     //
@@ -316,7 +377,7 @@
         //g_MAX11043_device.adcd = (misoData_onEOCFallingEdge[7] << 8) | misoData_onEOCFallingEdge[8];
     //}
 #endif
-#if MAX11043_ScopeTrigger_MAX32625MBED_D5
+#if 0 // MAX11043_ScopeTrigger_MAX32625MBED_D5
 // Diagnostic: Use MAX32625MBED pin D5 as DigitalOut EOC#-detected
     digitalInOut5.write(0); // ScopeTrigger
     digitalInOut5.write(1); // ScopeTrigger