不韋 呂 / UITDSP_ADDA

Dependents:   UITDSP_ADDA_Example UIT2_MovingAv_Intr UIT2_VariableFIR UIT2_VowelSynthesizer ... more

Committer:
MikamiUitOpen
Date:
Mon Mar 16 23:59:24 2015 +0000
Revision:
4:03c4518de836
Parent:
0:2cdd5c91d975
Child:
5:ff25db28bc64
5

Who changed what in which revision?

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