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