mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI mit PIC18F4550


Autor: Pierre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen
Ich arbeite mit PIC18F4550 und der Compiler C18. Mit den Informationen, 
die auf den Datenblatt liegt habe ich versuch   ein Programm zu 
schreiben. Bei Ausführung wird das Programm an der Stelle den 
While-Schleife blockiert. Was soll ich machen um das Problem zu 
vermeiden.
#include "p18F4550.h"
#include <stdio.h>
#include <delays.h>
#include "Spi_Init.h"
#include "PortConfiguration.h"


  int u08LSend_Data=0x75;

void SPI_Init_Master(void)
{
  SSPSTATbits.SMP=0 ;   //1= Input data sampled at end of data output time
                        //0= Input data sampled at middle of data output time
                      
  SSPSTATbits.CKE=1 ;   //1= Transmit occurs on transition from active to Idle clock state
                        //0= transmit occurs on transition from Idle to active clock state
                      
  SSPCON1bits.WCOL=0 ;  //1= The SSPBUF register is written while it is still transmitting the previous word (must be clear in Software)
                        //0= No collision
                        
  SSPCON1bits.SSPEN= 1; //1= Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
                        //0= Disables serial port and configures these pins as I/O port pins
                        
  SSPCON1bits.CKP=1;    //1= Idle state for clock is a high level
                        //0= Idle state for clock is a low level
                        
 //SSPM3:SSPM0: Master sychronous Serial Port Mode  Select bits
  SSPCON1bits.SSPM3= 0; //0101= SPI Slave mode, clock =SCK pin, SS pin control disabled, ss can be used as I/O pin 
  SSPCON1bits.SSPM2= 0; //0100= SPI slave mode, clock =SCK pin, SS pin control enabled
  SSPCON1bits.SSPM1= 0; //0011= SPI Master mode, clock = TMR2 output/2 
  SSPCON1bits.SSPM0= 1; //0010= SPI Master mode, clock = FOSC/64
                        //0001= SPI Master mode, clock = FOSC/16
                        //0000= SPI Master mode, clock = FOSC/4
  
  PIR1bits.SSPIF=0;    //1= The transmission/reception is complete(must be cleared in software)                    
                       //0= wating to transmit/receive 

                        
 TRISCbits.TRISC7=0;      // Serial Data Out
 TRISBbits.TRISB0=1;      // Serial Data In
 //CLK
 //SS
}


void SPI_MASTER_WRITE(void)
{
    int i=0;
  INTCONbits.GIEH = 0;
    SSPBUF = u08LSend_Data;         // load the register SSPBUF
     if ( SSPCON1bits.SSPOV)       // test if write collision occurred
     {
   return ( -1 );              // if WCOL bit is set return negative #
   }
  else
   {
    while(!SSPSTATbits.BF) ;        // control wenn the register is full
   
    u08LSend_Data= SSPBUF;
    SSPSTATbits.BF=0;               //
    
   } 
   INTCONbits.GIEH = 1;
}

Autor: Daniel P. (ppowers)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> while(!SSPSTATbits.BF);
Ich glaube diese Zeile tut nicht das, was Du vor hast. Das Bit BF ist 
high, wenn der Transfer noch nicht abgeschlossen ist. Ist dieses Bit 
low, kannst Du getrost die Daten senden.
Dein Programm bleibt also bei freiem SPI-Puffer hängen. Mach das 
Ausrufezeichen weg, dann sollte es laufen.

Abgesehen davon kannst Du in einer void-Funktion keinen Wert 
zurückgeben. Die Funktion sollte in diesem Fall als signed int 
deklariert werden.

gruß
daniel

Autor: Pierre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  Daniel P.,
ich habe geändert wie du gemeint hast, trotzdem funktionniert nicht.
Hat jemand ein Beispiel Code für SPI, denn ich suche seit einiger Zeit 
ohne Erfolg.
Grüß

Autor: Sebastian W. (mrhack)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

 zum Thema SPI gibts bei Microchip ein Interessantes PDF
http://ww1.microchip.com/downloads/en/DeviceDoc/spi.pdf

Hattest du schon mal die SPI-lib die beim C18 mit dabei getestet?
#include <spi.h>

Würd mich interessieren, falls du das zum laufen bekommen hast, ich häng 
beim C18 auch noch, bin deshalb im Moment mit'n CCS unterwegs.

btw
SSPSTATbits.BF=0;
 kann nicht beschrieben werden, nur gelesen.


Gruß
 Sebastian

Autor: Pierre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen
ich habe noch probleme mit SPI. das sind meine gesamte code. könnte 
jemand mir helfen
/////Master
#include "p18F4550.h"
#include <stdio.h>
#include <delays.h>
#include "Spi_Init.h"
#include "PortConfiguration.h"
  int u08LSend_Data=0x75;
void SPI_Init_Master(void)
{
  SSPSTATbits.SMP=0 ;   //1= Input data sampled at end of data output time
                        //0= Input data sampled at middle of data output time
                      
  SSPSTATbits.CKE=1 ;   //1= Transmit occurs on transition from active to Idle clock state
                        //0= transmit occurs on transition from Idle to active clock state
                      
  SSPCON1bits.WCOL=0 ;  //1= The SSPBUF register is written while it is still transmitting the previous word (must be clear in Software)
                        //0= No collision
                        
  SSPCON1bits.SSPEN= 1; //1= Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
                        //0= Disables serial port and configures these pins as I/O port pins
                        
  SSPCON1bits.CKP=1;    //1= Idle state for clock is a high level
                        //0= Idle state for clock is a low level            
 //SSPM3:SSPM0: Master sychronous Serial Port Mode  Select bits
  SSPCON1bits.SSPM3= 0; //0101= SPI Slave mode, clock =SCK pin, SS pin control disabled, ss can be used as I/O pin 
  SSPCON1bits.SSPM2= 0; //0100= SPI slave mode, clock =SCK pin, SS pin control enabled
  SSPCON1bits.SSPM1= 0; //0011= SPI Master mode, clock = TMR2 output/2 
  SSPCON1bits.SSPM0= 1; //0010= SPI Master mode, clock = FOSC/64
                        //0001= SPI Master mode, clock = FOSC/16
                        //0000= SPI Master mode, clock = FOSC/4
  PIR1bits.SSPIF=0;    //1= The transmission/reception is complete(must be cleared in software)                    
                       //0= wating to transmit/receive     
 TRISCbits.TRISC7=0;      // Serial Data Out
 TRISBbits.TRISB0=1;      // Serial Data In
 //CLK
 TRISBbits.TRISB1=0;
 //SS
 TRISDbits.TRISD5=0;
}
int SPI_MASTER_WRITE(void)
{
  INTCONbits.GIEH = 0;
  TRISDbits.TRISD5=0;
    SSPBUF = u08LSend_Data;         // load the register SSPBUF
     if ( SSPCON1bits.SSPOV)       // test if write collision occurred
     {
   return ( -1 );              // if WCOL bit is set return negative #
   }
  else
   {
    while(!SSPSTATbits.BF)         // control wenn the register is full
   
   TRISDbits.TRISD5=1;  // CS
      u08LSend_Data= SSPBUF;
      
    SSPSTATbits.BF=0;               //
    return SSPBUF; 
   } 
  INTCONbits.GIEH = 1;
}
/////Slave
#include "p18F4550.h"
#include <stdio.h>
#include <delays.h>
#include "Spi_Init.h"
#include "PortConfiguration.h"

void SPI_INIT_SLAVE(void)
{
  SSPSTATbits.SMP=0 ;   // SPM must be cleared when SPI is used in Slave mode
                      
  SSPSTATbits.CKE=0 ;   //1= Transmit occurs on transition from active to Idle clock state
                        //0= transmit occurs on transition from Idle to active clock state    
  SSPCON1bits.WCOL=0 ;  //1= The SSPBUF register is written while it is still transmitting the previous word (must be clear in Software)
                        //0= No collision     
  SSPCON1bits.SSPEN= 1; //1= Enables serial port and configures SCK, SDO, SDI and SS as serial port pins
                        //0= Disables serial port and configures these pins as I/O port pins             
  SSPCON1bits.CKP=1;    //1= Idle state for clock is a high level
                        //0= Idle state for clock is a low level            
 //SSPM3:SSPM0: Master sychronous Serial Port Mode  Select bits
  SSPCON1bits.SSPM3= 0; //0101= SPI Slave mode, clock =SCK pin, SS pin control disabled, ss can be used as I/O pin 
  SSPCON1bits.SSPM2= 1; //0100= SPI slave mode, clock =SCK pin, SS pin control enabled
  SSPCON1bits.SSPM1= 0; //0011= SPI Master mode, clock = TMR2 output/2 
  SSPCON1bits.SSPM0= 1; //0010= SPI Master mode, clock = FOSC/64
                        //0001= SPI Master mode, clock = FOSC/16
                        //0000= SPI Master mode, clock = FOSC/4
  PIR1bits.SSPIF=0;    //1= The transmission/reception is complete(must be cleared in software)                    
                       //0= wating to transmit/receive         
 TRISCbits.RC7=1;      // Serial Data Out
 TRISBbits.RB0=0;      // Serial Data In
 //CLK
 TRISBbits.TRISB1=1;
 //SS
 TRISDbits.TRISD5=1;
}

int SPI_SLAVE_READ( void )
{
  SSP1BUF = 0x00;                  // initiate bus cycle
  while ( !SSP1STATbits.BF );      // wait until cycle complete
  return ( SSP1BUF );              // return with byte read 
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  while ( !SSP1STATbits.BF );      // wait until cycle complete
>  return ( SSP1BUF );              // return with byte read

SSP1BUF und SSP1STAT gibt es beim 18f4550 nicht.

Autor: Pierre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  holger, habe ich geandert trotzdem funktionniert nicht. wo könnte 
das Problem sein

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das da oben tatsächlich der gesamte Code ist, dann wundert es 
mich nicht, dass dieses "Programm" nicht läuft...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hallo  holger, habe ich geandert trotzdem funktionniert nicht. wo könnte
>das Problem sein

> //SS
> TRISDbits.TRISD5=0;

SS liegt auf PORTA

>  SSPCON1bits.SSPM3= 0; //0101= SPI Slave mode, clock =SCK pin, SS pin control 
disabled, ss can be used as I/O pin
>  SSPCON1bits.SSPM2= 1; //0100= SPI slave mode, clock =SCK pin, SS pin control 
enabled
>  SSPCON1bits.SSPM1= 0; //0011= SPI Master mode, clock = TMR2 output/2
>  SSPCON1bits.SSPM0= 1; //0010= SPI Master mode, clock = FOSC/64

Deine Auswahl ist SS control disabled.

Autor: Christopher L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey mal an alle:

Muss man beim PIC im SPI MASTER MODE das SS (SlaveSelect) selbst 
erzeugen?
Oder generiert es der PIC automatisch an einem PIN? und wenn
wo am SS?
lg
christopher

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.