Skip to content

Commit 3bb021d

Browse files
ledneczkirleh
authored andcommitted
[board] Adapt STM32F4-Disco BSP for I2S DAC CS43L22
1 parent d51569b commit 3bb021d

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

src/modm/board/disco_f407vg/board.hpp

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <modm/platform.hpp>
1919
#include <modm/architecture/interface/clock.hpp>
2020
#include <modm/driver/inertial/lis3dsh.hpp>
21+
#include <modm/math/units.hpp>
2122

2223
using namespace modm::platform;
2324

@@ -47,6 +48,11 @@ struct SystemClock
4748
static constexpr uint32_t Spi5 = Apb2;
4849
static constexpr uint32_t Spi6 = Apb2;
4950

51+
static constexpr uint32_t I2s2 = Spi2;
52+
static constexpr uint32_t I2s3 = Spi3;
53+
54+
static constexpr uint32_t I2sPll = 86_MHz;
55+
5056
static constexpr uint32_t Usart1 = Apb2;
5157
static constexpr uint32_t Usart2 = Apb1;
5258
static constexpr uint32_t Usart3 = Apb1;
@@ -84,12 +90,17 @@ struct SystemClock
8490
{
8591
Rcc::enableExternalCrystal(); // 8MHz
8692
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
8995
.pllP = 2, // 336MHz / P=2 -> 168MHz = F_cpu
9096
.pllQ = 7 // 336MHz / Q=7 -> 48MHz = F_usb
9197
};
9298
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);
93104
// set flash latency for 168MHz
94105
Rcc::setFlashLatency<Frequency>();
95106
// switch system clock to PLL output
@@ -144,12 +155,16 @@ using Mclk = GpioOutputC7; // I2S3_MCK
144155
using Sclk = GpioOutputC10; // I2S3_SCK
145156
using Sdin = GpioOutputC12; // I2S3_SD
146157

158+
using DmaTx = Dma1::Channel5;
159+
147160
using Reset = GpioOutputD4; // Audio_RST
148161
using Scl = GpioB6; // Audio_SCL
149162
using Sda = GpioB9; // Audio_SDA
150163

151164
using I2cMaster = I2cMaster1;
152-
//using I2sMaster = I2sMaster3;
165+
using I2sMaster = I2sMaster3<DmaTx>;
166+
167+
static constexpr uint8_t I2CAddress = 0x4a; // (0x94 >> 1)
153168
/// @}
154169
}
155170

@@ -205,19 +220,22 @@ initializeLis3()
205220
lis3::SpiMaster::setDataMode(lis3::SpiMaster::DataMode::Mode3);
206221
}
207222

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) >
209224
inline void
210225
initializeCs43()
211226
{
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>();
217230
cs43::Reset::setOutput(modm::Gpio::High);
218231

219232
cs43::I2cMaster::connect<cs43::Scl::Scl, cs43::Sda::Sda>();
220233
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+
221239
}
222240

223241
/// not supported yet, due to missing I2S driver

src/modm/board/disco_f407vg/module.lb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ def prepare(module, options):
2626
module.depends(
2727
":architecture:clock",
2828
":driver:lis3dsh",
29+
":driver:cs43l22",
2930
":platform:clock",
3031
":platform:core",
32+
":platform:dma",
3133
":platform:gpio",
3234
":platform:i2c:1",
3335
":platform:spi:1",
36+
":platform:i2s:3",
3437
":platform:usb:fs")
3538
return True
3639

0 commit comments

Comments
 (0)