FastLED 3.9.15
Loading...
Searching...
No Matches
fastspi.h
Go to the documentation of this file.
1#pragma once
2
5
6#ifndef __INC_FASTSPI_H
7#define __INC_FASTSPI_H
8
9#include "FastLED.h"
10
11#include "controller.h"
12#include "lib8tion.h"
13
14#include "fastspi_bitbang.h"
15#include "fl/int.h"
16
17
18
19#if defined(FASTLED_TEENSY3) && (F_CPU > 48000000)
20#define DATA_RATE_MHZ(X) (((48000000L / 1000000L) / X))
21#define DATA_RATE_KHZ(X) (((48000000L / 1000L) / X))
22#elif defined(FASTLED_TEENSY4) || (defined(ESP32) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)) || (defined(ESP8266) && defined(FASTLED_ALL_PINS_HARDWARE_SPI) || defined(FASTLED_STUB_IMPL))
23// just use clocks
24#define DATA_RATE_MHZ(X) (1000000 * (X))
25#define DATA_RATE_KHZ(X) (1000 * (X))
26#else
28#define DATA_RATE_MHZ(X) ((F_CPU / 1000000L) / X)
30#define DATA_RATE_KHZ(X) ((F_CPU / 1000L) / X)
31#endif
32
34//
35// External SPI template definition with partial instantiation(s) to map to hardware SPI ports on platforms/builds where the pin
36// mappings are known at compile time.
37//
39
41
42#if defined(FASTLED_STUB_IMPL)
43
44template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
45class SPIOutput : public fl::StubSPIOutput {};
46
47
48#else
49
50#if !defined(FASTLED_ALL_PINS_HARDWARE_SPI)
52template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
53class SPIOutput : public AVRSoftwareSPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
54#endif
55
57template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
58class SoftwareSPIOutput : public AVRSoftwareSPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
59
60#ifndef FASTLED_FORCE_SOFTWARE_SPI
61
62#if defined(NRF51) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
63template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
64class SPIOutput : public NRF51SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
65#endif
66
67#if defined(NRF52_SERIES) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
68template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
69class SPIOutput : public NRF52SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
70#endif
71
72#if defined(FASTLED_APOLLO3) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
73template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
74class SPIOutput : public APOLLO3HardwareSPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
75#endif
76
77#if defined(ESP32) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
78template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
79class SPIOutput : public ESP32SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
80#endif
81
82#if defined(ESP8266) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)
83template<fl::u8 _DATA_PIN, fl::u8 _CLOCK_PIN, fl::u32 _SPI_CLOCK_DIVIDER>
84class SPIOutput : public ESP8266SPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
85#endif
86
87
88
89
90#if defined(SPI_DATA) && defined(SPI_CLOCK)
91
92#if defined(FASTLED_TEENSY3) && defined(ARM_HARDWARE_SPI)
93
94template<fl::u32 SPI_SPEED>
95class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED, 0x4002C000> {};
96
97#if defined(SPI2_DATA)
98
99template<fl::u32 SPI_SPEED>
100class SPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED, 0x4002C000> {};
101
102template<fl::u32 SPI_SPEED>
103class SPIOutput<SPI_DATA, SPI2_CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<SPI_DATA, SPI2_CLOCK, SPI_SPEED, 0x4002C000> {};
104
105template<fl::u32 SPI_SPEED>
106class SPIOutput<SPI2_DATA, SPI_CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<SPI2_DATA, SPI_CLOCK, SPI_SPEED, 0x4002C000> {};
107#endif
108
109#elif defined(FASTLED_TEENSY4) && defined(ARM_HARDWARE_SPI)
110
111template<fl::u32 SPI_SPEED>
112class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> : public Teensy4HardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED, SPI, 0> {};
113
114template<fl::u32 SPI_SPEED>
115class SPIOutput<SPI1_DATA, SPI1_CLOCK, SPI_SPEED> : public Teensy4HardwareSPIOutput<SPI1_DATA, SPI1_CLOCK, SPI_SPEED, SPI1, 1> {};
116
117template<fl::u32 SPI_SPEED>
118class SPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED> : public Teensy4HardwareSPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED, SPI2, 2> {};
119
120#elif defined(FASTLED_TEENSYLC) && defined(ARM_HARDWARE_SPI)
121
122#define DECLARE_SPI0(__DATA,__CLOCK) template<fl::u32 SPI_SPEED>\
123 class SPIOutput<__DATA, __CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<__DATA, __CLOCK, SPI_SPEED, 0x40076000> {};
124 #define DECLARE_SPI1(__DATA,__CLOCK) template<fl::u32 SPI_SPEED>\
125 class SPIOutput<__DATA, __CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<__DATA, __CLOCK, SPI_SPEED, 0x40077000> {};
126
127DECLARE_SPI0(7,13);
128DECLARE_SPI0(8,13);
129DECLARE_SPI0(11,13);
130DECLARE_SPI0(12,13);
131DECLARE_SPI0(7,14);
132DECLARE_SPI0(8,14);
133DECLARE_SPI0(11,14);
134DECLARE_SPI0(12,14);
135DECLARE_SPI1(0,20);
136DECLARE_SPI1(1,20);
137DECLARE_SPI1(21,20);
138
139#elif defined(__SAM3X8E__)
140
141template<fl::u32 SPI_SPEED>
142class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> : public SAMHardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> {};
143
144#elif defined(AVR_HARDWARE_SPI)
145
146template<fl::u32 SPI_SPEED>
147class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> : public AVRHardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> {};
148
149#if defined(SPI_UART0_DATA)
150
151template<fl::u32 SPI_SPEED>
152class SPIOutput<SPI_UART0_DATA, SPI_UART0_CLOCK, SPI_SPEED> : public AVRUSART0SPIOutput<SPI_UART0_DATA, SPI_UART0_CLOCK, SPI_SPEED> {};
153
154#endif
155
156#if defined(SPI_UART1_DATA)
157
158template<fl::u32 SPI_SPEED>
159class SPIOutput<SPI_UART1_DATA, SPI_UART1_CLOCK, SPI_SPEED> : public AVRUSART1SPIOutput<SPI_UART1_DATA, SPI_UART1_CLOCK, SPI_SPEED> {};
160
161#endif
162
163#elif defined(ARDUNIO_CORE_SPI)
164
165template<fl::u32 SPI_SPEED>
166class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> : public ArdunioCoreSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED, SPI> {};
167
168#endif
169
170#else
171# if !defined(FASTLED_INTERNAL) && !defined(FASTLED_ALL_PINS_HARDWARE_SPI) && !defined(ESP32)
172# ifdef FASTLED_HAS_PRAGMA_MESSAGE
173# pragma message "WARNING: The SPI pins you chose have not been marked as hardware accelerated within the code base. All SPI access will default to bitbanged output. Consult the data sheet for hardware spi pins designed for efficient SPI transfer, typically via DMA / MOSI / SCK / SS pin"
174# else
175# warning "The SPI pins you chose have not been marked as hardware accelerated within the code base. All SPI access will default to bitbanged output. Consult the data sheet for hardware spi pins designed for efficient SPI transfer, typically via DMA / MOSI / SCK / SS pins"
176# endif
177# endif
178#endif
179
180// #if defined(USART_DATA) && defined(USART_CLOCK)
181// template<uint32_t SPI_SPEED>
182// class AVRSPIOutput<USART_DATA, USART_CLOCK, SPI_SPEED> : public AVRUSARTSPIOutput<USART_DATA, USART_CLOCK, SPI_SPEED> {};
183// #endif
184
185#else
186# if !defined(FASTLED_INTERNAL) && !defined(FASTLED_ALL_PINS_HARDWARE_SPI)
187# ifdef FASTLED_HAS_PRAGMA_MESSAGE
188# pragma message "Forcing software SPI - no hardware accelerated SPI for you!"
189# else
190# warning "Forcing software SPI - no hardware accelerated SPI for you!"
191# endif
192# endif
193#endif
194
195#endif // !defined(FASTLED_STUB_IMPL)
196
198
199#endif
central include file for FastLED, defines the CFastLED class/object
Hardware SPI output.
Definition fastspi.h:53
Software SPI output.
Definition fastspi.h:58
deprecated: base definitions used by led controllers for writing out led data
Software SPI (aka bit-banging) support.
Fast, efficient 8-bit math functions specifically designed for high-performance LED programming.
#define FASTLED_NAMESPACE_END
Definition namespace.h:23
#define FASTLED_NAMESPACE_BEGIN
Definition namespace.h:22