Class library for internal ADC and DAC connected by SPI. ADC is triggered by TIM2. 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. Slave select of SPI for DAC is generated using TIM4. Validated for ST Nucleo F401RE, F411RE. New version. 内蔵 ADC と,SPI 接続の DAC のためのクラスライブラリ.ADC の変換開始トリガは TIM2 で発生.DAC の出力信号を平滑化するためのスイッチトキャパシタフィルタ用のクロックは TIM3 を使用.DAC の SPI 用スレーブ選択信号は TIM4 で発生.ST Nucleo F401RE,F411RE で動作を確認.新バージョン

Dependents:   UIT2_MovingAverage UIT2_AllpassReverb UIT2_CombReverb UIT2_FIR_LPF_Symmetry ... more

Committer:
MikamiUitOpen
Date:
Mon Feb 02 23:33:01 2015 +0000
Revision:
21:3731753ebf24
Parent:
20:c49f3b565a87
22

Who changed what in which revision?

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