From 9bfa0580f19d449636fb153ab460269454f02851 Mon Sep 17 00:00:00 2001
From: recallmenot <edmund.raile@proton.me>
Date: Sun, 7 May 2023 07:34:41 +0200
Subject: [PATCH] separated out SPI library into extralibs

---
 examples/spi_24L01_rx/nrf24l01_low_level.c    |   2 +-
 examples/spi_24L01_tx/ch32v003_SPI.h          | 339 ------------------
 examples/spi_24L01_tx/nrf24l01_low_level.c    |   2 +-
 .../spi_24L01_rx => extralibs}/ch32v003_SPI.h |   2 +-
 4 files changed, 3 insertions(+), 342 deletions(-)
 delete mode 100644 examples/spi_24L01_tx/ch32v003_SPI.h
 rename {examples/spi_24L01_rx => extralibs}/ch32v003_SPI.h (99%)

diff --git a/examples/spi_24L01_rx/nrf24l01_low_level.c b/examples/spi_24L01_rx/nrf24l01_low_level.c
index 811fd07..3d5c21b 100644
--- a/examples/spi_24L01_rx/nrf24l01_low_level.c
+++ b/examples/spi_24L01_rx/nrf24l01_low_level.c
@@ -8,7 +8,7 @@
 #define CH32V003_SPI_CLK_MODE_POL0_PHA0			//leading = rising		trailing = falling		sample on leading		default if you're unsure
 #define CH32V003_SPI_NSS_SOFTWARE_ANY_MANUAL	// toggle manually!
 #define CH32V003_SPI_IMPLEMENTATION
-#include "ch32v003_SPI.h"
+#include "../../extralibs/ch32v003_SPI.h"
 #include "nrf24l01.h"
 
 /*start of low level functions, specific to the mcu and compiler*/
diff --git a/examples/spi_24L01_tx/ch32v003_SPI.h b/examples/spi_24L01_tx/ch32v003_SPI.h
deleted file mode 100644
index 7f30a05..0000000
--- a/examples/spi_24L01_tx/ch32v003_SPI.h
+++ /dev/null
@@ -1,339 +0,0 @@
-//######## necessities
-
-// include guards
-#ifndef CH32V003_SPI_H
-#define CH32V003_SPI_H
-
-// includes
-#include<stdint.h>								//uintN_t support
-#include"../../ch32v003fun/ch32v003fun.h"
-
-
-
-/*######## library usage and configuration
-
-in the .c files that use this library, you'll need to #define some configuration options _before_ the #include "ch32v003_SPI.h"
-
-SYSTEM_CORE_CLOCK and APB_CLOCK should be defined already as APB_CLOCK is used by this library
-
-to enable using the functions of this library:
-#define CH32V003_SPI_IMPLEMENTATION
-
-to configure the settings of the SPI bus, first, declare the desired bus speed
-
-#define CH32V003_SPI_SPEED_HZ 1000000
-
-then pick the desired setting of each group:
-
-#define CH32V003_SPI_DIRECTION_2LINE_TXRX
-#define CH32V003_SPI_DIRECTION_1LINE_TX
-
-#define CH32V003_SPI_CLK_MODE_POL0_PHA0			//leading = rising		trailing = falling		sample on leading		default if you're unsure
-#define CH32V003_SPI_CLK_MODE_POL0_PHA1			//leading = rising		trailing = falling		sample on trailing
-#define CH32V003_SPI_CLK_MODE_POL1_PHA0			//leading = falling		trailing = rising		sample on leading
-#define CH32V003_SPI_CLK_MODE_POL1_PHA1			//leading = falling		trailing = rising		sample on trailing
-
-#define CH32V003_SPI_NSS_HARDWARE_PC0			// _NSS	toggled by hardware, automatic
-#define CH32V003_SPI_NSS_HADRWARE_PC1			// NSS	toggled by hardware, automatic
-#define CH32V003_SPI_NSS_SOFTWARE_PC3			// PC3	toggled by software, automatic, manual setters available
-#define CH32V003_SPI_NSS_SOFTWARE_PC4			// PC4	toggled by software, automatic, manual setters available
-#define CH32V003_SPI_NSS_SOFTWARE_ANY_MANUAL	// toggle manually!
-*/
-
-
-
-//######## function overview (declarations): use these!
-// initialize and configure the SPI peripheral
-static inline void SPI_init();
-
-// establish / end a connection to the SPI device
-static inline void SPI_begin_8();
-static inline void SPI_begin_16();
-static inline void SPI_end();
-
-// manually set the NSS (chip select) pin high / low
-// "SPI_NSS_HIGH_FN" and "SPI_NSS_LOW_FN" only become available functions if the selected NSS is software PC3 or PC4
-#if defined(CH32V003_SPI_NSS_SOFTWARE_PC3) || defined(CH32V003_SPI_NSS_SOFTWARE_PC4)
-static inline void SPI_NSS_software_low();
-static inline void SPI_NSS_software_high();
-#endif
-
-// read / write the SPI device
-// these commands are raw, you'll have to consider all other steps in SPI_transfer!
-static inline uint8_t SPI_read_8();
-static inline uint16_t SPI_read_16();
-static inline void SPI_write_8(uint8_t data);
-static inline void SPI_write_16(uint16_t data);
-
-// send a command and get a response from the SPI device
-// you'll use this for most devices
-static inline uint8_t SPI_transfer_8(uint8_t data);
-static inline uint8_t SPI_transfer_16(uint16_t data);
-
-// SPI peripheral power enable / disable (default off, init() automatically enables)
-// send SPI peripheral to sleep
-static inline void SPI_poweroff();
-// wake SPI peripheral from sleep
-static inline void SPI_poweron();
-
-// helper: kill / restore all interrupts on the CH32V003
-static inline void kill_interrrupts();
-static inline void restore_interrupts();
-
-
-
-//######## internal function declarations
-static inline void SPI_wait_TX_complete();
-static inline uint8_t SPI_is_RX_empty();
-static inline void SPI_wait_RX_available();
-
-
-
-//######## internal variables
-static uint16_t EXT1_INTENR_backup;
-
-
-
-//######## preprocessor macros
-// min and max helper macros
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#define MAX(a,b) (((a)>(b))?(a):(b))
-
-// stringify for displaying what #defines evaluated to at preprocessor stage
-#define VALUE_TO_STRING(x) #x
-#define VALUE(x) VALUE_TO_STRING(x)
-#define VAR_NAME_VALUE(var) #var "="  VALUE(var)
-
-//compile-time log2
-#define LOG2(x) ((x) == 0 ? -1 : __builtin_ctz(x))
-
-// compile-time clock prescaler calculation: log2(APB_CLOCK/SPEED_BUS)
-#define SPI_CLK_RATIO (APB_CLOCK / CH32V003_SPI_SPEED_HZ)
-#define SPI_CLK_PRESCALER LOG2(SPI_CLK_RATIO)
-
-// ensure that CLOCK_PRESCALER_VALUE is within the range of 0..7
-_Static_assert(SPI_CLK_PRESCALER >= 0 && SPI_CLK_PRESCALER <= 7, "SPI_CLK_PRESCALER is out of range (0..7). Please set a different SPI bus speed. prescaler = log2(f_CPU/f_SPI)");
-//#pragma message(VAR_NAME_VALUE(SPI_CLK_PRESCALER))
-
-
-
-//######## preprocessor #define requirements
-
-#if !defined(CH32V003_SPI_DIRECTION_2LINE_TXRX) && !defined(CH32V003_SPI_DIRECTION_1LINE_TX)
-	#warning "none of the CH32V003_SPI_DIRECTION_ options were defined!"
-#endif
-#if defined(CH32V003_SPI_DIRECTION_2LINE_TXRX) && defined(CH32V003_SPI_DIRECTION_1LINE_TX)
-	#warning "both CH32V003_SPI_DIRECTION_ options were defined!"
-#endif
-
-#if ((defined(CH32V003_SPI_CLK_MODE_POL0_PHA0) ? 1 : 0) + \
-	(defined(CH32V003_SPI_CLK_MODE_POL0_PHA1) ? 1 : 0) + \
-	(defined(CH32V003_SPI_CLK_MODE_POL1_PHA0) ? 1 : 0) + \
-	(defined(CH32V003_SPI_CLK_MODE_POL1_PHA1) ? 1 : 0)) > 1
-	#warning "more than one of the CH32V003_SPI_CLK_MODE_ options were defined!"
-#endif
-#if ((defined(CH32V003_SPI_CLK_MODE_POL0_PHA0) ? 1 : 0) + \
-	(defined(CH32V003_SPI_CLK_MODE_POL0_PHA1) ? 1 : 0) + \
-	(defined(CH32V003_SPI_CLK_MODE_POL1_PHA0) ? 1 : 0) + \
-	(defined(CH32V003_SPI_CLK_MODE_POL1_PHA1) ? 1 : 0)) == 0
-	#warning "none of the CH32V003_SPI_CLK_MODE_ options were defined!"
-#endif
-
-#if ((defined(CH32V003_SPI_NSS_HARDWARE_PC0) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_HARDWARE_PC1) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_SOFTWARE_PC3) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_SOFTWARE_PC4) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_SOFTWARE_ANY_MANUAL) ? 1 : 0)) > 1
-	#warning "more than one of the CH32V003_SPI_NSS_ options were defined!"
-#endif
-#if ((defined(CH32V003_SPI_NSS_HARDWARE_PC0) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_HARDWARE_PC1) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_SOFTWARE_PC3) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_SOFTWARE_PC4) ? 1 : 0) + \
-	(defined(CH32V003_SPI_NSS_SOFTWARE_ANY_MANUAL) ? 1 : 0)) == 0
-	#warning "none of the CH32V003_SPI_NSS_ options were defined!"
-#endif
-
-
-
-//########  small function definitions, static inline
-static inline void SPI_init() {
-	SPI_poweron();
-	
-	// reset control register
-	SPI1->CTLR1 = 0;
-
-	// set prescaler
-	SPI1->CTLR1 |= SPI_CTLR1_BR & (SPI_CLK_PRESCALER<<3);
-
-	// set clock polarity and phase 
-	#if defined(CH32V003_SPI_CLK_MODE_POL0_PHA0)
-		SPI1->CTLR1 |= (SPI_CPOL_Low | SPI_CPHA_1Edge);
-	#elif defined (CH32V003_SPI_CLK_MODE_POL0_PHA1)
-		SPI1->CTLR1 |= (SPI_CPOL_Low | SPI_CPHA_2Edge);
-	#elif defined (CH32V003_SPI_CLK_MODE_POL1_PHA0)
-		SPI1->CTLR1 |= (SPI_CPOL_High | SPI_CPHA_1Edge);
-	#elif defined (CH32V003_SPI_CLK_MODE_POL1_PHA1)
-		SPI1->CTLR1 |= (SPI_CPOL_High | SPI_CPHA_2Edge);
-	#endif
-	
-	// configure NSS pin, master mode
-	#if defined(CH32V003_SPI_NSS_HARDWARE_PC0)
-		// _NSS (negative slave select) on PC0, 10MHz Output, alt func, push-pull1
-		SPI1->CTLR1 |= SPI_NSS_Hard;					// NSS hardware control mode
-		GPIOC->CFGLR &= ~(0xf<<(4*0));
-		GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*0);
-		AFIO->PCFR1 |= GPIO_Remap_SPI1;					// remap NSS (C1) to _NSS (C0)
-		SPI1->CTLR2 |= SPI_CTLR2_SSOE;					// pull _NSS high
-	#elif defined(CH32V003_SPI_NSS_HADRWARE_PC1)
-		// NSS (negative slave select) on PC1, 10MHz Output, alt func, push-pull1
-		SPI1->CTLR1 |= SPI_NSS_Hard;					// NSS hardware control mode
-		GPIOC->CFGLR &= ~(0xf<<(4*1));
-		GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*1);
-		SPI1->CTLR2 |= SPI_CTLR2_SSOE;					// pull _NSS high
-	#elif defined(CH32V003_SPI_NSS_SOFTWARE_PC3)
-		SPI1->CTLR1 |= SPI_NSS_Soft;					// SSM NSS software control mode
-		GPIOC->CFGLR &= ~(0xf<<(4*3));
-		GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*3);
-	#elif defined(CH32V003_SPI_NSS_SOFTWARE_PC4)
-		SPI1->CTLR1 |= SPI_NSS_Soft;					// SSM NSS software control mode
-		GPIOC->CFGLR &= ~(0xf<<(4*4));
-		GPIOC->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP_AF)<<(4*4);
-	#elif defined(CH32V003_SPI_NSS_SOFTWARE_ANY_MANUAL)
-		SPI1->CTLR1 |= SPI_NSS_Soft;					// SSM NSS software control mode
-	#endif
-
-	// SCK on PC5, 10MHz Output, alt func, push-pull
-	GPIOC->CFGLR &= ~(0xf<<(4*5));
-	GPIOC->CFGLR |= (GPIO_Speed_50MHz | GPIO_CNF_OUT_PP_AF)<<(4*5);
-
-	// CH32V003 is master
-	SPI1->CTLR1 |= SPI_Mode_Master;
-	
-	// set data direction and configure data pins
-	#if defined(CH32V003_SPI_DIRECTION_2LINE_TXRX)
-		SPI1->CTLR1 |= SPI_Direction_2Lines_FullDuplex;
-
-		// MOSI on PC6, 10MHz Output, alt func, push-pull
-		GPIOC->CFGLR &= ~(0xf<<(4*6));
-		GPIOC->CFGLR |= (GPIO_Speed_50MHz | GPIO_CNF_OUT_PP_AF)<<(4*6);
-		
-		// MISO on PC7, 10MHz input, floating
-		GPIOC->CFGLR &= ~(0xf<<(4*7));
-		GPIOC->CFGLR |= GPIO_CNF_IN_FLOATING<<(4*7);
-	#elif defined(CH32V003_SPI_DIRECTION_1LINE_TX)
-		SPI1->CTLR1 |= SPI_Direction_1Line_Tx;
-
-		// MOSI on PC6, 10MHz Output, alt func, push-pull
-		GPIOC->CFGLR &= ~(0xf<<(4*6));
-		GPIOC->CFGLR |= (GPIO_Speed_50MHz | GPIO_CNF_OUT_PP_AF)<<(4*6);
-	#endif
-}
-
-static inline void SPI_begin_8() {
-	SPI1->CTLR1 |= SPI_DataSize_8b;					// DFF 16bit data-length enable, writable only when SPE is 0
-	SPI1->CTLR1 |= CTLR1_SPE_Set;
-}
-static inline void SPI_begin_16() {
-	SPI1->CTLR1 |= SPI_DataSize_16b;				// DFF 16bit data-length enable, writable only when SPE is 0
-	SPI1->CTLR1 |= CTLR1_SPE_Set;
-}
-static inline void SPI_end() {
-	SPI1->CTLR1 &= CTLR1_SPE_Reset;
-}
-
-#if defined(CH32V003_SPI_NSS_SOFTWARE_PC3)
-static inline void SPI_NSS_software_high() {
-	GPIOC->BSHR = (1<<3);
-}
-static inline void SPI_NSS_software_low() {
-	GPIOC->BSHR = (1<<(16+3));
-}
-#elif defined(CH32V003_SPI_NSS_SOFTWARE_PC4) 
-static inline void SPI_NSS_software_high() {
-	GPIOC->BSHR = (1<<4);
-}
-static inline void SPI_NSS_software_low() {
-	GPIOC->BSHR = (1<<(16+4));
-}
-#endif
-
-static inline uint8_t SPI_read_8() {
-	return SPI1->DATAR;
-}
-static inline uint16_t SPI_read_16() {
-	return SPI1->DATAR;
-}
-static inline void SPI_write_8(uint8_t data) {
-	SPI1->DATAR = data;
-}
-static inline void SPI_write_16(uint16_t data) {
-	SPI1->DATAR = data;
-}
-static inline uint8_t SPI_transfer_8(uint8_t data) {
-	#if defined(CH32V003_SPI_NSS_SOFTWARE_PC3) || defined(CH32V003_SPI_NSS_SOFTWARE_PC4) 
-		SPI_NSS_software_high();
-	#endif
-	SPI_write_8(data);
-	SPI_wait_TX_complete();
-	asm volatile("nop");
-	SPI_wait_RX_available();
-	#if defined(CH32V003_SPI_NSS_SOFTWARE_PC3) || defined(CH32V003_SPI_NSS_SOFTWARE_PC4) 
-		SPI_NSS_software_low();
-	#endif
-	return SPI_read_8();
-}
-static inline uint8_t SPI_transfer_16(uint16_t data) {
-	#if defined(CH32V003_SPI_NSS_SOFTWARE_PC3) || defined(CH32V003_SPI_NSS_SOFTWARE_PC4) 
-		SPI_NSS_software_high();
-	#endif
-	SPI_write_16(data);
-	SPI_wait_TX_complete();
-	asm volatile("nop");
-	SPI_wait_RX_available();
-	#if defined(CH32V003_SPI_NSS_SOFTWARE_PC3) || defined(CH32V003_SPI_NSS_SOFTWARE_PC4) 
-		SPI_NSS_software_low();
-	#endif
-	return SPI_read_16();
-}
-
-static inline void SPI_poweroff() {
-	SPI_end();
-	RCC->APB2PCENR &= ~RCC_APB2Periph_SPI1;
-}
-static inline void SPI_poweron() {
-	RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_SPI1;
-}
-
-static inline void kill_interrrupts() {
-	EXT1_INTENR_backup = EXTI->INTENR;
-	// zero the interrupt enable register to disable all interrupts
-	EXTI->INTENR = 0;
-}
-static inline void restore_interrupts() {
-	EXTI->INTENR = EXT1_INTENR_backup;
-}
-
-
-
-//########  small internal function definitions, static inline
-static inline void SPI_wait_TX_complete() {
-	while(!(SPI1->STATR & SPI_STATR_TXE)) {}
-}
-static inline uint8_t SPI_is_RX_empty() {
-	return SPI1->STATR & SPI_STATR_RXNE;
-}
-static inline void SPI_wait_RX_available() {
-	while(!(SPI1->STATR & SPI_STATR_RXNE)) {}
-}
-
-
-
-//######## implementation block
-//#define CH32V003_SPI_IMPLEMENTATION //enable so LSP can give you text colors while working on the implementation block, disable for normal use of the library
-#if defined(CH32V003_SPI_IMPLEMENTATION)
-
-//no functions here because I think all of the functions are small enough to static inline
-
-#endif // CH32V003_SPI_IMPLEMENTATION
-#endif // CH32V003_SPI_H
diff --git a/examples/spi_24L01_tx/nrf24l01_low_level.c b/examples/spi_24L01_tx/nrf24l01_low_level.c
index 811fd07..3d5c21b 100644
--- a/examples/spi_24L01_tx/nrf24l01_low_level.c
+++ b/examples/spi_24L01_tx/nrf24l01_low_level.c
@@ -8,7 +8,7 @@
 #define CH32V003_SPI_CLK_MODE_POL0_PHA0			//leading = rising		trailing = falling		sample on leading		default if you're unsure
 #define CH32V003_SPI_NSS_SOFTWARE_ANY_MANUAL	// toggle manually!
 #define CH32V003_SPI_IMPLEMENTATION
-#include "ch32v003_SPI.h"
+#include "../../extralibs/ch32v003_SPI.h"
 #include "nrf24l01.h"
 
 /*start of low level functions, specific to the mcu and compiler*/
diff --git a/examples/spi_24L01_rx/ch32v003_SPI.h b/extralibs/ch32v003_SPI.h
similarity index 99%
rename from examples/spi_24L01_rx/ch32v003_SPI.h
rename to extralibs/ch32v003_SPI.h
index 7f30a05..f7263fa 100644
--- a/examples/spi_24L01_rx/ch32v003_SPI.h
+++ b/extralibs/ch32v003_SPI.h
@@ -6,7 +6,7 @@
 
 // includes
 #include<stdint.h>								//uintN_t support
-#include"../../ch32v003fun/ch32v003fun.h"
+#include"../ch32v003fun/ch32v003fun.h"
 
 
 
-- 
GitLab