#include #include "DeviceConfig1.h" // pin declarations int sckPin = 13; int sdioPin = 11; //teensy MOSI pin int sdoPin = 12; //teensy MISO pin int csb1Pin = 7; // LMK , 1st from the top int csb2Pin = 8; // DAC, 2nd from the top const int transferDelay = 5000; void setup() { // put your setup code here, to run once: pinMode( sckPin, OUTPUT ); pinMode( sdioPin, OUTPUT ); pinMode( sdoPin, INPUT ); // ? pinMode( csb1Pin, OUTPUT ); pinMode( csb2Pin, OUTPUT ); digitalWrite(sckPin, LOW); digitalWrite(sdioPin, LOW); digitalWrite(sdoPin, LOW); // ? digitalWrite( csb1Pin, HIGH ); digitalWrite( csb2Pin, HIGH ); // wait to boot delay(1000); //RESETB write_read_Data(0 , 0x00, 0x0, 0); // LMK reset, ... could be 0x80 instead of 0x0 write_read_Data(1 , 0x00, 0x0, 0); // DAC reset //LOAD DEFAULT //LMK for( int i = 0; i < LMK_NUM_REGISTERS; i++ ){ // LMK_NUM_REGISTERS = 108 write_read_Data(0 , LMK_LOAD_DEFAULT[i][0], LMK_LOAD_DEFAULT[i][1], 0); // write write_read_Data(0 , LMK_LOAD_DEFAULT[i][0], LMK_LOAD_DEFAULT[i][1], 1); // read } //DAC for( int i = 0; i < DAC_NUM_REGISTERS; i++ ){ // DAC_NUM_REGISTERS = 144 if(i<=6) { write_read_Data(1 , DAC_LOAD_DEFAULT[i][0], DAC_LOAD_DEFAULT[i][1], 0); write_read_Data(1 , DAC_LOAD_DEFAULT[i][0], DAC_LOAD_DEFAULT[i][1], 1); } else { write_read_Data_page(DAC_LOAD_DEFAULT[i][0], DAC_LOAD_DEFAULT[i][1]); write_read_Data_page(DAC_LOAD_DEFAULT[i][0], DAC_LOAD_DEFAULT[i][1]); } } //CONFIGURE DAC //LMK for( int i = 0; i < LMK_NUM_REGISTERS; i++ ){ // LMK_NUM_REGISTERS = 108 write_read_Data(0 , LMK_CONFIG_DAC[i][0], LMK_CONFIG_DAC[i][1], 0); // write write_read_Data(0 , LMK_CONFIG_DAC[i][0], LMK_CONFIG_DAC[i][1], 1); // read } //DAC for( int i = 0; i < DAC_NUM_REGISTERS; i++ ){ // DAC_NUM_REGISTERS = 144 if(i<=6) { write_read_Data(1 , DAC_CONFIG_DAC[i][0], DAC_CONFIG_DAC[i][1], 0); write_read_Data(1 , DAC_CONFIG_DAC[i][0], DAC_CONFIG_DAC[i][1], 1); } else { write_read_Data_page(DAC_CONFIG_DAC[i][0], DAC_CONFIG_DAC[i][1]); write_read_Data_page(DAC_CONFIG_DAC[i][0], DAC_CONFIG_DAC[i][1]); } } //RESET DAC & SYSREF TRIGGER //LMK for( int i = 0; i < LMK_NUM_REGISTERS; i++ ){ // LMK_NUM_REGISTERS = 108 write_read_Data(0 , LMK_RESET_SYSREF[i][0], LMK_RESET_SYSREF[i][1], 0); // write write_read_Data(0 , LMK_RESET_SYSREF[i][0], LMK_RESET_SYSREF[i][1], 1); // read } //DAC for( int i = 0; i < DAC_NUM_REGISTERS; i++ ){ // DAC_NUM_REGISTERS = 144 if(i<=6) { write_read_Data(1 , DAC_RESET_SYSREF[i][0], DAC_RESET_SYSREF[i][1], 0); write_read_Data(1 , DAC_RESET_SYSREF[i][0], DAC_RESET_SYSREF[i][1], 1); } else { write_read_Data_page(DAC_RESET_SYSREF[i][0], DAC_RESET_SYSREF[i][1]); write_read_Data_page(DAC_RESET_SYSREF[i][0], DAC_RESET_SYSREF[i][1]); } } } void write_read_Data(int device, int address, unsigned int data, int rw) { // rw = read or write // select device to write to if ( device == 0 ) digitalWrite(csb1Pin, LOW); // device 0 = lmk else if ( device == 1 ) digitalWrite(csb2Pin, LOW); // device 1 = dac delayMicroseconds(transferDelay); // write R/W bit if (rw==0){ digitalWrite(sdioPin, LOW); delayMicroseconds(transferDelay); digitalWrite(sckPin, HIGH); delayMicroseconds(transferDelay); digitalWrite(sckPin, LOW); delayMicroseconds(2*transferDelay); } else if (rw==1) { digitalWrite(sdioPin, HIGH); delayMicroseconds(transferDelay); digitalWrite(sckPin, HIGH); delayMicroseconds(transferDelay); digitalWrite(sckPin, LOW); delayMicroseconds(2*transferDelay); } // write address if ( device == 1 ) { for ( int i = 6 ; i >= 0 ; i-- ) { // DAC: 7bits address byte bitState = bitRead(address, i); digitalWrite(sdioPin, bitState); delayMicroseconds(transferDelay); digitalWrite(sckPin, HIGH); delayMicroseconds(transferDelay); digitalWrite(sckPin, LOW); delayMicroseconds(2*transferDelay); } } else if ( device == 0 ) { for ( int i = 14 ; i >= 0 ; i-- ) { // LMK: W1, W2 with 13bits address = 15bits byte bitState = bitRead(address, i); digitalWrite(sdioPin, bitState); delayMicroseconds(transferDelay); digitalWrite(sckPin, HIGH); delayMicroseconds(transferDelay); digitalWrite(sckPin, LOW); delayMicroseconds(2*transferDelay); } } // write data if ( device == 1 ) { for ( int i = 15 ; i >= 0 ; i-- ) { // DAC 16bits dara byte bitState = bitRead(data, i); digitalWrite(sdioPin, bitState); delayMicroseconds(transferDelay); digitalWrite(sckPin, HIGH); delayMicroseconds(transferDelay); digitalWrite(sckPin, LOW); delayMicroseconds(2*transferDelay); } } else if ( device == 0 ) { for ( int i = 7 ; i >= 0 ; i-- ) { // LMK 8bits data byte bitState = bitRead(data, i); digitalWrite(sdioPin, bitState); delayMicroseconds(transferDelay); digitalWrite(sckPin, HIGH); delayMicroseconds(transferDelay); digitalWrite(sckPin, LOW); delayMicroseconds(2*transferDelay); } } // stop writing to chosen device if ( device == 0 ) digitalWrite(csb1Pin, HIGH); else if ( device == 1 ) digitalWrite(csb2Pin, HIGH); delayMicroseconds(2*transferDelay); } void write_read_Data_page(int address, unsigned int data) { byte b[2]; b[0] = (address & 0xf000)>>12; //msb, 1st 4 bits page address b[1] = (address & 0x0fff); //Page address write_read_Data(1 , 0x09, b[0], 0); //Rest of DAC data write_read_Data(1 , b[1], data, 0); } void loop() { // put your main code here, to run repeatedly: }