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
16
17
18#if defined(FASTLED_TEENSY3) && (F_CPU > 48000000)
19#define DATA_RATE_MHZ(X) (((48000000L / 1000000L) / X))
20#define DATA_RATE_KHZ(X) (((48000000L / 1000L) / X))
21#elif defined(FASTLED_TEENSY4) || (defined(ESP32) && defined(FASTLED_ALL_PINS_HARDWARE_SPI)) || (defined(ESP8266) && defined(FASTLED_ALL_PINS_HARDWARE_SPI) || defined(FASTLED_STUB_IMPL))
22// just use clocks
23#define DATA_RATE_MHZ(X) (1000000 * (X))
24#define DATA_RATE_KHZ(X) (1000 * (X))
25#else
27#define DATA_RATE_MHZ(X) ((F_CPU / 1000000L) / X)
29#define DATA_RATE_KHZ(X) ((F_CPU / 1000L) / X)
30#endif
31
33//
34// External SPI template definition with partial instantiation(s) to map to hardware SPI ports on platforms/builds where the pin
35// mappings are known at compile time.
36//
38
40
41#if defined(FASTLED_STUB_IMPL)
42
43
44template<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _SPI_CLOCK_DIVIDER>
45class SPIOutput : public StubSPIOutput {};
46
47
48#else
49
50#if !defined(FASTLED_ALL_PINS_HARDWARE_SPI)
52template<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _SPI_CLOCK_DIVIDER>
53class SPIOutput : public AVRSoftwareSPIOutput<_DATA_PIN, _CLOCK_PIN, _SPI_CLOCK_DIVIDER> {};
54#endif
55
57template<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _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<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _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<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _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<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _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<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _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<uint8_t _DATA_PIN, uint8_t _CLOCK_PIN, uint32_t _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<uint32_t 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<uint32_t SPI_SPEED>
100class SPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<SPI2_DATA, SPI2_CLOCK, SPI_SPEED, 0x4002C000> {};
101
102template<uint32_t SPI_SPEED>
103class SPIOutput<SPI_DATA, SPI2_CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<SPI_DATA, SPI2_CLOCK, SPI_SPEED, 0x4002C000> {};
104
105template<uint32_t 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<uint32_t SPI_SPEED>
112class SPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED> : public Teensy4HardwareSPIOutput<SPI_DATA, SPI_CLOCK, SPI_SPEED, SPI, 0> {};
113
114template<uint32_t SPI_SPEED>
115class SPIOutput<SPI1_DATA, SPI1_CLOCK, SPI_SPEED> : public Teensy4HardwareSPIOutput<SPI1_DATA, SPI1_CLOCK, SPI_SPEED, SPI1, 1> {};
116
117template<uint32_t 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<uint32_t SPI_SPEED>\
123 class SPIOutput<__DATA, __CLOCK, SPI_SPEED> : public ARMHardwareSPIOutput<__DATA, __CLOCK, SPI_SPEED, 0x40076000> {};
124 #define DECLARE_SPI1(__DATA,__CLOCK) template<uint32_t 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<uint32_t 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<uint32_t 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<uint32_t 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<uint32_t 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<uint32_t 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 "No hardware SPI pins defined. All SPI access will default to bitbanged output"
174# else
175# warning "No hardware SPI pins defined. All SPI access will default to bitbanged output"
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 SPI for you!"
189# else
190# warning "Forcing software SPI - no hardware 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