Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UIT2_MovingAverage UIT2_AllpassReverb UIT2_CombReverb UIT2_FIR_LPF_Symmetry ... more
DAC_MCP4922.cpp@17:fd4f92ad4323, 2015-01-29 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Thu Jan 29 05:52:57 2015 +0000
- Revision:
- 17:fd4f92ad4323
- Parent:
- 16:0001d3e93bee
- Child:
- 18:0bfced9d5526
18
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| MikamiUitOpen | 0:6e0ed5adfe47 | 1 | //------------------------------------------------------ |
| MikamiUitOpen | 0:6e0ed5adfe47 | 2 | // Class for single DAC in MCP4922 |
| MikamiUitOpen | 0:6e0ed5adfe47 | 3 | // |
| MikamiUitOpen | 17:fd4f92ad4323 | 4 | // 2015/01/29, Copyright (c) 2015 MIKAMI, Naoki |
| MikamiUitOpen | 0:6e0ed5adfe47 | 5 | //------------------------------------------------------ |
| MikamiUitOpen | 0:6e0ed5adfe47 | 6 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 7 | #include "DAC_MCP4922.hpp" |
| MikamiUitOpen | 0:6e0ed5adfe47 | 8 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 9 | namespace Mikami |
| MikamiUitOpen | 0:6e0ed5adfe47 | 10 | { |
| MikamiUitOpen | 0:6e0ed5adfe47 | 11 | DAC_MCP4922::DAC_MCP4922(DAC dac, PinName mosi, PinName sclk, |
| MikamiUitOpen | 16:0001d3e93bee | 12 | PinName cs, PinName ldac) |
| MikamiUitOpen | 0:6e0ed5adfe47 | 13 | : wcr_(dac | 0x3000), spi_(mosi, NC, sclk), |
| MikamiUitOpen | 0:6e0ed5adfe47 | 14 | ld_(ldac, 0), mySpi_((SPI_TypeDef*)NULL) |
| MikamiUitOpen | 0:6e0ed5adfe47 | 15 | { |
| MikamiUitOpen | 0:6e0ed5adfe47 | 16 | if ( (mosi == PA_7) || (mosi == PB_5) ) mySpi_ = SPI1; |
| MikamiUitOpen | 0:6e0ed5adfe47 | 17 | if ( (mosi == PB_15) || (mosi == PC_3) ) mySpi_ = SPI2; |
| MikamiUitOpen | 0:6e0ed5adfe47 | 18 | if ( mosi == PC_12 ) mySpi_ = SPI3; |
| MikamiUitOpen | 0:6e0ed5adfe47 | 19 | |
| MikamiUitOpen | 16:0001d3e93bee | 20 | // Set SPI format |
| MikamiUitOpen | 0:6e0ed5adfe47 | 21 | spi_.format(16, 0); |
| MikamiUitOpen | 16:0001d3e93bee | 22 | // Clock source of F401 for SPI1 : 84 MHz, |
| MikamiUitOpen | 16:0001d3e93bee | 23 | // SPI2, SPI3 : 42 MHz |
| MikamiUitOpen | 16:0001d3e93bee | 24 | mySpi_->CR1 = (mySpi_->CR1 & ~SPI_CR1_BR); |
| MikamiUitOpen | 16:0001d3e93bee | 25 | if (mySpi_ == SPI1) mySpi_->CR1 += SPI_CR1_BR_0; |
| MikamiUitOpen | 16:0001d3e93bee | 26 | #ifdef __STM32F411xE_H |
| MikamiUitOpen | 16:0001d3e93bee | 27 | mySpi_->CR1 += SPI_CR1_BR_0; |
| MikamiUitOpen | 16:0001d3e93bee | 28 | #endif // __STM32F411xE_H |
| MikamiUitOpen | 16:0001d3e93bee | 29 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 30 | // timer prescaler is set same value of boud rate for SPI |
| MikamiUitOpen | 0:6e0ed5adfe47 | 31 | uint16_t psc = (2 << ((mySpi_->CR1 >> 3) & 0x07)) - 1; |
| MikamiUitOpen | 17:fd4f92ad4323 | 32 | if (mySpi_ != SPI1) psc = (psc + 1)*2 - 1; |
| MikamiUitOpen | 17:fd4f92ad4323 | 33 | ss_ = new Tim4_ss(psc, 19, cs); |
| MikamiUitOpen | 0:6e0ed5adfe47 | 34 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 35 | // Set DAC to 0 |
| MikamiUitOpen | 0:6e0ed5adfe47 | 36 | WriteDac(0); |
| MikamiUitOpen | 0:6e0ed5adfe47 | 37 | while (IsBusy()) {} |
| MikamiUitOpen | 0:6e0ed5adfe47 | 38 | } |
| MikamiUitOpen | 0:6e0ed5adfe47 | 39 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 40 | void DAC_MCP4922::Write(float value) |
| MikamiUitOpen | 0:6e0ed5adfe47 | 41 | { |
| MikamiUitOpen | 0:6e0ed5adfe47 | 42 | if (value < -1.0f) value = -1.0f; |
| MikamiUitOpen | 0:6e0ed5adfe47 | 43 | if (value > 1.0f) value = 1.0f; |
| MikamiUitOpen | 0:6e0ed5adfe47 | 44 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 45 | WriteDac((uint16_t)((value + 1.0f)*2047)); |
| MikamiUitOpen | 0:6e0ed5adfe47 | 46 | } |
| MikamiUitOpen | 0:6e0ed5adfe47 | 47 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 48 | void DAC_MCP4922::Write(uint16_t value) |
| MikamiUitOpen | 0:6e0ed5adfe47 | 49 | { |
| MikamiUitOpen | 0:6e0ed5adfe47 | 50 | WriteDac((value > 4095) ? 4095 : value); |
| MikamiUitOpen | 0:6e0ed5adfe47 | 51 | } |
| MikamiUitOpen | 0:6e0ed5adfe47 | 52 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 53 | void DAC_MCP4922::Ldac() |
| MikamiUitOpen | 0:6e0ed5adfe47 | 54 | { |
| MikamiUitOpen | 0:6e0ed5adfe47 | 55 | ld_.write(0); |
| MikamiUitOpen | 0:6e0ed5adfe47 | 56 | ld_.write(0); // ensure width of "L" pulse |
| MikamiUitOpen | 0:6e0ed5adfe47 | 57 | ld_.write(1); |
| MikamiUitOpen | 0:6e0ed5adfe47 | 58 | } |
| MikamiUitOpen | 0:6e0ed5adfe47 | 59 | |
| MikamiUitOpen | 0:6e0ed5adfe47 | 60 | void DAC_MCP4922::WriteDac(uint16_t value) |
| MikamiUitOpen | 0:6e0ed5adfe47 | 61 | { |
| MikamiUitOpen | 0:6e0ed5adfe47 | 62 | ss_->SlaveSelect(); |
| MikamiUitOpen | 0:6e0ed5adfe47 | 63 | mySpi_->DR = value | wcr_; |
| MikamiUitOpen | 0:6e0ed5adfe47 | 64 | } |
| MikamiUitOpen | 8:f933fcd30408 | 65 | |
| MikamiUitOpen | 14:6c60601c1834 | 66 | void DAC_MCP4922::ScfClockTim3(uint32_t clock, PinName pin) |
| MikamiUitOpen | 8:f933fcd30408 | 67 | { |
| MikamiUitOpen | 14:6c60601c1834 | 68 | if ( (pin != PA_6) && (pin != PB_4) && (pin != PB_5) && |
| MikamiUitOpen | 14:6c60601c1834 | 69 | (pin != PC_6) && (pin != PC_7) && (pin != PC_8) && (pin != PC_9) ) |
| MikamiUitOpen | 14:6c60601c1834 | 70 | { |
| MikamiUitOpen | 14:6c60601c1834 | 71 | fprintf(stderr, "\r\nIllegal pin name in DAC_MCP4922::ScfClockTim3()\r\n"); |
| MikamiUitOpen | 14:6c60601c1834 | 72 | while (true) {} |
| MikamiUitOpen | 14:6c60601c1834 | 73 | } |
| MikamiUitOpen | 14:6c60601c1834 | 74 | |
| MikamiUitOpen | 14:6c60601c1834 | 75 | PwmOut clockSCF(pin); |
| MikamiUitOpen | 8:f933fcd30408 | 76 | |
| MikamiUitOpen | 8:f933fcd30408 | 77 | TIM3->ARR = SystemCoreClock/clock - 1; |
| MikamiUitOpen | 8:f933fcd30408 | 78 | TIM3->PSC = 0; |
| MikamiUitOpen | 8:f933fcd30408 | 79 | // Set capture/compare register 2 |
| MikamiUitOpen | 14:6c60601c1834 | 80 | if ( (pin == PA_6) || (pin == PB_4) || (pin == PC_6) ) |
| MikamiUitOpen | 14:6c60601c1834 | 81 | TIM3->CCR1 = (TIM3->ARR + 1)/2; |
| MikamiUitOpen | 14:6c60601c1834 | 82 | if ( (pin == PB_5) || (pin == PC_7) ) |
| MikamiUitOpen | 14:6c60601c1834 | 83 | TIM3->CCR2 = (TIM3->ARR + 1)/2; |
| MikamiUitOpen | 14:6c60601c1834 | 84 | if (pin == PC_8) |
| MikamiUitOpen | 14:6c60601c1834 | 85 | TIM3->CCR3 = (TIM3->ARR + 1)/2; |
| MikamiUitOpen | 14:6c60601c1834 | 86 | if (pin == PC_9) |
| MikamiUitOpen | 14:6c60601c1834 | 87 | TIM3->CCR4 = (TIM3->ARR + 1)/2; |
| MikamiUitOpen | 8:f933fcd30408 | 88 | } |
| MikamiUitOpen | 0:6e0ed5adfe47 | 89 | } |