From 4b6d1ab1d383a11532ff38169d696f1208e6802f Mon Sep 17 00:00:00 2001
From: Eric Brombaugh <ebrombaugh1@cox.net>
Date: Tue, 11 Apr 2023 12:41:28 -0700
Subject: [PATCH] Added documentation and waveform generation. Adjust sample
 rate to 48kHz.

---
 examples/spi_dac/README.md  |  50 +++++++++++++++++-
 examples/spi_dac/oscope.png | Bin 0 -> 34091 bytes
 examples/spi_dac/spidac.h   | 100 +++++++++---------------------------
 3 files changed, 72 insertions(+), 78 deletions(-)
 create mode 100644 examples/spi_dac/oscope.png

diff --git a/examples/spi_dac/README.md b/examples/spi_dac/README.md
index ff0c1a8..7693f5d 100644
--- a/examples/spi_dac/README.md
+++ b/examples/spi_dac/README.md
@@ -1,5 +1,51 @@
 # SPI DAC Demo
-This example shows how to set up the SPI port with circular DMA and IRQs to do
-continuous audio output through a DAC.
+This example shows how to set up the SPI port with a timer, circular DMA and
+IRQs to do continuous audio output through an inexpensive I2S DAC.
+
+![Scope image of sine and sawtooth waves](oscope.png) 
+
+## Theory
+The CH32V003 does not have an I2S port which is usually required for driving
+audio DACs, but the inexpensive PT8211 stereo audio DAC is very forgiving of
+the signal format used to drive it so we can approximate an I2S signal using
+one of the CH32V003 on-chip timers to generate the frame sync signal. The SPI
+port then provides the bit clock and serial data.
+
+### Timer setup
+TIM1 on the CH32V003 is set up to generate a 48kHz square wave which is output
+on GPIO pin PC4 and serves as the frame sync or WS. The timer is configured to
+run in center-aligned mode 3 which generates DMA requests on both rising and
+falling edges. Channel 4 is configured as the output and the threshold is set
+to 50%.
+
+### SPI setup
+SPI1 is configured for 16-bit TX with a bit clock of 48MHz/8 (3MHz) which is
+fast enough to clock out 16 bits of data between the edges of the frame sync
+signal. Transmit data arrives via DMA, but the SPI port does not control DMA -
+that is triggered from the timer above.
+
+### DMA setup
+DMA1 channel 4 is used because that channel is connected to TIM1 Chl 4 output
+and is set up in circular mode with both Half-transfer and Transfer-Complete
+interrupts. It continuously pulls data out of a 32-word buffer and sends it to
+the SPI port when the timer fires.
+
+### Interrupts
+The DMA TC and HT IRQs trigger execution of a buffer fill routine which simply
+indexes through a sinewave table at variable rates using fixed-point math to
+fill the buffer as requested. This process uses up only about 4% of the
+available CPU cycles so there's plenty leftover for foreground processing or
+more complex waveform calculations like interpolation or synthesis.
 
 ## Use
+Connect a PT8211 DAC as follows:
+* DAC pin 1 (BCK) - MCU pin 15 (PC5/SCK)
+* DAC pin 2 (WS)  - MCU pin 14 (PC4/T1CH4)
+* DAC pin 3 (DIN) - MCU pin 16 {PC6/MOSI)
+* DAC pin 4 (GND) - ground
+* DAC pin 5 (VCC) - 3.3V or 5V supply
+* DAC pin 6 (LCH) - left channel output
+* DAC pin 8 (RCH) - right channel output
+
+Connect an oscilloscope to the left and right channel outputs and observe
+sine and sawtooth waves at different frequencies.
diff --git a/examples/spi_dac/oscope.png b/examples/spi_dac/oscope.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f1bb342e937763e11fb6447903d830a9d6ec603
GIT binary patch
literal 34091
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
NypnxcB%<g2e*iz?uR8z$

literal 0
HcmV?d00001

diff --git a/examples/spi_dac/spidac.h b/examples/spi_dac/spidac.h
index 1f2c253..e8242b9 100644
--- a/examples/spi_dac/spidac.h
+++ b/examples/spi_dac/spidac.h
@@ -7,12 +7,13 @@
 #define _SPIDAC_H
 
 #include <stdint.h>
+#include "Sine16bit.h"
 
 // uncomment this to enable GPIO diag
 #define DAC_DIAG
 
 // uncomment this to fill the buffer with static test data
-#define DAC_STATIC
+//#define DAC_STATIC
 
 // uncomment this for timer-generated DMA
 #define DAC_TIMDMA
@@ -20,6 +21,7 @@
 #define DACBUFSZ 32
 
 uint16_t dac_buffer[DACBUFSZ];
+uint32_t osc_phs[2], osc_frq[2];
 
 /*
  * initialize SPI and DMA
@@ -27,13 +29,20 @@ uint16_t dac_buffer[DACBUFSZ];
 void spidac_init( void )
 {
 #ifdef DAC_STATIC
+	// fill output buffer with diag data
 	uint16_t data = 0xffff;
 	for(int i=0;i<DACBUFSZ;i++)
 	{
 		/* just a full-scale ramp for now */
 		dac_buffer[i] = data;
 		data >>= 1;
-	}	
+	}
+#else
+	// init two oscillators
+	osc_phs[0] = 0;
+	osc_phs[1] = 0;
+	osc_frq[0] = 0x01000000;
+	osc_frq[1] = 0x00400000;
 #endif
 	
 	// Enable DMA + Peripherals
@@ -61,36 +70,11 @@ void spidac_init( void )
 	SPI1->CTLR1 = 
 		SPI_NSS_Soft | SPI_CPHA_1Edge | SPI_CPOL_Low | SPI_DataSize_16b |
 		SPI_Mode_Master | SPI_Direction_1Line_Tx |
-		SPI_BaudRatePrescaler_32;
-
-#ifndef DAC_TIMDMA
-	// SPI generates DMA Req
-	SPI1->CTLR2 = SPI_CTLR2_TXDMAEN;
-	//SPI1->HSCR = 1;
+		SPI_BaudRatePrescaler_16;
 
 	// enable SPI port
 	SPI1->CTLR1 |= CTLR1_SPE_Set;
 
-	//DMA1_Channel3 is for SPI1TX
-	DMA1_Channel3->PADDR = (uint32_t)&SPI1->DATAR;
-	DMA1_Channel3->MADDR = (uint32_t)dac_buffer;
-	DMA1_Channel3->CNTR  = DACBUFSZ;
-	DMA1_Channel3->CFGR  =
-		DMA_M2M_Disable |		 
-		DMA_Priority_VeryHigh |
-		DMA_MemoryDataSize_HalfWord |
-		DMA_PeripheralDataSize_HalfWord |
-		DMA_MemoryInc_Enable |
-		DMA_Mode_Circular |
-		DMA_DIR_PeripheralDST |
-		DMA_IT_TC | DMA_IT_HT;
-
-	NVIC_EnableIRQ( DMA1_Channel3_IRQn );
-	DMA1_Channel3->CFGR |= DMA_CFGR1_EN;
-#else
-	// enable SPI port
-	SPI1->CTLR1 |= CTLR1_SPE_Set;
-
 	// TIM1 generates DMA Req and external signal
 	// Enable TIM1
 	RCC->APB2PCENR |= RCC_APB2Periph_TIM1;
@@ -112,7 +96,7 @@ void spidac_init( void )
 	TIM1->PSC = 0x0000;
 	
 	// Auto Reload - sets period to ~47kHz
-	TIM1->ATRLR = 1023;
+	TIM1->ATRLR = 499;
 	
 	// Reload immediately
 	TIM1->SWEVGR |= TIM_UG;
@@ -124,7 +108,7 @@ void spidac_init( void )
 	TIM1->CHCTLR2 |= TIM_OC4M_2 | TIM_OC4M_1;
 	
 	// Set the Capture Compare Register value to 50% initially
-	TIM1->CH4CVR = 512;
+	TIM1->CH4CVR = 256;
 	
 	// Enable TIM1 outputs
 	TIM1->BDTR |= TIM_MOE;
@@ -151,7 +135,6 @@ void spidac_init( void )
 
 	NVIC_EnableIRQ( DMA1_Channel4_IRQn );
 	DMA1_Channel4->CFGR |= DMA_CFGR1_EN;
-#endif
 }
 
 /*
@@ -159,53 +142,22 @@ void spidac_init( void )
  */
 void dac_update(uint16_t *buffer)
 {
-}
-
-#ifndef DAC_TIMDMA
-/*
- * SPI DMA IRQ Handler
- */
-void DMA1_Channel3_IRQHandler( void ) __attribute__((interrupt));
-void DMA1_Channel3_IRQHandler( void ) 
-{
-#ifdef DAC_DIAG
-	GPIOD->BSHR = 1;
-#endif
+	int i;
 	
-	// why is this needed? Can't just direct compare the reg in tests below
-	volatile uint16_t intfr = DMA1->INTFR;
-
-	if( intfr & DMA1_IT_TC3 )
+	// fill the buffer with stereo data
+	for(i=0;i<DACBUFSZ/2;i+=2)
 	{
-		// Transfer complete - update 2nd half
-		dac_update(dac_buffer+DACBUFSZ/2);
-		
-		// clear TC IRQ
-		DMA1->INTFCR = DMA1_IT_TC3;
-		
-		GPIOC->BSHR = (1<<1); // NSS 1
-	}
-	
-	if( intfr & DMA1_IT_HT3 )
-	{
-		// Half transfer - update first half
-		dac_update(dac_buffer);
-		
-		// clear HT IRQ
-		DMA1->INTFCR = DMA1_IT_HT3;
+		// right chl
+		*buffer++ = Sine16bit[osc_phs[0]>>24];
+		osc_phs[0] += osc_frq[0];
 		
-		GPIOC->BSHR = (1<<(1+16)); // NSS 0
+		// left chl
+		//*buffer++ = Sine16bit[osc_phs[1]>>24];
+		*buffer++ = osc_phs[1]>>16;
+		osc_phs[1] += osc_frq[1];
 	}
-
-	// clear the Global IRQ
-	DMA1->INTFCR = DMA1_IT_GL3;
-	
-#ifdef DAC_DIAG
-	GPIOD->BSHR = 1<<16;
-#endif
 }
 
-#else
 /*
  * TIM1CH4 DMA IRQ Handler
  */
@@ -248,8 +200,4 @@ void DMA1_Channel4_IRQHandler( void )
 	GPIOD->BSHR = 1<<16;
 #endif
 }
-
-#endif
-
-
 #endif
-- 
GitLab