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 |