| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				| SPI to get data from compass |  
				|  Posted: Fri Aug 11, 2006 1:19 pm |   |  
				| 
 |  
				| I can't get data from the compass: 
 What I got are:
 
 X=0
 
 Y=0
 
 Can anybody help?
 I am new to PIC
 
 Thanks
 
 
 Here is my code:
 
  	  | Code: |  	  | #include <16F877.h> #fuses XT,NOWDT,NOPROTECT,NOLVP
 #use delay(clock = 4000000)
 #use rs232(baud = 9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
 
 unsigned int   xdata,ydata,hdg_data;    //8-bit unsigned data type
 
 #define _cs      PIN_B1         //Active Low
 #define ser_out   PIN_C5
 #define ser_in   PIN_C4
 #define clk      PIN_C3
 
 //******Initialization********
 void init(void)
 {
 output_high(_cs);
 delay_us(1);
 output_low(clk);
 delay_us(1);
 output_low(ser_out);
 delay_us(1);
 output_low(ser_in);
 setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
 }
 
 
 //*******Get xdata**************
 void get_xdata()
 {
 output_low(_cs);
 delay_us(1);
 output_high(clk);
 delay_us(1);
 spi_write(0x0B);
 delay_us(100);
 spi_write(0x0C);
 delay_ms(20);
 xdata=spi_read();
 delay_us(100);
 output_low(clk);
 delay_us(1);
 output_high(_cs);
 delay_ms(10);
 
 printf("\n\rX: %u\n\r",xdata);
 
 
 }
 
 
 //*******Get ydata**************
 void get_ydata()
 {
 output_low(_cs);
 delay_us(1);
 output_high(clk);
 delay_us(1);
 spi_write(0x0D);
 delay_us(100);
 spi_write(0x0E);
 delay_ms(20);
 ydata=spi_read();
 delay_us(100);
 output_low(clk);
 delay_us(1);
 output_high(_cs);
 delay_ms(10);
 
 printf("\n\rY: %u\n\r",ydata);
 
 
 }
 //*********main***********
 main()
 {
 delay_ms(20);
 init();
 
 
 
 while(1)
 {
 
 
 get_xdata();
 delay_ms(20);
 get_ydata();
 
 
 
 
 
 }
 
 }
 
 
 | 
 
 My compass is PNI-V2Xe from PNI corporation.
 
 Connected to PIC as follow:
 
 PNI_SCLK-----------PIC_RC3
 PNI_MISO-----------PIC_RC4
 PNI_MOSI-----------PIC_RC5
 PNI_SSNOT---------PIC_RB1
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Aug 11, 2006 1:48 pm |   |  
				| 
 |  
				| I didn't look at your code in detail, but your SPI mode is incorrect.  The PNI-V2Xe data sheet shows that the chip operates in Mode 0 (page 18):
 https://www.pnicorp.com/downloadResource/c4b6/datasheets/73/v2xebook.pdf
 You have it configured for Mode 2.   I suggest that you configure the
 SPI with the #define statements shown below.  Then it's very clear
 as to what mode is being used:
 
 
  	  | Code: |  	  | #define SPI_MODE_0_0 0x4000
 #define SPI_MODE_0_1 0x0000
 #define SPI_MODE_1_0 0x0010
 #define SPI_MODE_1_1 0x4010
 
 //======================================
 void main()
 {
 setup_spi(SPI_MASTER | SPI_MODE_0_0 | SPI_CLK_DIV_16);
 
 while(1);
 }
 | 
 
 There might be other problems in your code.   I didn't look for more.
 |  |  
		|  |  
		| Guest 
 
 
 
 
 
 
 
			
			
			
			
			
			
			
			
			
 
 | 
			
				|  |  
				|  Posted: Fri Aug 11, 2006 2:14 pm |   |  
				| 
 |  
				| I didn't look too much either but if you are using hardware SPI you should not ever have to output_ anything on the CLK line. Its handled by hardware. 
 I've never put 1us delays in between my CS and data before. Every SPI device I have ever used has had >100nS propogation between CS set asserted and CS hold.
 
 If you were at 80Mhz you might actually need to delay a few cycles.
 
 If you have the time it doesn't hurt to leave it there I guess, but you are only 4Mhz anyway so why bother?
 
 My point of view is from working on mostly time sensitive projects. I usually can not stop what I'm going even for 1uS.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |