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.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 0:4a6c8e7e8ea7
- Child:
- 1:25c850668cef
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Mar 20 18:04:55 2015 +0000 @@ -0,0 +1,176 @@ +#include "mbed.h" + +DigitalOut LED_3(LED3); + +/****** +PIN + SPI CONFIG +******/ + +SPI SPI_AFE_ADC_AND_DDS(p5, p6, p7); //SPI0: MOSI, MISO, SCLK +DigitalOut ADC_nCS(p8); //ADC_!CS +DigitalOut DDS_nCS(p15); //DDS_!CS + +SPI SPI_CUR_ADC(p11, p12, p13); //SPI1 - see page 601 of 947 +DigitalOut CUR_nCS(p14); //DDS_!CS + +// These pins control the Phase register and the Frequency register, IF THE DDS IS CONFIGURED TO BE CONTROLLED BY THE PINS, +//BY DEFAULT, AND HOW I HAVE IT CONFIGURED IS TO NOT USE THESE PINS, REPEAT, it does NOT USE THE PINS, instead uses the SPI bus. +// By toggling them after config, you can create PSK, FSK, BPSK... +DigitalOut DDS_PSEL(p16); +DigitalOut DDS_FSEL(p17); + +DigitalOut SQUARE(p18); //currently does nothing, =1 closes switch to SQUARE path that is not populated +DigitalOut DDS(p19); //if=1, DDS output connected to TX_PORT +DigitalOut AFE(p20); //if=1, Electrode routed to Amplification Path + + +#define SSP_SR_TFE (1<<0) +#define SSP_SR_TNF (1<<1) +#define SSP_SR_RFE (1<<2) +#define SSP_SR_RFF (1<<3) +#define SSP_SR_BSY (1<<4) + +void writeReg(uint16_t val){ + __disable_irq(); + + DDS_nCS = 0; + //DDS_nCS0; + + while ( !(LPC_SSP0->SR & SSP_SR_TNF) ); //while ssp is not writable + LPC_SSP0->DR = val; //write this out + while ( (LPC_SSP0->SR & SSP_SR_BSY) ); //wait until transmission is over to pull ncs up + + DDS_nCS = 1; + //DDS_nCS1; + + __enable_irq(); +} + +/****************** +DDS Library ported from https://github.com/arachnidlabs/ad983x/blob/master/ad983x.cpp +******************/ +#define REG_OPBITEN 0x0020 +#define REG_SIGNPIB 0x0010 +#define REG_DIV2 0x0008 +#define REG_MODE 0x0002 +#define SIGN_OUTPUT_MASK (REG_OPBITEN | REG_SIGNPIB | REG_DIV2 | REG_MODE) + +uint16_t m_reg; + +enum SignOutput { + SIGN_OUTPUT_NONE = 0x0000, + SIGN_OUTPUT_MSB = 0x0028, + SIGN_OUTPUT_MSB_2 = 0x0020, + SIGN_OUTPUT_COMPARATOR = 0x0038, +}; + +void setSignOutput(SignOutput out) { + m_reg = (m_reg & ~SIGN_OUTPUT_MASK) | out; + writeReg(m_reg); +} + +enum OutputMode { + OUTPUT_MODE_SINE = 0x0000, + OUTPUT_MODE_TRIANGLE = 0x0002, +}; + +void setOutputMode(OutputMode out) { + if(out == OUTPUT_MODE_TRIANGLE) { + m_reg = (m_reg & ~SIGN_OUTPUT_MASK) | out; + } else { + m_reg &= ~REG_MODE; + } + writeReg(m_reg); +} + +#define REG_FREQ1 0x8000 +#define REG_FREQ0 0x4000 +void setFrequencyWord(bool reg, uint32_t frequency) { + writeReg(0x2000); + writeReg((reg?REG_FREQ1:REG_FREQ0) | (frequency & 0x3FFF)); + writeReg((reg?REG_FREQ1:REG_FREQ0) | ((frequency >> 14) & 0x3FFF)); +} + +#define REG_PHASE0 0xC000 +#define REG_PHASE1 0xE000 +void setPhaseWord(bool reg, uint32_t phase) { + writeReg((reg?REG_PHASE1:REG_PHASE0) | (phase & 0x0FFF)); +} + +#define REG_FSEL 0x0800 +void selectFrequency(bool reg) { + if(reg) { + m_reg |= REG_FSEL; + } else { + m_reg &= ~REG_FSEL; + } + writeReg(m_reg); +} + +#define REG_PSEL 0x0400 +void selectPhase(bool reg) { + if(reg) { + m_reg |= REG_PSEL; + } else { + m_reg &= ~REG_PSEL; + } + writeReg(m_reg); +} + +#define REG_RESET 0x0100 +void reset(bool in_reset) { + if(in_reset) { + m_reg |= REG_RESET; + } else { + m_reg &= ~REG_RESET; + } + writeReg(m_reg); //writes 16 bits over SPI +} + +void begin(){ + reset(true); + writeReg(m_reg); + // Initialize frequency and phase registers to 0 + setFrequencyWord(0, 0); + setFrequencyWord(1, 0); + setPhaseWord(0, 0); + setPhaseWord(1, 0); + reset(false); +} + +/******************* +MAIN +*******************/ +int main() { + //init pins + DDS_PSEL = 0; + DDS_FSEL = 0; + SQUARE = 0; + DDS = 0; + AFE = 0; + LED_3 = 1; + + //nCS lines + DDS_nCS = 1; + CUR_nCS = 1; + ADC_nCS = 1; + + //init spi + SPI_AFE_ADC_AND_DDS.format(16,2); + SPI_AFE_ADC_AND_DDS.frequency(33000000); + + //make sure SPI is setup to mode 2, MSB first + //init DDS + begin(); + //output calculation + //fOut = fMCLK / 2^28 * FREQREG = 16e6 / 2^28 * FREQREG + //FREQREG = fOut * 2^28 / 16e6 = fOut * 16.777216 + setFrequencyWord(0, 134217728); + selectFrequency(0); + + setSignOutput(SIGN_OUTPUT_MSB); + //open the DDS output + SQUARE = 1; + + +}