|
18 | 18 | #include <modm/platform.hpp>
|
19 | 19 | #include <modm/architecture/interface/clock.hpp>
|
20 | 20 | #include <modm/driver/inertial/lis3dsh.hpp>
|
| 21 | +#include <modm/math/units.hpp> |
21 | 22 |
|
22 | 23 | using namespace modm::platform;
|
23 | 24 |
|
@@ -47,6 +48,11 @@ struct SystemClock
|
47 | 48 | static constexpr uint32_t Spi5 = Apb2;
|
48 | 49 | static constexpr uint32_t Spi6 = Apb2;
|
49 | 50 |
|
| 51 | + static constexpr uint32_t I2s2 = Spi2; |
| 52 | + static constexpr uint32_t I2s3 = Spi3; |
| 53 | + |
| 54 | + static constexpr uint32_t I2sPll = 86_MHz; |
| 55 | + |
50 | 56 | static constexpr uint32_t Usart1 = Apb2;
|
51 | 57 | static constexpr uint32_t Usart2 = Apb1;
|
52 | 58 | static constexpr uint32_t Usart3 = Apb1;
|
@@ -84,12 +90,17 @@ struct SystemClock
|
84 | 90 | {
|
85 | 91 | Rcc::enableExternalCrystal(); // 8MHz
|
86 | 92 | const Rcc::PllFactors pllFactors{
|
87 |
| - .pllM = 4, // 8MHz / M=4 -> 2MHz |
88 |
| - .pllN = 168, // 2MHz * N=168 -> 336MHz |
| 93 | + .pllM = 8, // 8MHz / M=8 -> 1MHz |
| 94 | + .pllN = 336, // 1MHz * N=336 -> 336MHz |
89 | 95 | .pllP = 2, // 336MHz / P=2 -> 168MHz = F_cpu
|
90 | 96 | .pllQ = 7 // 336MHz / Q=7 -> 48MHz = F_usb
|
91 | 97 | };
|
92 | 98 | Rcc::enablePll(Rcc::PllSource::ExternalCrystal, pllFactors);
|
| 99 | + const Rcc::PllI2sFactors pllI2sFactors{ |
| 100 | + .pllN = 258, // 1 MHz * N=258 -> 258 MHz |
| 101 | + .pllR = 3 // 258 MHz / R=3 -> 86 MHz |
| 102 | + }; |
| 103 | + Rcc::enablePllI2s(pllI2sFactors); |
93 | 104 | // set flash latency for 168MHz
|
94 | 105 | Rcc::setFlashLatency<Frequency>();
|
95 | 106 | // switch system clock to PLL output
|
@@ -144,12 +155,16 @@ using Mclk = GpioOutputC7; // I2S3_MCK
|
144 | 155 | using Sclk = GpioOutputC10; // I2S3_SCK
|
145 | 156 | using Sdin = GpioOutputC12; // I2S3_SD
|
146 | 157 |
|
| 158 | +using DmaTx = Dma1::Channel5; |
| 159 | + |
147 | 160 | using Reset = GpioOutputD4; // Audio_RST
|
148 | 161 | using Scl = GpioB6; // Audio_SCL
|
149 | 162 | using Sda = GpioB9; // Audio_SDA
|
150 | 163 |
|
151 | 164 | using I2cMaster = I2cMaster1;
|
152 |
| -//using I2sMaster = I2sMaster3; |
| 165 | +using I2sMaster = I2sMaster3<DmaTx>; |
| 166 | + |
| 167 | +static constexpr uint8_t I2CAddress = 0x4a; // (0x94 >> 1) |
153 | 168 | /// @}
|
154 | 169 | }
|
155 | 170 |
|
@@ -205,19 +220,22 @@ initializeLis3()
|
205 | 220 | lis3::SpiMaster::setDataMode(lis3::SpiMaster::DataMode::Mode3);
|
206 | 221 | }
|
207 | 222 |
|
208 |
| -/// not supported yet, due to missing I2S driver |
| 223 | +template< modm::frequency_t samplerate=48_kHz, modm::percent_t tolerance=modm::pct(0.019) > |
209 | 224 | inline void
|
210 | 225 | initializeCs43()
|
211 | 226 | {
|
212 |
| -// cs43::Lrck::connect(cs43::I2sMaster::Ws); |
213 |
| -// cs43::Mclk::connect(cs43::I2sMaster::Mck); |
214 |
| -// cs43::Sclk::connect(cs43::I2sMaster::Ck); |
215 |
| -// cs43::Sdin::connect(cs43::I2sMaster::Sd); |
216 |
| - |
| 227 | + cs43::I2sMaster::connect<cs43::Mclk::Mck, cs43::Sclk::Ck, |
| 228 | + cs43::Lrck::Ws, cs43::Sdin::Sd>(); |
| 229 | + cs43::I2sMaster::initialize<SystemClock, samplerate, tolerance>(); |
217 | 230 | cs43::Reset::setOutput(modm::Gpio::High);
|
218 | 231 |
|
219 | 232 | cs43::I2cMaster::connect<cs43::Scl::Scl, cs43::Sda::Sda>();
|
220 | 233 | cs43::I2cMaster::initialize<SystemClock, 100_kHz>();
|
| 234 | + |
| 235 | + cs43::Reset::setOutput(modm::Gpio::Low); |
| 236 | + modm::delay_ms(2); |
| 237 | + cs43::Reset::setOutput(modm::Gpio::High); |
| 238 | + |
221 | 239 | }
|
222 | 240 |
|
223 | 241 | /// not supported yet, due to missing I2S driver
|
|
0 commit comments