| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| dima2882 
 
 
 Joined: 13 Jul 2005
 Posts: 25
 Location: Maryland
 
 
			    
 
 | 
			
				| SPI communication b/w master-slave PICs |  
				|  Posted: Wed Jul 13, 2005 12:34 pm |   |  
				| 
 |  
				| Hi all, I set up a PIC16F88 to act as an 8-bit parallel port expander linked through SPI to the master PIC18F458. The F88 can read 8-bit parallel data from parallel hardware, such as a CPLD, which is what I used this for. The Master selects the slave, gets its data, and sends it to the PC over the serial port. In this example, all this happens in an infinite loop, but of course that will be changed to suit the particular application.
 
 ***PIC16F88 SLAVE SPI DEVICE CODE***
 
  	  | Code: |  	  | // Configure chip and compiler #include "16F88.h"
 #fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOMCLR
 #use delay(clock=4000000)
 #zero_ram
 #byte PORTA = 5
 // PORTA is a variable mapped to the 8 physical pins of port A of the PIC
 #define   F88_CS   PIN_B5
 
 void main(void)
 {
 // Variables
 int F88data;
 
 // Configure pin direction
 #use fast_io(A)
 #use fast_io(B)
 set_tris_a(0b11111111);
 set_tris_b(0b00111010);
 //PORTA = 0;
 
 // Setup the SPI port
 setup_spi(SPI_SLAVE | SPI_L_TO_H | SPI_CLK_DIV_4);
 
 while(1)
 {
 if(input(F88_CS) == 0)
 {
 F88data = PORTA;
 spi_write(F88data);
 }
 else
 {
 delay_cycles(1);
 }
 
 }
 return;
 }
 | 
 
 ***PIC18F458 MASTER SPI DEVICE CODE***
 
  	  | Code: |  	  | // Configure chip and compiler #include "18F458.h"
 #fuses EC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
 #use delay(clock=16000000)
 #use rs232(baud=57600, xmit=PIN_C6, rcv=PIN_C7)
 #zero_ram
 
 // Aliases for the pins used
 #define   F88_Servo_CS   PIN_B5
 
 #define     F88_Aquire_Time       100
 
 // Function prototypes
 int readF88(void);
 
 void main(void)
 {
 // Variables
 int data;
 
 // Configure pin direction, format is port X, pin 7 => pin 0; 1 is in, 0 is out
 #use fast_io(A)
 #use fast_io(B)
 #use fast_io(C)
 #use fast_io(D)
 #use fast_io(E)
 set_tris_a(0b00000000);
 set_tris_b(0b10000000);
 set_tris_c(0b10010000);
 set_tris_d(0b00000000);
 set_tris_e(0b00000000);
 
 // Initially set all SPI chip selects to disable
 output_high(F88_Servo_CS);         // F88 CS is active low
 
 // Setup the SPI port
 setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
 
 while(1)
 {
 data = readF88();
 printf("This is the data from F88: %d\n",data);
 delay_us(100);
 }
 
 return;
 }
 
 int readF88(void)
 {
 int F88data;
 
 output_low(F88_Servo_CS);                           // select the F88 to begin aquisition of data from external source
 delay_us(F88_Aquire_Time);                           // wait the prescribed aquisition delay
 F88data = spi_read(0);                              // aquire the data from the F88 by sending out a clock
 output_high(F88_Servo_CS);                           // disable the F88
 
 return F88data;
 }
 | 
 
 Last edited by dima2882 on Fri Jul 21, 2006 6:41 am; edited 2 times in total
 |  |  
		|  |  
		| Neutone 
 
 
 Joined: 08 Sep 2003
 Posts: 839
 Location: Houston
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jul 14, 2005 12:49 pm |   |  
				| 
 |  
				| You can buy a chip that does this in hardware. |  |  
		|  |  
		| dima2882 
 
 
 Joined: 13 Jul 2005
 Posts: 25
 Location: Maryland
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Thu Jul 14, 2005 1:56 pm |   |  
				| 
 |  
				| Yes, that is true, in fact Microchip makes those also and it would be a better fit for this particular application. I was trying to go for the PIC-PIC communication angle, and SPI is a good fit for that. I2C would be even better, but there is a lot of I2C code in the forums already. |  |  
		|  |  
		| Breno 
 
 
 Joined: 20 Jul 2006
 Posts: 5
 Location: Belo Horizonte, Brazil
 
 
			        
 
 | 
			
				|  |  
				|  Posted: Thu Jul 20, 2006 2:01 pm |   |  
				| 
 |  
				| Hi dima, this code is actually using PIC's SPI hardware, isn't it? 
 In the "PIC16F88 SLAVE SPI DEVICE CODE" you used a variable called F88_CS, what variable is that? I understand it is the pin that correspond to the Chip Select but it should be defined before, right? And it is connected to the PIN_B5 of the PIC Master, right?
 
 Did you test it? Does it work?
 
 Thanks
  |  |  
		|  |  
		| dima2882 
 
 
 Joined: 13 Jul 2005
 Posts: 25
 Location: Maryland
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Jul 21, 2006 6:39 am |   |  
				| 
 |  
				| Breno, Your're right, F88_CS	does indeed need to be declared. It is a variable equivalent to a pin on the F88 chip, of your choice. When I pasted the code in, I removed some lines that were application-specific, and must have deleted this one by accident:
 
  	  | Code: |  	  | #define   F88_CS      PIN_B5 | 
 This needs to be placed at the top of the file, where the other preprocessor commands are located. The code listing has been subsequently fixed. Yes, this code worked, as I ripped it out of an application.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |