Class library for internal ADC and DAC connected by SPI. This library support clock generator using TIM3 for switched-capacitor filter to smooth output signal of DAC. This library includes derivative class to support interrupt occured in end of AD conversion. Validated for ST Nucleo F401RE, F411RE. 内蔵 ADC と,SPI 接続の DAC のためのクラスライブラリ.DAC の出力信号を平滑化するためのスイッチトキャパシタフィルタ用のクロックは TIM3 を使用.ST Nucleo F401RE,F411RE で動作を確認.

Dependents:   UITDSP_ADDA_Example UIT2_MovingAv_Intr UIT2_VariableFIR UIT2_VowelSynthesizer ... more

Committer:
MikamiUitOpen
Date:
Fri Feb 20 05:52:03 2015 +0000
Revision:
0:2cdd5c91d975
Child:
4:03c4518de836
1

Who changed what in which revision?

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