Final checkin for T4 support before hardware release

pull/9/head
Steve Lascos 6 years ago
parent 699242362c
commit 349f9f7f7b
  1. 4
      examples/Basic/BA1_TGA_Pro_NOMEM_demo/BA1_TGA_Pro_NOMEM_demo.ino
  2. 11
      examples/Basic/BA2_TGA_Pro_1MEM/BA2_TGA_Pro_1MEM.ino
  3. 14
      examples/Basic/BA3_TGA_Pro_2MEM/BA3_TGA_Pro_2MEM.ino
  4. 1
      examples/Delay/AnalogDelayDemo/AnalogDelayDemo.ino
  5. 6
      examples/Delay/AnalogDelayDemoExpansion/AnalogDelayDemoExpansion.ino
  6. 9
      examples/Delay/ExternalDelayDemo/ExternalDelayDemo.ino
  7. 5
      examples/Delay/SoundOnSoundDemo/SoundOnSoundDemo.ino
  8. 6
      examples/Delay/SoundOnSoundExpansionDemo/SoundOnSoundExpansionDemo.ino
  9. 1
      examples/Modulation/TemoloDemo/TemoloDemo.ino
  10. 4
      examples/Modulation/TremoloDemoExpansion/TremoloDemoExpansion.ino
  11. 2
      examples/Tests/BaudrateTest/BaudrateTest.ino
  12. 25
      examples/Tests/DMA_MEM0_test/DMA_MEM0_test.ino
  13. 24
      examples/Tests/DMA_MEM1_test/DMA_MEM1_test.ino
  14. 7
      examples/Tests/TGA_PRO_MEM2_EXP/PhysicalControls.cpp
  15. 19
      examples/Tests/TGA_PRO_MEM2_EXP/TGA_PRO_MEM2_EXP.ino
  16. 5
      examples/Tests/TGA_PRO_MEM2_EXP/UartTest.cpp
  17. 10
      examples/Tests/TGA_PRO_MEM2_EXP/spiTest.cpp
  18. 10
      src/BAAudioEffectDelayExternal.h
  19. 5
      src/BASpiMemory.h
  20. 42
      src/effects/AudioEffectDelayExternal.cpp
  21. 1
      src/peripherals/BASpiMemory.cpp

@ -8,8 +8,6 @@
* This demo will provide an audio passthrough, as well as exercise the * This demo will provide an audio passthrough, as well as exercise the
* MIDI interface. * MIDI interface.
* *
* It can optionally exercise the SPI MEM0 if installed on the TGA Pro board.
*
*/ */
#include <Wire.h> #include <Wire.h>
#include <Audio.h> #include <Audio.h>
@ -37,6 +35,7 @@ void setup() {
MIDI.begin(MIDI_CHANNEL_OMNI); MIDI.begin(MIDI_CHANNEL_OMNI);
Serial.begin(57600); Serial.begin(57600);
delay(5); delay(5);
while (!Serial) { yield(); }
// If the codec was already powered up (due to reboot) power itd own first // If the codec was already powered up (due to reboot) power itd own first
codecControl.disable(); codecControl.disable();
@ -105,4 +104,3 @@ void loop() {
gpio.toggleLed(); gpio.toggleLed();
} }

@ -38,7 +38,7 @@ BASpiMemory spiMem0(SpiDeviceId::SPI_DEVICE0);
unsigned long t=0; unsigned long t=0;
// SPI stuff // SPI stuff
int spiAddress0 = 0; unsigned spiAddress0 = 0;
uint16_t spiData0 = 0xABCD; uint16_t spiData0 = 0xABCD;
int spiErrorCount0 = 0; int spiErrorCount0 = 0;
@ -52,9 +52,11 @@ void setup() {
MIDI.begin(MIDI_CHANNEL_OMNI); MIDI.begin(MIDI_CHANNEL_OMNI);
Serial.begin(57600); Serial.begin(57600);
while (!Serial) {} while (!Serial) { yield(); }
delay(5); delay(5);
SPI_MEM0_1M(); // Set the Spi memory size to 1Mbit
// If the codec was already powered up (due to reboot) power itd own first // If the codec was already powered up (due to reboot) power itd own first
codecControl.disable(); codecControl.disable();
delay(100); delay(100);
@ -98,7 +100,7 @@ void loop() {
// Write test data to the SPI Memory 0 // Write test data to the SPI Memory 0
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
maskPhase = 0; maskPhase = 0;
for (spiAddress0=0; spiAddress0 <= SPI_MAX_ADDR; spiAddress0=spiAddress0+2) { for (spiAddress0=0; spiAddress0 <= BAHardwareConfig.getSpiMemMaxAddr(0); spiAddress0=spiAddress0+2) {
if ((spiAddress0 % 32768) == 0) { if ((spiAddress0 % 32768) == 0) {
//Serial.print("Writing to "); //Serial.print("Writing to ");
//Serial.println(spiAddress0, HEX); //Serial.println(spiAddress0, HEX);
@ -117,7 +119,7 @@ void loop() {
spiAddress0 = 0; spiAddress0 = 0;
maskPhase = 0; maskPhase = 0;
for (spiAddress0=0; spiAddress0 <= SPI_MAX_ADDR; spiAddress0=spiAddress0+2) { for (spiAddress0=0; spiAddress0 <= BAHardwareConfig.getSpiMemMaxAddr(0); spiAddress0=spiAddress0+2) {
if ((spiAddress0 % 32768) == 0) { if ((spiAddress0 % 32768) == 0) {
// Serial.print("Reading "); // Serial.print("Reading ");
// Serial.print(spiAddress0, HEX); // Serial.print(spiAddress0, HEX);
@ -205,4 +207,3 @@ void loop() {
gpio.toggleLed(); gpio.toggleLed();
} }

@ -57,8 +57,13 @@ void setup() {
MIDI.begin(MIDI_CHANNEL_OMNI); MIDI.begin(MIDI_CHANNEL_OMNI);
Serial.begin(57600); Serial.begin(57600);
while (!Serial) { yield(); }
delay(5); delay(5);
// Set the SPI memory sizes
SPI_MEM0_1M();
SPI_MEM1_1M();
// If the codec was already powered up (due to reboot) power itd own first // If the codec was already powered up (due to reboot) power itd own first
codecControl.disable(); codecControl.disable();
delay(100); delay(100);
@ -103,7 +108,7 @@ void loop() {
// Write test data to the SPI Memory 0 // Write test data to the SPI Memory 0
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
maskPhase = 0; maskPhase = 0;
for (spiAddress0=0; spiAddress0 <= SPI_MAX_ADDR; spiAddress0=spiAddress0+2) { for (spiAddress0=0; spiAddress0 <= BAHardwareConfig.getSpiMemMaxAddr(0); spiAddress0=spiAddress0+2) {
if ((spiAddress0 % 32768) == 0) { if ((spiAddress0 % 32768) == 0) {
//Serial.print("Writing to "); //Serial.print("Writing to ");
//Serial.println(spiAddress0, HEX); //Serial.println(spiAddress0, HEX);
@ -122,7 +127,7 @@ void loop() {
spiAddress0 = 0; spiAddress0 = 0;
maskPhase = 0; maskPhase = 0;
for (spiAddress0=0; spiAddress0 <= SPI_MAX_ADDR; spiAddress0=spiAddress0+2) { for (spiAddress0=0; spiAddress0 <= BAHardwareConfig.getSpiMemMaxAddr(0); spiAddress0=spiAddress0+2) {
if ((spiAddress0 % 32768) == 0) { if ((spiAddress0 % 32768) == 0) {
// Serial.print("Reading "); // Serial.print("Reading ");
// Serial.print(spiAddress0, HEX); // Serial.print(spiAddress0, HEX);
@ -159,7 +164,7 @@ void loop() {
// Write test data to the SPI Memory 1 // Write test data to the SPI Memory 1
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
maskPhase = 0; maskPhase = 0;
for (spiAddress1=0; spiAddress1 <= SPI_MAX_ADDR; spiAddress1+=2) { for (spiAddress1=0; spiAddress1 <= BAHardwareConfig.getSpiMemMaxAddr(1); spiAddress1+=2) {
if ((spiAddress1 % 32768) == 0) { if ((spiAddress1 % 32768) == 0) {
//Serial.print("Writing to "); //Serial.print("Writing to ");
//Serial.println(spiAddress1, HEX); //Serial.println(spiAddress1, HEX);
@ -178,7 +183,7 @@ void loop() {
spiAddress1 = 0; spiAddress1 = 0;
maskPhase = 0; maskPhase = 0;
for (spiAddress1=0; spiAddress1 <= SPI_MAX_ADDR; spiAddress1+=2) { for (spiAddress1=0; spiAddress1 <= BAHardwareConfig.getSpiMemMaxAddr(1); spiAddress1+=2) {
if ((spiAddress1 % 32768) == 0) { if ((spiAddress1 % 32768) == 0) {
//Serial.print("Reading "); //Serial.print("Reading ");
//Serial.print(spiAddress1, HEX); //Serial.print(spiAddress1, HEX);
@ -264,4 +269,3 @@ void loop() {
gpio.toggleLed(); gpio.toggleLed();
} }

@ -82,6 +82,7 @@ void setup() {
// If using external memory request request memory from the manager // If using external memory request request memory from the manager
// for the slot // for the slot
#ifdef USE_EXT #ifdef USE_EXT
SPI_MEM0_1M();
Serial.println("Using EXTERNAL memory"); Serial.println("Using EXTERNAL memory");
// We have to request memory be allocated to our slot. // We have to request memory be allocated to our slot.
externalSram.requestMemory(&delaySlot, 500.0f, MemSelect::MEM0, true); externalSram.requestMemory(&delaySlot, 500.0f, MemSelect::MEM0, true);

@ -22,9 +22,6 @@
* Using the Serial Montitor, send 'u' and 'd' characters to increase or decrease * Using the Serial Montitor, send 'u' and 'd' characters to increase or decrease
* the headphone volume between values of 0 and 9. * the headphone volume between values of 0 and 9.
*/ */
#define TGA_PRO_REVB // Set which hardware revision of the TGA Pro we're using
#define TGA_PRO_EXPAND_REV2 // pull in the pin definitions for the Blackaddr Audio Expansion Board.
#include "BALibrary.h" #include "BALibrary.h"
#include "BAEffects.h" #include "BAEffects.h"
@ -99,6 +96,9 @@ void setup() {
Serial.begin(57600); // Start the serial port Serial.begin(57600); // Start the serial port
delay(100); delay(100);
// Configure the hardware
SPI_MEM0_1M();
// Setup the controls. The return value is the handle to use when checking for control changes, etc. // Setup the controls. The return value is the handle to use when checking for control changes, etc.
// pushbuttons // pushbuttons
bypassHandle = controls.addSwitch(BA_EXPAND_SW1_PIN); // will be used for bypass control bypassHandle = controls.addSwitch(BA_EXPAND_SW1_PIN); // will be used for bypass control

@ -22,6 +22,7 @@ AudioInputI2S i2sIn;
AudioOutputI2S i2sOut; AudioOutputI2S i2sOut;
BAAudioControlWM8731 codecControl; BAAudioControlWM8731 codecControl;
//AudioEffectDelayExternal longDelay;
BAAudioEffectDelayExternal longDelay(MemSelect::MEM0); // comment this line to use MEM1 BAAudioEffectDelayExternal longDelay(MemSelect::MEM0); // comment this line to use MEM1
//BAAudioEffectDelayExternal longDelay(MemSelect::MEM1); // and uncomment this one to use MEM1 //BAAudioEffectDelayExternal longDelay(MemSelect::MEM1); // and uncomment this one to use MEM1
AudioMixer4 delayOutMixerA, delayOutMixerB, delayMixer; AudioMixer4 delayOutMixerA, delayOutMixerB, delayMixer;
@ -49,12 +50,16 @@ AudioConnection outputRight(delayMixer, 0, i2sOut, 1);
void setup() { void setup() {
Serial.begin(57600); Serial.begin(57600);
AudioMemory(128); while(!Serial) { yield(); }
AudioMemory(64);
delay(100); delay(500);
Serial.println(String("Starting...\n")); Serial.println(String("Starting...\n"));
delay(100); delay(100);
SPI_MEM0_1M(); // set the SPI MEM0 memory size
// SPI_MEM1_1M(); // set the MEM1 memory aize
Serial.println("Enabling codec...\n"); Serial.println("Enabling codec...\n");
codecControl.enable(); codecControl.enable();
delay(100); delay(100);

@ -101,13 +101,15 @@ delay(100);
AudioMemory(128); AudioMemory(128);
delay(5); delay(5);
SPI_MEM0_1M(); // Configure the SPI memory size
// Enable the codec // Enable the codec
Serial.println("Enabling codec...\n"); Serial.println("Enabling codec...\n");
codec.enable(); codec.enable();
delay(100); delay(100);
// We have to request memory be allocated to our slot. // We have to request memory be allocated to our slot.
externalSram.requestMemory(&delaySlot, SPI_MEM0_SIZE_BYTES, MemSelect::MEM0, true); externalSram.requestMemory(&delaySlot, BAHardwareConfig.getSpiMemSizeBytes(MemSelect::MEM0), MemSelect::MEM0, true);
//externalSram.requestMemory(&delaySlot, 50.0f, MemSelect::MEM0, true); //externalSram.requestMemory(&delaySlot, 50.0f, MemSelect::MEM0, true);
// Setup MIDI // Setup MIDI
@ -192,4 +194,3 @@ void loop() {
// } // }
} }

@ -100,6 +100,7 @@ delay(100);
delay(100); // wait a bit for serial to be available delay(100); // wait a bit for serial to be available
Serial.begin(57600); // Start the serial port Serial.begin(57600); // Start the serial port
delay(100); // wait a bit for serial to be available delay(100); // wait a bit for serial to be available
BAHardwareConfig.set(MemSelect::MEM0, SPI_MEMORY_1M);
// Setup the controls. The return value is the handle to use when checking for control changes, etc. // Setup the controls. The return value is the handle to use when checking for control changes, etc.
// pushbuttons // pushbuttons
@ -117,13 +118,15 @@ delay(100);
codec.disable(); codec.disable();
AudioMemory(128); AudioMemory(128);
SPI_MEM0_1M(); // set the Spi memory size
// Enable the codec // Enable the codec
Serial.println("Enabling codec...\n"); Serial.println("Enabling codec...\n");
codec.enable(); codec.enable();
codec.setHeadphoneVolume(1.0f); // Max headphone volume codec.setHeadphoneVolume(1.0f); // Max headphone volume
// We have to request memory be allocated to our slot. // We have to request memory be allocated to our slot.
externalSram.requestMemory(&delaySlot, SPI_MEM0_SIZE_BYTES, MemSelect::MEM0, true); externalSram.requestMemory(&delaySlot, BAHardwareConfig.getSpiMemSizeBytes(MemSelect::MEM0), MemSelect::MEM0, true);
// Configure the LED to indicate the gate status, this is controlled directly by SOS effect, not by // Configure the LED to indicate the gate status, this is controlled directly by SOS effect, not by
// by BAPhysicalControls // by BAPhysicalControls
@ -223,4 +226,3 @@ void loop() {
loopCount++; loopCount++;
} }

@ -31,7 +31,6 @@ BAAudioControlWM8731 codec;
// YOU MUST USE TEENSYDUINO 1.41 or greater // YOU MUST USE TEENSYDUINO 1.41 or greater
// YOU MUST COMPILE THIS DEMO USING Serial + Midi // YOU MUST COMPILE THIS DEMO USING Serial + Midi
//#define USE_EXT // uncomment this line to use External MEM0
#define MIDI_DEBUG // uncomment to see raw MIDI info in terminal #define MIDI_DEBUG // uncomment to see raw MIDI info in terminal
AudioEffectTremolo tremolo; AudioEffectTremolo tremolo;

@ -18,8 +18,6 @@
* Using the Serial Montitor, send 'u' and 'd' characters to increase or decrease * Using the Serial Montitor, send 'u' and 'd' characters to increase or decrease
* the headphone volume between values of 0 and 9. * the headphone volume between values of 0 and 9.
*/ */
#define TGA_PRO_REVB // Set which hardware revision of the TGA Pro we're using
#define TGA_PRO_EXPAND_REV2 // pull in the pin definitions for the Blackaddr Audio Expansion Board.
#include "BALibrary.h" #include "BALibrary.h"
#include "BAEffects.h" #include "BAEffects.h"
@ -76,6 +74,8 @@ void setup() {
Serial.begin(57600); // Start the serial port Serial.begin(57600); // Start the serial port
delay(100); delay(100);
TGA_PRO_EXPAND_REV2(); // Configure the expansion board revision
// Setup the controls. The return value is the handle to use when checking for control changes, etc. // Setup the controls. The return value is the handle to use when checking for control changes, etc.
// pushbuttons // pushbuttons
bypassHandle = controls.addSwitch(BA_EXPAND_SW1_PIN); // will be used for bypass control bypassHandle = controls.addSwitch(BA_EXPAND_SW1_PIN); // will be used for bypass control

@ -11,7 +11,7 @@
*/ */
constexpr unsigned LOW_RATE = 2400; constexpr unsigned LOW_RATE = 2400;
constexpr unsigned MIDI_RATE = 31250; constexpr unsigned MIDI_RATE = 31250;
constexpr unsigned HIGH_RATE = 250000; constexpr unsigned HIGH_RATE = 230400;
constexpr unsigned TEST_TIME = 5; // 5 second test each constexpr unsigned TEST_TIME = 5; // 5 second test each
unsigned baudRate = LOW_RATE; // start with low speed unsigned baudRate = LOW_RATE; // start with low speed

@ -55,14 +55,18 @@ bool compareBuffers16(uint16_t *a, uint16_t *b, size_t numWords)
return compareBuffers(reinterpret_cast<uint8_t *>(a), reinterpret_cast<uint8_t*>(b), sizeof(uint16_t)*numWords); return compareBuffers(reinterpret_cast<uint8_t *>(a), reinterpret_cast<uint8_t*>(b), sizeof(uint16_t)*numWords);
} }
constexpr size_t TEST_END = SPI_MAX_ADDR; size_t SPI_MAX_ADDR;
;
void setup() { void setup() {
Serial.begin(57600); Serial.begin(57600);
while (!Serial) {} while (!Serial) { yield(); }
delay(5); delay(5);
SPI_MEM0_1M();
SPI_MAX_ADDR = BAHardwareConfig.getSpiMemMaxAddr(MemSelect::MEM0);
Serial.println("Enabling SPI, testing MEM0"); Serial.println("Enabling SPI, testing MEM0");
spiMem0.begin(); spiMem0.begin();
} }
@ -82,7 +86,7 @@ bool spi8BitTest(void) {
Serial.println("\nStarting 8-bit test Write/Read"); Serial.println("\nStarting 8-bit test Write/Read");
while (spiPhase < 4) { while (spiPhase < 4) {
spiAddress = 0; spiAddress = 0;
while (spiAddress < TEST_END) { while (spiAddress <= SPI_MAX_ADDR) {
// fill the write data buffer // fill the write data buffer
switch (spiPhase) { switch (spiPhase) {
@ -117,7 +121,7 @@ bool spi8BitTest(void) {
// Read back the data using 8-bit transfers // Read back the data using 8-bit transfers
spiAddress = 0; spiAddress = 0;
while (spiAddress < TEST_END) { while (spiAddress <= SPI_MAX_ADDR) {
// generate the golden data // generate the golden data
switch (spiPhase) { switch (spiPhase) {
case 0 : case 0 :
@ -165,7 +169,7 @@ bool spi8BitTest(void) {
// Clear the memory // Clear the memory
spiAddress = 0; spiAddress = 0;
memset(src8, 0, DMA_SIZE); memset(src8, 0, DMA_SIZE);
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Send the DMA transfer // Send the DMA transfer
spiMem0.zero(spiAddress, DMA_SIZE); spiMem0.zero(spiAddress, DMA_SIZE);
// wait until write is done // wait until write is done
@ -175,7 +179,7 @@ bool spi8BitTest(void) {
// Check the memory is clear // Check the memory is clear
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Read back the DMA data // Read back the DMA data
spiMem0.read(spiAddress, dest8, DMA_SIZE); spiMem0.read(spiAddress, dest8, DMA_SIZE);
// wait until read is done // wait until read is done
@ -201,7 +205,7 @@ bool spi16BitTest(void) {
Serial.println("\nStarting 16-bit test"); Serial.println("\nStarting 16-bit test");
while (spiPhase < 4) { while (spiPhase < 4) {
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// fill the write data buffer // fill the write data buffer
switch (spiPhase) { switch (spiPhase) {
@ -236,7 +240,7 @@ bool spi16BitTest(void) {
// Read back the data using 8-bit transfers // Read back the data using 8-bit transfers
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// generate the golden data // generate the golden data
switch (spiPhase) { switch (spiPhase) {
case 0 : case 0 :
@ -283,7 +287,7 @@ bool spi16BitTest(void) {
// Clear the memory // Clear the memory
spiAddress = 0; spiAddress = 0;
memset(src16, 0, DMA_SIZE); memset(src16, 0, DMA_SIZE);
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Send the DMA transfer // Send the DMA transfer
spiMem0.zero16(spiAddress, NUM_DATA); spiMem0.zero16(spiAddress, NUM_DATA);
// wait until write is done // wait until write is done
@ -293,7 +297,7 @@ bool spi16BitTest(void) {
// Check the memory is clear // Check the memory is clear
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Read back the DMA data // Read back the DMA data
spiMem0.read16(spiAddress, dest16, NUM_DATA); spiMem0.read16(spiAddress, dest16, NUM_DATA);
// wait until read is done // wait until read is done
@ -313,4 +317,3 @@ void loop() {
while(true) {} while(true) {}
} }

@ -54,14 +54,17 @@ bool compareBuffers16(uint16_t *a, uint16_t *b, size_t numWords)
return compareBuffers(reinterpret_cast<uint8_t *>(a), reinterpret_cast<uint8_t*>(b), sizeof(uint16_t)*numWords); return compareBuffers(reinterpret_cast<uint8_t *>(a), reinterpret_cast<uint8_t*>(b), sizeof(uint16_t)*numWords);
} }
constexpr size_t TEST_END = SPI_MAX_ADDR; size_t SPI_MAX_ADDR = 0;
void setup() { void setup() {
Serial.begin(57600); Serial.begin(57600);
while (!Serial) {} while (!Serial) { yield(); }
delay(5); delay(5);
SPI_MEM1_1M();
SPI_MAX_ADDR = BAHardwareConfig.getSpiMemMaxAddr(MemSelect::MEM1);
Serial.println("Enabling SPI, testing MEM1"); Serial.println("Enabling SPI, testing MEM1");
spiMem1.begin(); spiMem1.begin();
} }
@ -81,7 +84,7 @@ bool spi8BitTest(void) {
Serial.println("\nStarting 8-bit test Write/Read"); Serial.println("\nStarting 8-bit test Write/Read");
while (spiPhase < 4) { while (spiPhase < 4) {
spiAddress = 0; spiAddress = 0;
while (spiAddress < TEST_END) { while (spiAddress <= SPI_MAX_ADDR) {
// fill the write data buffer // fill the write data buffer
switch (spiPhase) { switch (spiPhase) {
@ -116,7 +119,7 @@ bool spi8BitTest(void) {
// Read back the data using 8-bit transfers // Read back the data using 8-bit transfers
spiAddress = 0; spiAddress = 0;
while (spiAddress < TEST_END) { while (spiAddress <= SPI_MAX_ADDR) {
// generate the golden data // generate the golden data
switch (spiPhase) { switch (spiPhase) {
case 0 : case 0 :
@ -164,7 +167,7 @@ bool spi8BitTest(void) {
// Clear the memory // Clear the memory
spiAddress = 0; spiAddress = 0;
memset(src8, 0, DMA_SIZE); memset(src8, 0, DMA_SIZE);
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Send the DMA transfer // Send the DMA transfer
spiMem1.zero(spiAddress, DMA_SIZE); spiMem1.zero(spiAddress, DMA_SIZE);
// wait until write is done // wait until write is done
@ -174,7 +177,7 @@ bool spi8BitTest(void) {
// Check the memory is clear // Check the memory is clear
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Read back the DMA data // Read back the DMA data
spiMem1.read(spiAddress, dest8, DMA_SIZE); spiMem1.read(spiAddress, dest8, DMA_SIZE);
// wait until read is done // wait until read is done
@ -200,7 +203,7 @@ bool spi16BitTest(void) {
Serial.println("\nStarting 16-bit test"); Serial.println("\nStarting 16-bit test");
while (spiPhase < 4) { while (spiPhase < 4) {
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// fill the write data buffer // fill the write data buffer
switch (spiPhase) { switch (spiPhase) {
@ -235,7 +238,7 @@ bool spi16BitTest(void) {
// Read back the data using 8-bit transfers // Read back the data using 8-bit transfers
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// generate the golden data // generate the golden data
switch (spiPhase) { switch (spiPhase) {
case 0 : case 0 :
@ -282,7 +285,7 @@ bool spi16BitTest(void) {
// Clear the memory // Clear the memory
spiAddress = 0; spiAddress = 0;
memset(src16, 0, DMA_SIZE); memset(src16, 0, DMA_SIZE);
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Send the DMA transfer // Send the DMA transfer
spiMem1.zero16(spiAddress, NUM_DATA); spiMem1.zero16(spiAddress, NUM_DATA);
// wait until write is done // wait until write is done
@ -292,7 +295,7 @@ bool spi16BitTest(void) {
// Check the memory is clear // Check the memory is clear
spiAddress = 0; spiAddress = 0;
while (spiAddress < SPI_MAX_ADDR) { while (spiAddress <= SPI_MAX_ADDR) {
// Read back the DMA data // Read back the DMA data
spiMem1.read16(spiAddress, dest16, NUM_DATA); spiMem1.read16(spiAddress, dest16, NUM_DATA);
// wait until read is done // wait until read is done
@ -312,4 +315,3 @@ void loop() {
while(true) {} while(true) {}
} }

@ -3,8 +3,8 @@
#include "BALibrary.h" #include "BALibrary.h"
using namespace BALibrary; using namespace BALibrary;
constexpr int potCalibMin = 1; constexpr int potCalibMin = 8;
constexpr int potCalibMax = 1018; constexpr int potCalibMax = 1016;
constexpr bool potSwapDirection = true; constexpr bool potSwapDirection = true;
int pot1Handle, pot2Handle, pot3Handle, sw1Handle, sw2Handle, led1Handle, led2Handle; int pot1Handle, pot2Handle, pot3Handle, sw1Handle, sw2Handle, led1Handle, led2Handle;
bool mute = false; bool mute = false;
@ -51,6 +51,7 @@ void checkPot(unsigned id)
if (controlPtr->checkPotValue(handle, potValue)) { if (controlPtr->checkPotValue(handle, potValue)) {
// Pot has changed // Pot has changed
codecPtr->setHeadphoneVolume(potValue); codecPtr->setHeadphoneVolume(potValue);
Serial.println(String("POT") + id + String(" value: ") + potValue);
} }
} }
@ -79,5 +80,3 @@ void checkSwitch(unsigned id)
bool pressed = controlPtr->isSwitchHeld(swHandle); bool pressed = controlPtr->isSwitchHeld(swHandle);
controlPtr->setOutput(ledHandle, pressed); controlPtr->setOutput(ledHandle, pressed);
} }

@ -42,13 +42,11 @@
* *
*/ */
//#define RUN_MIDI_TEST // Uncomment this line to skip the MIDI test. #define RUN_MIDI_TEST // Uncomment this line to run the MIDI test.
//#define RUN_MEMO_TEST // Uncomment this line to skip the MEM0 test. #define RUN_MEMO_TEST // Uncomment this line to run the MEM0 test.
//#define RUN_MEM1_TEST // (Teensy 3.5/3/6 only!) Comment out or delete this line to skip the MEM1 test. //#define RUN_MEM1_TEST // (Teensy 3.5/3/6 only!) Uncomment this line to run the MEM1 test.
#include <Audio.h> #include <Audio.h>
#define TGA_PRO_EXPAND_REV2
#include "BALibrary.h" #include "BALibrary.h"
using namespace BALibrary; using namespace BALibrary;
@ -67,7 +65,7 @@ BAGpio gpio; // access to User LED
BASpiMemoryDMA spiMem0(SpiDeviceId::SPI_DEVICE0); BASpiMemoryDMA spiMem0(SpiDeviceId::SPI_DEVICE0);
#endif #endif
#if defined(RUN_MEM1_TEST) #if defined(RUN_MEM1_TEST) && !defined(__IMXRT1062__) // SPI1 not supported on T4.0
BASpiMemoryDMA spiMem1(SpiDeviceId::SPI_DEVICE1); BASpiMemoryDMA spiMem1(SpiDeviceId::SPI_DEVICE1);
#endif #endif
@ -78,13 +76,14 @@ BAPhysicalControls controls(BA_EXPAND_NUM_SW, BA_EXPAND_NUM_POT, BA_EXPAND_NUM_E
void configPhysicalControls(BAPhysicalControls &controls, BAAudioControlWM8731 &codec); void configPhysicalControls(BAPhysicalControls &controls, BAAudioControlWM8731 &codec);
void checkPot(unsigned id); void checkPot(unsigned id);
void checkSwitch(unsigned id); void checkSwitch(unsigned id);
bool spiTest(BASpiMemoryDMA *mem); // returns true if passed bool spiTest(BASpiMemory *mem); // returns true if passed
bool uartTest(); // returns true if passed bool uartTest(); // returns true if passed
unsigned loopCounter = 0; unsigned loopCounter = 0;
void setup() { void setup() {
Serial.begin(57600); Serial.begin(57600);
while (!Serial) { yield(); }
delay(500); delay(500);
// Disable the audio codec first // Disable the audio codec first
@ -101,11 +100,13 @@ void setup() {
#endif #endif
#if defined(RUN_MEMO_TEST) #if defined(RUN_MEMO_TEST)
SPI_MEM0_1M();
spiMem0.begin(); delay(10); spiMem0.begin(); delay(10);
if (spiTest(&spiMem0)) { Serial.println("SPI0 testing PASSED!");} if (spiTest(&spiMem0)) { Serial.println("SPI0 testing PASSED!");}
#endif #endif
#if defined(RUN_MEM1_TEST) #if defined(RUN_MEM1_TEST) && !defined(__IMXRT1062__)
SPI_MEM1_1M();
spiMem1.begin(); delay(10); spiMem1.begin(); delay(10);
if (spiTest(&spiMem1)) { Serial.println("SPI1 testing PASSED!");} if (spiTest(&spiMem1)) { Serial.println("SPI1 testing PASSED!");}
#endif #endif
@ -121,7 +122,7 @@ void loop() {
checkSwitch(0); checkSwitch(0);
checkSwitch(1); checkSwitch(1);
delay(10); delay(20);
loopCounter++; loopCounter++;
if ((loopCounter % 100) == 0) { if ((loopCounter % 100) == 0) {
gpio.toggleLed(); gpio.toggleLed();

@ -4,7 +4,7 @@
using namespace BALibrary; using namespace BALibrary;
constexpr unsigned MIDI_RATE = 31250; constexpr unsigned MIDI_RATE = 31250;
constexpr unsigned HIGH_RATE = 250000; constexpr unsigned HIGH_RATE = 230400;
constexpr unsigned TEST_TIME = 5; // 5 second test each constexpr unsigned TEST_TIME = 5; // 5 second test each
static unsigned baudRate = MIDI_RATE; // start with low speed static unsigned baudRate = MIDI_RATE; // start with low speed
@ -58,7 +58,7 @@ bool uartTest(void)
if (Serial1.available()) { if (Serial1.available()) {
uint8_t readData= Serial1.read(); uint8_t readData= Serial1.read();
if (readData != writeData) { if (readData != writeData) {
Serial.println(String("ERROR: readData = ") + readData + String(" writeData = ") + writeData); Serial.println(String("MIDI ERROR: readData = ") + readData + String(" writeData = ") + writeData);
errorCount++; errorCount++;
} }
@ -79,4 +79,3 @@ bool uartTest(void)
return testFailed; return testFailed;
} }

@ -12,6 +12,8 @@ constexpr int mask1 = 0xaaaa;
using namespace BALibrary; using namespace BALibrary;
size_t SPI_MAX_ADDR = 0;
int calcData(int spiAddress, int loopPhase, int maskPhase) int calcData(int spiAddress, int loopPhase, int maskPhase)
{ {
int data; int data;
@ -35,7 +37,7 @@ int calcData(int spiAddress, int loopPhase, int maskPhase)
return (data & 0xffff); return (data & 0xffff);
} }
bool spiTest(BASpiMemoryDMA *mem) bool spiTest(BASpiMemory *mem)
{ {
int spiAddress = 0; int spiAddress = 0;
int spiErrorCount = 0; int spiErrorCount = 0;
@ -45,7 +47,10 @@ bool spiTest(BASpiMemoryDMA *mem)
uint16_t memBlock[NUM_BLOCK_WORDS]; uint16_t memBlock[NUM_BLOCK_WORDS];
uint16_t goldData[NUM_BLOCK_WORDS]; uint16_t goldData[NUM_BLOCK_WORDS];
Serial.println("Starting SPI MEM Test"); SPI_MAX_ADDR = BAHardwareConfig.getSpiMemMaxAddr(0); // assume for this test both memories are the same size so use MEM0
const size_t SPI_MEM0_SIZE_BYTES = BAHardwareConfig.getSpiMemSizeBytes(0);
Serial.println(String("Starting SPI MEM Test of ") + SPI_MEM0_SIZE_BYTES + String(" bytes"));
for (int cnt = 0; cnt < NUM_TESTS; cnt++) { for (int cnt = 0; cnt < NUM_TESTS; cnt++) {
@ -122,4 +127,3 @@ bool spiTest(BASpiMemoryDMA *mem)
} }
return true; return true;
} }

@ -45,12 +45,12 @@ public:
/// Specifiy which external memory to use /// Specifiy which external memory to use
/// @param type specify which memory to use /// @param type specify which memory to use
BAAudioEffectDelayExternal(BALibrary::MemSelect type); BAAudioEffectDelayExternal(BALibrary::MemSelect mem);
/// Specify external memory, and how much of the memory to use /// Specify external memory, and how much of the memory to use
/// @param type specify which memory to use /// @param type specify which memory to use
/// @param delayLengthMs maximum delay length in milliseconds /// @param delayLengthMs maximum delay length in milliseconds
BAAudioEffectDelayExternal(BALibrary::MemSelect type, float delayLengthMs); BAAudioEffectDelayExternal(BALibrary::MemSelect mem, float delayLengthMs);
virtual ~BAAudioEffectDelayExternal(); virtual ~BAAudioEffectDelayExternal();
/// set the actual amount of delay on a given delay tap /// set the actual amount of delay on a given delay tap
@ -67,7 +67,10 @@ public:
static unsigned m_usingSPICount[2]; // internal use for all instances static unsigned m_usingSPICount[2]; // internal use for all instances
private: private:
void initialize(BALibrary::MemSelect mem, unsigned delayLength = 1e6); bool m_configured = false;
unsigned m_requestedDelayLength = 1e6;
BALibrary::MemSelect m_mem = BALibrary::MemSelect::MEM0;
void initialize(void);
void read(uint32_t address, uint32_t count, int16_t *data); void read(uint32_t address, uint32_t count, int16_t *data);
void write(uint32_t address, uint32_t count, const int16_t *data); void write(uint32_t address, uint32_t count, const int16_t *data);
void zero(uint32_t address, uint32_t count); void zero(uint32_t address, uint32_t count);
@ -79,7 +82,6 @@ private:
static unsigned m_allocated[2]; static unsigned m_allocated[2];
audio_block_t *m_inputQueueArray[1]; audio_block_t *m_inputQueueArray[1];
BALibrary::MemSelect m_mem;
SPIClass *m_spi = nullptr; SPIClass *m_spi = nullptr;
int m_spiChannel = 0; int m_spiChannel = 0;
int m_misoPin = 0; int m_misoPin = 0;

@ -136,7 +136,10 @@ protected:
}; };
#if !defined (__IMXRT1062__) #if defined (__IMXRT1062__)
//#if 0
using BASpiMemoryDMA = BASpiMemory;
#else
/**************************************************************************//** /**************************************************************************//**
* This wrapper class uses the Arduino SPI (Wire) library to access the SPI ram * This wrapper class uses the Arduino SPI (Wire) library to access the SPI ram

@ -31,20 +31,21 @@ unsigned BAAudioEffectDelayExternal::m_usingSPICount[2] = {0,0};
BAAudioEffectDelayExternal::BAAudioEffectDelayExternal() BAAudioEffectDelayExternal::BAAudioEffectDelayExternal()
: AudioStream(1, m_inputQueueArray) : AudioStream(1, m_inputQueueArray)
{ {
initialize(MemSelect::MEM0); m_mem = MemSelect::MEM0;
} }
BAAudioEffectDelayExternal::BAAudioEffectDelayExternal(MemSelect mem) BAAudioEffectDelayExternal::BAAudioEffectDelayExternal(MemSelect mem)
: AudioStream(1, m_inputQueueArray) : AudioStream(1, m_inputQueueArray)
{ {
initialize(mem); m_mem = mem;
} }
BAAudioEffectDelayExternal::BAAudioEffectDelayExternal(BALibrary::MemSelect type, float delayLengthMs) BAAudioEffectDelayExternal::BAAudioEffectDelayExternal(BALibrary::MemSelect mem, float delayLengthMs)
: AudioStream(1, m_inputQueueArray) : AudioStream(1, m_inputQueueArray)
{ {
unsigned delayLengthInt = (delayLengthMs*(AUDIO_SAMPLE_RATE_EXACT/1000.0f))+0.5f; unsigned delayLengthInt = (delayLengthMs*(AUDIO_SAMPLE_RATE_EXACT/1000.0f))+0.5f;
initialize(type, delayLengthInt); m_mem = mem;
m_requestedDelayLength = delayLengthInt;
} }
BAAudioEffectDelayExternal::~BAAudioEffectDelayExternal() BAAudioEffectDelayExternal::~BAAudioEffectDelayExternal()
@ -54,6 +55,8 @@ BAAudioEffectDelayExternal::~BAAudioEffectDelayExternal()
void BAAudioEffectDelayExternal::delay(uint8_t channel, float milliseconds) { void BAAudioEffectDelayExternal::delay(uint8_t channel, float milliseconds) {
if (!m_configured) { initialize(); }
if (channel >= 8) return; if (channel >= 8) return;
if (milliseconds < 0.0) milliseconds = 0.0; if (milliseconds < 0.0) milliseconds = 0.0;
uint32_t n = (milliseconds*(AUDIO_SAMPLE_RATE_EXACT/1000.0f))+0.5f; uint32_t n = (milliseconds*(AUDIO_SAMPLE_RATE_EXACT/1000.0f))+0.5f;
@ -67,6 +70,9 @@ void BAAudioEffectDelayExternal::delay(uint8_t channel, float milliseconds) {
} }
void BAAudioEffectDelayExternal::disable(uint8_t channel) { void BAAudioEffectDelayExternal::disable(uint8_t channel) {
if (!m_configured) { initialize(); }
if (channel >= 8) return; if (channel >= 8) return;
uint8_t mask = m_activeMask & ~(1<<channel); uint8_t mask = m_activeMask & ~(1<<channel);
m_activeMask = mask; m_activeMask = mask;
@ -75,12 +81,21 @@ void BAAudioEffectDelayExternal::disable(uint8_t channel) {
void BAAudioEffectDelayExternal::update(void) void BAAudioEffectDelayExternal::update(void)
{ {
audio_block_t *block; audio_block_t *block;
uint32_t n, channel, read_offset; uint32_t n, channel, read_offset;
// grab incoming data and put it into the memory // grab incoming data and put it into the memory
block = receiveReadOnly(); block = receiveReadOnly();
if (!m_configured) {
if (block) {
transmit(block);
release(block);
return;
} else { return; }
}
if (block) { if (block) {
if (m_headOffset + AUDIO_BLOCK_SAMPLES <= m_memoryLength) { if (m_headOffset + AUDIO_BLOCK_SAMPLES <= m_memoryLength) {
// a single write is enough // a single write is enough
@ -135,19 +150,19 @@ void BAAudioEffectDelayExternal::update(void)
unsigned BAAudioEffectDelayExternal::m_allocated[2] = {0, 0}; unsigned BAAudioEffectDelayExternal::m_allocated[2] = {0, 0};
void BAAudioEffectDelayExternal::initialize(MemSelect mem, unsigned delayLength) void BAAudioEffectDelayExternal::initialize(void)
{ {
unsigned samples = 0; unsigned samples = 0;
unsigned memsize = 0, avail = 0; unsigned memsize = 0, avail = 0;
m_activeMask = 0; m_activeMask = 0;
m_headOffset = 0; m_headOffset = 0;
m_mem = mem; //m_mem = mem;
switch (mem) { switch (m_mem) {
case MemSelect::MEM0 : case MemSelect::MEM0 :
{ {
memsize = BAHardwareConfig.getSpiMemSizeBytes(mem) / sizeof(int16_t); memsize = BAHardwareConfig.getSpiMemSizeBytes(m_mem) / sizeof(int16_t);
m_spi = &SPI; m_spi = &SPI;
m_spiChannel = 0; m_spiChannel = 0;
m_misoPin = SPI0_MISO_PIN; m_misoPin = SPI0_MISO_PIN;
@ -164,7 +179,7 @@ void BAAudioEffectDelayExternal::initialize(MemSelect mem, unsigned delayLength)
case MemSelect::MEM1 : case MemSelect::MEM1 :
{ {
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) #if defined(__MK64FX512__) || defined(__MK66FX1M0__)
memsize = BAHardwareConfig.getSpiMemSizeBytes(mem) / sizeof(int16_t); memsize = BAHardwareConfig.getSpiMemSizeBytes(m_mem) / sizeof(int16_t);
m_spi = &SPI1; m_spi = &SPI1;
m_spiChannel = 1; m_spiChannel = 1;
m_misoPin = SPI1_MISO_PIN; m_misoPin = SPI1_MISO_PIN;
@ -185,14 +200,15 @@ void BAAudioEffectDelayExternal::initialize(MemSelect mem, unsigned delayLength)
pinMode(m_csPin, OUTPUT); pinMode(m_csPin, OUTPUT);
digitalWriteFast(m_csPin, HIGH); digitalWriteFast(m_csPin, HIGH);
avail = memsize - m_allocated[mem]; avail = memsize - m_allocated[m_mem];
if (delayLength > avail) samples = avail; if (m_requestedDelayLength > avail) samples = avail;
m_memoryStart = m_allocated[mem]; m_memoryStart = m_allocated[m_mem];
m_allocated[mem] += samples; m_allocated[m_mem] += samples;
m_memoryLength = samples; m_memoryLength = samples;
zero(0, m_memoryLength); zero(0, m_memoryLength);
m_configured = true;
} }

@ -353,7 +353,6 @@ void BASpiMemory::m_rawRead16(size_t address, uint16_t *dest, size_t numWords)
#if defined (__IMXRT1062__) #if defined (__IMXRT1062__)
//#if 0 //#if 0
using BASpiMemoryDMA = BASpiMemory;
#else #else
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// BASpiMemoryDMA // BASpiMemoryDMA

Loading…
Cancel
Save