//**************************************************************** //Title: 10 BIT DAC USING SPI1 TO LTC1661 * // implementing math.h for float opaerations * //Authors: Travis Chandler (based on Chapters 13 and 16 // of Mazidi & Causey HCS12 textbook * // Shujen Chen (converted to Tower 02/07/2013 * //Date: 03-19-10 and 02-07-2013 * //Platform: Freescale TWR-S12G128 + Axiom TWR-DEV-PERIPH * // HCS12 MC9S12G128 * //Compiler: Feescale CodeWarrior IDE v5.9.0 * // Build 5294 1993-2007 * // Freescale Semiconductor, Inc. * //Description: Closed loop sending 1 kHz sine wave to * // peripheral board LTC1661 via SPI1 * // output to DAC A/B. * //Use Scope to see the sinewave output * //**************************************************************** //When creating project in CodeWarrion, make sure you choose: //minimal setup code, //small, AND //float is IEEE32. double is IEEE32 //Last modified by Mazidi (8-05-2013) #include //common defines and macros #include "derivative.h" //derivative-specific definitions */ #include // #define frequency 1000 //FLOATING POINT DEFINES AND MACROS #define Samples_per_period 40000/frequency //CHANGE THIS TO CHANGE SAMPLE FREQUENCY void SPI_ini(void); // // void main(void){ double my_double; //VARIABLE TO HOLD FLAOTING POINT DATA unsigned int i, my_int; //VARIABLE TO HOLD INT CONVERTIONS OF FLOATING POINT DATA unsigned char msb, lsb; unsigned int int_array[Samples_per_period]; //GLOBAL ARRAY TO HOLD LOOKUP TABLE SPI_ini(); for(i = 0; i > 6 ; //POSITION MSB OF 10 BIT TO BE MASKED msb = my_int & 0x000F; //GET MSB OF 10 BIT DAC //BITS 15, 14, 13, AND 12 ARE CMD FOR LTC1661 msb |= 0xF0; //Ah IS THE LTC1661 CMD TO WRITE TO DAC B AND UPDATE THE OUTPUT //CHANGE TO 0x90 TO SEND TO DACA //OR 0xF0 TO SEND SAME DATA TO BOTH DAC A AND B PTJ_PTJ3 = 0; //SET CS LOW TO START 16 BIT TRANSFER while (!SPI1SR_SPTEF); // wait until data reg empty SPI1DR = msb; // sends out a character onto the MOSI pin while (!SPI1SR_SPIF); // wait for 8-bits to shift out msb = (unsigned char)SPI1DR; // dummy read to reset SPIF flag while (!SPI1SR_SPTEF); // wait until data reg empty SPI1DR = lsb; // sends out a character onto the MOSI pin while (!SPI1SR_SPIF); // wait for 8-bits to shift out lsb = (unsigned char)SPI1DR; // dummy read to reset SPIF flag PTJ_PTJ3 = 1; //SET CS LOW TO END TRANFER SESSION } } } void SPI_ini(void){ DDRJ_DDRJ3 = 1; //PORTJ 1 IS USED FOR CS OF LTC1661 PTJ_PTJ3 = 1; // slave select pin //SET CS HIGH IT IS ACTIVE LOW SPI1BR = 0x00; //0x00 => 6.25Mhz/1 = 6.25Mhz //BUS CLOCK 6.25MHZ / ((SPPR + 1) * 2^(SPR +1)) SPI1CR1 = 0x50; //SPI INTERUPT DISABLED //ENABLE SPI PORT CONFIGURE AS SERIAL PORT //MASTER MODE //NON INVERTED CLOCK, IDLES LOW //DATA SAMPLE AT RISING EDGE //FIRST CLOCK EDGE DELAY 1/2 CYCLE //DATA TRANSFERD MSB FIRST SPI1CR2 = 0x0; //DEFAULT IS 0, INITIALIZATION IS OPTIONAL }