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.
Fork of AD9850 function generator SPI driver by
main.cpp
00001 // MBED driver for AD9850 digital synthesizer using hacked SPI interface 00002 // Original code by Liam Goudge Sept 2013 00003 // Modified for KL25Z by Mike Richards Oct 2013 00004 00005 #include "mbed.h" 00006 00007 00008 SPI device (PTD2, PTD3, PTD1); // Set the KL25Z SPI pins 00009 DigitalOut CS(PTD0); // Use pin PTD0 as a fake Chip select 00010 DigitalOut ADReset(PTA13); // Use Pin PTA13 as the reset line for AD9850 00011 00012 00013 Serial pc(USBTX, USBRX); // tx, rx for debug terminal 00014 00015 int reverseBits (int source) 00016 { 00017 // Unfortunately need to invert bit order of the desired frequency setting since MBED only allows for MSB first from SPI. We need LSB first for AD9850 00018 int mask=0;; 00019 int i=0; 00020 int target=0; 00021 int bitTarget=0x80000000; // Hard-wired for 32-bit inversion 00022 00023 for (i=0;i<32;i++) { // ditto 00024 mask=1<<i; 00025 bitTarget=1<<(31-i); // ditto 00026 00027 if (source & mask) 00028 target=target | bitTarget; 00029 } 00030 return target; 00031 } 00032 00033 void writeSPI(int frq, int phase) 00034 { 00035 // Send the 40-bit packet. NB: KL25Z only supports 8-bit SPI so send five 8-bit packets 00036 00037 device.format(8,0); // 8-bits per packet, mode 0 (CPOL=0 CPHA=0) 00038 device.frequency(1000000); //SPI clock set to 1MHz 00039 00040 wait_ms(1); 00041 00042 // First do chip select. Need to use a GPIO to fake the chip select since MBED doesn't allow to set positive logic CS signal 00043 CS=1; // assert chip select (a.k.a FQ_UD frequency update input to AD9850) 00044 wait_ms(1); 00045 CS=0; 00046 00047 device.write(frq>>24); // Write upper 8-bits 00048 device.write(frq>>16); 00049 device.write(frq>>8); 00050 device.write(frq); // Now the last 8 bits 00051 device.write(phase); // This is phase and factory settings byte 00052 00053 // Now pulse FQ_UD again to load the word into the DDS 00054 CS=0; 00055 wait_ms(1); 00056 CS=1; 00057 wait_ms(1); 00058 CS=0; 00059 } 00060 00061 00062 int main() 00063 { 00064 // This routine produces a continuous frequency sweep 00065 int targetFrq=0x147AE148; // Frequency word = ([Desired freq in MHz] * 34.3597384) 00066 int increment=0xD6B; //100Hz step 00067 00068 // Reset the AD9850. Active high logic. Minimum reset period 5 clock cycles (5/125MHz) 00069 ADReset=0; 00070 wait_ms(5); 00071 ADReset=1; 00072 wait_ms(5); 00073 ADReset=0; 00074 00075 while(1) 00076 { 00077 00078 00079 00080 while (targetFrq<0x148bFFFF) // up to 10.001MHz 00081 { 00082 writeSPI(reverseBits(targetFrq),0); // Don't use phase so set to zero. 00083 targetFrq=targetFrq+increment; 00084 //wait_ms(200); 00085 } 00086 00087 while (targetFrq>0x147AE148) // down to 10MHz 00088 { 00089 writeSPI(reverseBits(targetFrq),0); 00090 targetFrq=targetFrq-increment; 00091 //wait_ms(200); 00092 } 00093 00094 } 00095 00096 00097 }
Generated on Thu Jul 21 2022 13:49:34 by
1.7.2
