不韋 呂 / UITDSP_ADDA2

Dependents:   UITDSP_ADDA_Example2

Committer:
MikamiUitOpen
Date:
Mon Mar 16 23:59:49 2015 +0000
Revision:
1:e997f4e94491
Parent:
0:46d099dfd9d6
2

Who changed what in which revision?

UserRevisionLine numberNew 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