|
|
View previous topic :: View next topic |
Author |
Message |
cbkulatunge
Joined: 22 Oct 2009 Posts: 12
|
dsPIC30F4013 SPI Problem |
Posted: Sun Jan 16, 2011 9:35 pm |
|
|
Hello I'm using AD7780 with dsPIC30F4013.
I'm always getting 0xFFFFFF as a result.
I've tried with 16B mode but no luck
any one can help?
Config. with 20MHz crystal
Code: |
#include <30f4013.h>
#device *=16
#fuses hs2_pll8
#fuses NOWDT
#use delay(clock=80M)
|
This is the initializer subroutine
Code: |
void initz(){
setup_adc_ports(no_analogs);
setup_adc(adc_off);
set_tris_a(0b0000100000000000);
set_tris_b(0b0001111000000000);
set_tris_c(0x00);
set_tris_d(0b0000001100000000);
set_tris_f(0x00);
setup_spi(spi_master|spi_h_to_l|spi_clk_div_4|spi_ss_disabled);
setup_timer1(tmr_internal|tmr_div_by_1);
setup_timer2(tmr_internal|tmr_div_by_1);
setup_timer3(tmr_internal|tmr_div_by_1);
ext_int_edge(h_to_l);
enable_interrupts(int_ext0);
disable_interrupts(int_ext1);
disable_interrupts(int_ext2);
enable_interrupts(int_timer1);
disable_interrupts(int_timer2);
enable_interrupts(int_timer3);
enable_interrupts(intr_global);
}
|
This is the reading subroutine
Code: |
int32 read_7780(){
int aMSB,aMB,aLSB,aStat;
int32 data;
output_high(spi_clk);
output_high(spi_pdrst);
while(input(spi_di));
aStat=spi_read(0);
aMSB=spi_read(0);
aMB=spi_read(0);
aLSB=spi_read(0);
output_low(spi_pdrst);
aMB<<=8;
aLSB= aMB + aLSB;
data=make32(aMSB,aLSB);
return data;
}
|
also tried this
Code: |
int32 read_7780(){
int8 aMSB,aMB,aLSB,aStat;
int32 data;
output_high(spi_clk);
output_high(spi_pdrst);
while(input(spi_di));
aStat=spi_read(0);
aMSB=spi_read(0);
aMB=spi_read(0);
aLSB=spi_read(0);
output_low(spi_pdrst);
data=make32(aMSB,aMB,aLSB);
return data;
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jan 18, 2011 5:34 pm |
|
|
Quote: |
setup_spi(spi_master|spi_h_to_l|spi_clk_div_4|spi_ss_disabled);
|
The parameter in bold is only supposed to be used with an SPI Slave.
If you use it for a Master, it can cause a change in your desired setup.
Delete that parameter.
Quote: |
setup_spi(spi_master|spi_h_to_l|spi_clk_div_4|spi_ss_disabled); |
According to the AD7780 data sheet (on page 5), SCLK idles at a high
level and samples the data on the rising edge. This is SPI Mode 3:
http://www.totalphase.com/support/kb/10045/#modes
I don't have the PCD compiler, so I don't know this for certain, but your
setup_spi() above may be using SPI Mode 2. You need to change it to
Mode 3. |
|
|
cbkulatunge
Joined: 22 Oct 2009 Posts: 12
|
|
Posted: Tue Jan 18, 2011 10:02 pm |
|
|
Thanks for reply bro.
i was able to read data before using 18f452 using config below
Code: |
void initz(){
//ports
output_a(0);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
port_b_pullups(true);
set_tris_a(0b00001011);
setup_spi(spi_master|spi_h_to_l|spi_clk_div_4|spi_ss_disabled);
bit_set(trisc,2);
set_tris_e(0b00000000);
set_tris_a(0b00001011);
bit_clear(trisb,3);
output_low(pin_b3);
output_high(pin_a2);
set_timer0(0x3d);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
disable_interrupts(GLOBAL|INT_TIMER0);
}
|
|
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Jan 19, 2011 3:07 am |
|
|
To let us know, if your code sets the correct SPI mode or suffers from PCD bugs, you have to tell the PCD version. |
|
|
cbkulatunge
Joined: 22 Oct 2009 Posts: 12
|
|
Posted: Wed Jan 19, 2011 3:46 am |
|
|
I'm using PCD 4.093 in MPLAB 8.60 IDE.
I also tried this
Code: |
#word SPI1STAT = 0x220
#word SPI1CON = 0x222
#word TRISF = 0x2DE
bit_set(TRISF,2);
bit_clear(TRISF,6);
bit_set(spi1stat,15);
SPI1CON=0b0000000001111110;
|
|
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Jan 20, 2011 1:29 pm |
|
|
Quote: | I don't have the PCD compiler, so I don't know this for certain, but your
setup_spi() above may be using SPI Mode 2. You need to change it to
Mode 3. | With older PCD versions,
SPI_H_TO_L refers to mode 3, as required. The meaning has been changed around V4.109 to mode 2 according
to usual definition for 8-Bit PICs.
Code: | bit_set(TRISF,2);
bit_clear(TRISF,6);
bit_set(spi1stat,15);
SPI1CON=0b0000000001111110; |
Quote: |
The dsPIC manual clarifies:
Most serial communication peripherals, when enabled, take full control of the I/O pin, so that the input pins associated
with the peripheral cannot be affected through the corresponding PORT registers. |
This applies e.g. to SPI. In so far, presetting the clock input has no effect after SPI setup has been executed.
Enabling the SPI port should be always the last step in setup, some control settings may be ignored otherwise.
Apart from this points, I don't see other issues with your code. Normally, one would start hardware debugging at this
point, e.g. check if the SPI clock is operated, if data are send by the ADC, and so on. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|