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: UITDSP_ADDA_Example UIT2_MovingAv_Intr UIT2_VariableFIR UIT2_VowelSynthesizer ... more
DAC_MCP4921.hpp@4:03c4518de836, 2015-03-16 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Mar 16 23:59:24 2015 +0000
- Revision:
- 4:03c4518de836
- Parent:
- 0:2cdd5c91d975
- Child:
- 5:ff25db28bc64
5
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| MikamiUitOpen | 4:03c4518de836 | 1 | //------------------------------------------------------ |
| MikamiUitOpen | 4:03c4518de836 | 2 | // Class for single DAC in MCP4921 -- Header |
| MikamiUitOpen | 4:03c4518de836 | 3 | // Fast version |
| MikamiUitOpen | 0:2cdd5c91d975 | 4 | // |
| MikamiUitOpen | 4:03c4518de836 | 5 | // Default pin assign |
| MikamiUitOpen | 0:2cdd5c91d975 | 6 | // D11 SPI Master Out Slave In |
| MikamiUitOpen | 0:2cdd5c91d975 | 7 | // D13 SPI Serial Clock |
| MikamiUitOpen | 4:03c4518de836 | 8 | // D10 SPI Slave Select ----------------------- TIM4 |
| MikamiUitOpen | 0:2cdd5c91d975 | 9 | // D12 to MCP4921 LDAC pin |
| MikamiUitOpen | 0:2cdd5c91d975 | 10 | // D9 clock for Switched-capacitor filter ---- TIM3 |
| MikamiUitOpen | 0:2cdd5c91d975 | 11 | // |
| MikamiUitOpen | 4:03c4518de836 | 12 | // Argument cs in constructor must be output of TIM4, |
| MikamiUitOpen | 4:03c4518de836 | 13 | // i.e. D10(PB_6), PB_7, D15(PB_8), or D14(PB_9) |
| MikamiUitOpen | 0:2cdd5c91d975 | 14 | // |
| MikamiUitOpen | 4:03c4518de836 | 15 | // Argument pin in function ScfClockTim3() can be |
| MikamiUitOpen | 4:03c4518de836 | 16 | // PA_6(D12), PB_4(D5), PC_6, PB_5(D4), PC_7(D9), |
| MikamiUitOpen | 4:03c4518de836 | 17 | // PC_8, or PC_9 |
| MikamiUitOpen | 0:2cdd5c91d975 | 18 | // |
| MikamiUitOpen | 4:03c4518de836 | 19 | // 2015/02/02, Copyright (c) 2015 MIKAMI, Naoki |
| MikamiUitOpen | 4:03c4518de836 | 20 | //------------------------------------------------------ |
| MikamiUitOpen | 0:2cdd5c91d975 | 21 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 22 | #ifndef DAC_MCP4921_HPP |
| MikamiUitOpen | 0:2cdd5c91d975 | 23 | #define DAC_MCP4921_HPP |
| MikamiUitOpen | 0:2cdd5c91d975 | 24 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 25 | #include "mbed.h" |
| MikamiUitOpen | 4:03c4518de836 | 26 | #include "tim4_slaveSelect.hpp" |
| MikamiUitOpen | 0:2cdd5c91d975 | 27 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 28 | namespace Mikami |
| MikamiUitOpen | 0:2cdd5c91d975 | 29 | { |
| MikamiUitOpen | 0:2cdd5c91d975 | 30 | class DAC_MCP4921 |
| MikamiUitOpen | 0:2cdd5c91d975 | 31 | { |
| MikamiUitOpen | 0:2cdd5c91d975 | 32 | public: |
| MikamiUitOpen | 0:2cdd5c91d975 | 33 | // Constructor |
| MikamiUitOpen | 0:2cdd5c91d975 | 34 | DAC_MCP4921( |
| MikamiUitOpen | 0:2cdd5c91d975 | 35 | PinName mosi = SPI_MOSI, // D11 |
| MikamiUitOpen | 0:2cdd5c91d975 | 36 | PinName sclk = SPI_SCK, // D13 |
| MikamiUitOpen | 0:2cdd5c91d975 | 37 | PinName cs = SPI_CS, // D10 |
| MikamiUitOpen | 0:2cdd5c91d975 | 38 | PinName ldac = SPI_MISO); // D12 |
| MikamiUitOpen | 0:2cdd5c91d975 | 39 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 40 | // -1.0f <= value <= 1.0f |
| MikamiUitOpen | 0:2cdd5c91d975 | 41 | void Write(float value) |
| MikamiUitOpen | 0:2cdd5c91d975 | 42 | { |
| MikamiUitOpen | 0:2cdd5c91d975 | 43 | if (value < -1.0f) value = -1.0f; |
| MikamiUitOpen | 0:2cdd5c91d975 | 44 | if (value > 1.0f) value = 1.0f; |
| MikamiUitOpen | 4:03c4518de836 | 45 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 46 | WriteDac((uint16_t)((value + 1.0f)*2047)); |
| MikamiUitOpen | 0:2cdd5c91d975 | 47 | } |
| MikamiUitOpen | 0:2cdd5c91d975 | 48 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 49 | // 0 <= value <= 4095 |
| MikamiUitOpen | 0:2cdd5c91d975 | 50 | void Write(uint16_t value) |
| MikamiUitOpen | 0:2cdd5c91d975 | 51 | { WriteDac((value > 4095) ? 4095 : value); } |
| MikamiUitOpen | 0:2cdd5c91d975 | 52 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 53 | // generate LDAC negative-going pulse |
| MikamiUitOpen | 0:2cdd5c91d975 | 54 | void Ldac() |
| MikamiUitOpen | 0:2cdd5c91d975 | 55 | { |
| MikamiUitOpen | 0:2cdd5c91d975 | 56 | ld_.write(0); |
| MikamiUitOpen | 0:2cdd5c91d975 | 57 | ld_.write(0); // ensure width of "L" pulse |
| MikamiUitOpen | 0:2cdd5c91d975 | 58 | ld_.write(1); |
| MikamiUitOpen | 0:2cdd5c91d975 | 59 | } |
| MikamiUitOpen | 0:2cdd5c91d975 | 60 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 61 | // Check busy |
| MikamiUitOpen | 0:2cdd5c91d975 | 62 | bool IsBusy() |
| MikamiUitOpen | 4:03c4518de836 | 63 | { return (mySpi_->SR & SPI_SR_BSY) == SPI_SR_BSY; } |
| MikamiUitOpen | 0:2cdd5c91d975 | 64 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 65 | // Little wait |
| MikamiUitOpen | 0:2cdd5c91d975 | 66 | void Wait() |
| MikamiUitOpen | 4:03c4518de836 | 67 | { __NOP(); __NOP(); __NOP(); } |
| MikamiUitOpen | 4:03c4518de836 | 68 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 69 | // Set clock for switched-capacitor filter |
| MikamiUitOpen | 0:2cdd5c91d975 | 70 | void ScfClockTim3(uint32_t clock, PinName pin = D9); |
| MikamiUitOpen | 0:2cdd5c91d975 | 71 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 72 | protected: |
| MikamiUitOpen | 4:03c4518de836 | 73 | void SlaveSelect() { ss_->SlaveSelect(); } |
| MikamiUitOpen | 0:2cdd5c91d975 | 74 | void WriteSpi(uint16_t value) { mySpi_->DR = value; } |
| MikamiUitOpen | 0:2cdd5c91d975 | 75 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 76 | private: |
| MikamiUitOpen | 0:2cdd5c91d975 | 77 | SPI spi_; // SPI object of mbed |
| MikamiUitOpen | 4:03c4518de836 | 78 | Tim4_ss* ss_; |
| MikamiUitOpen | 0:2cdd5c91d975 | 79 | DigitalOut ld_; // for LDAC |
| MikamiUitOpen | 0:2cdd5c91d975 | 80 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 81 | // Pointer of I2C |
| MikamiUitOpen | 4:03c4518de836 | 82 | SPI_TypeDef* mySpi_; |
| MikamiUitOpen | 4:03c4518de836 | 83 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 84 | // for inhibition of copy constructor |
| MikamiUitOpen | 0:2cdd5c91d975 | 85 | DAC_MCP4921(const DAC_MCP4921&); |
| MikamiUitOpen | 0:2cdd5c91d975 | 86 | // for inhibition of substitute operator |
| MikamiUitOpen | 0:2cdd5c91d975 | 87 | DAC_MCP4921& operator=(const DAC_MCP4921&); |
| MikamiUitOpen | 0:2cdd5c91d975 | 88 | |
| MikamiUitOpen | 0:2cdd5c91d975 | 89 | // for internal use |
| MikamiUitOpen | 0:2cdd5c91d975 | 90 | virtual void WriteDac(uint16_t value) |
| MikamiUitOpen | 0:2cdd5c91d975 | 91 | { |
| MikamiUitOpen | 0:2cdd5c91d975 | 92 | while (IsBusy()) {} |
| MikamiUitOpen | 0:2cdd5c91d975 | 93 | SlaveSelect(); |
| MikamiUitOpen | 0:2cdd5c91d975 | 94 | WriteSpi(value | 0x3000); |
| MikamiUitOpen | 0:2cdd5c91d975 | 95 | } |
| MikamiUitOpen | 0:2cdd5c91d975 | 96 | }; |
| MikamiUitOpen | 0:2cdd5c91d975 | 97 | } |
| MikamiUitOpen | 0:2cdd5c91d975 | 98 | #endif // DAC_MCP4921_HPP |