warren.woolseyiii
Joined: 19 Jul 2013 Posts: 10
|
dsPIC33 SPI interface with external ADC |
Posted: Mon Sep 30, 2013 11:57 am |
|
|
Hi there,
I am using a dsPIC33FJ64GS606 to interface with an external ADC (Texas Instrument's ads1281). I am using the SPI module on the dsPIC33 to interface with the ADC. As of now, I would just like to be able to set the dsPIC33 as the Master, and the ADC as the slave. I am trying to establish a serial clock for the ADC of 648kHz. Using an external oscillator and the on board PLL, I am running a 72.576MHz clock on the dsPIC33, and I am implementing the SPI_CLK_DIV_112 to step down the
frequency to 648kHz for the ADC.
The external oscillator (which operates at 2.592 MHz) is also hooked to the CLK pin (pin 1) on the ADC, and the frequency has been verified (via Oscope). As of right now, I can ONLY see the clock signal for the CLK pin on the ADC, I cannot get the SCLK pin (pin 2) on the ADC to receive the master signal from the dsPIC33. Not only that, I cannot get the dsPIC33 to generate the Master SCLK signal from it's own sCLK pin (PIN_G6), I have checked both with an Oscope.
For the SPI module on my dsPIC33, SCK2 = PIN_G6, SDI2 = PIN_G7, and SDO2 = PIN_G8 (although SD02 is not connected to anything, we designed the board that way because we are only reading values into the SPI module).
So far, I have tried the following trouble shooting methods with no success:
I used the getenv("SPI") function to ensure that the device has an SPI module (even though I already knew this, I did it for sanity's sake).
getenv("SPI") returned true, so the SPI Module was detected, and the pin toggled.
Code: |
int8 spiVal = getenv("SPI");
if (spiVal == TRUE) {
output_high(PIN_F5);
delay_us(100);
output_low(PIN_F5);
} |
Next, I wanted to see if the SCK2 pin was broken, so I wrote a test program to toggle that pin. I was able to toggle the pin just fine (checked with an Oscope).
Code: |
while(1) {
output_high(PIN_G6);
delay_us(100);
output_low(PIN_G6);
} |
I would design a test program to see if I can write out of the SPI, however the SDO2 pin is not connected and the board is not easily modifiable.
As for my hardware/compiler I am using the ICD-U64 debugger, firmware version 2.95. I am using the CCS IDE and compiler, v4.134. As stated above, I am using the dsPIC33FJ64GS606, with the Texas Instruments ads1281 ADC.
Here is my code setting up the SPI module, I am hoping that I cannot get the SCLK to run because of a settings code error or something of the like, any help is greatly appreciated.
Code: |
#INCLUDE <33FJ64GS606.h> //Library for the dsPIC MPU
#DEVICE ICD=3 //ICD Debugger through PGD3/PGC3 Pins
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES EC //Crystal Oscillator @ 2.592MHz
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPUT //No Power Up Timer
#FUSES NOJTAG //JTAG disabled
#FUSES PR_PLL //Primary Oscillator w/ PLL
#USE delay(oscillator=2.592MHz, clock=72.576MHz) //External Crystal Oscillator @ 2.592MHz w/ PLL for 72.576MHz
void main() {
setup_spi2(SPI_MASTER | SPI_CLK_DIV_112);
while (1);
} |
|
|