Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

SPI Hardware sur PIC18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » mer. 18 nov. 2020 10:00

bonjour,

J'ouvre ici un nouveau post consacré au 18F27K42 (serie 18Fxxk42 )
et au SPI , specifique aussi par rapport au classique
:sifflotte: ( et easy ) 18F26K22
J'ai adapté mon programme de gestion LCD ILLI9341 18F26K22 comme exemple
à développer ici , si il y a des utilisateur de ce PIC costaud .

Le point clé etant UNIQUEMENT la gestion de base du SPI ( protocole de dialogue avec le LCD)
Le code global etant quasiment le meme qu'avec le 18F26K22
à noter que , pour une fois, la lib SPI mikroC serait plus performante qu'avec
MPLABX , si j'en crois le forum Microchip. et les problemes remontés au sujet du (complex) 18F27K42.

il me reste un petit bug à trouver ? ..
petit cra cra se rajoutant sur certains caracteres (visible de pres!)
mais oops j'ai aussi 20cm de fillasse pour les connections !
Aide toi, le ciel ou FantasPic t'aidera

SPI Hardware sur PIC18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » jeu. 30 nov. 2023 16:40

Bonjour ,

je reviens sur ce post , suite à d'autres test sur le SPI1 Hardware du 18F27K42

modif :
suppression du petit cra cra observé sur affichage texte

void DrawText(uint16_t x, uint16_t y, unsigned char * s, uint16_t color)
{
int currx;
int m;
unsigned int k,l;
currx = x;
l=strlen(s);
if (l>= cfont.MaxC) l= cfont.MaxC;
// Print every character in string
for (k = 0; k < l; k++)
{
m= DrawChar(currx, y, *(s+k), color);
// currx=currx + m + 1; <---- was
currx=currx + m;
}
}

================================================

De plus les applications OLED displays n'etaient pas concernées par la LECTURE SPI !

Difficlutés de transcrire mon application MikroC avec 18F45K22 concernant la gestion d'un lecteur de carte RFID RC222
en version MPLAXB XC8 ....
Malgré une sequence d' init idem sur la trame emision SPI MOSI RC5, ( observée via mon analyser logique SQA)
je ne recupere pas les bonnes données en MISO RC4 .. et donc pas de reponse du lecteur RFID.
Apres maintes recherches , et surtout , apres une relecture de la Datasheet 18F27K42 section SPI ...
J'ai finalement constaté que le SPI était par défaut en FULL DUPLEX
=> émission relue sur la reception !


Passage du SPI Full Duplex en SIMPLE TRANSFERT // on emet..puis on ecoute
=> dialogue OK
On revient à l'equivalent du simple MSSP du 18F45K22
.. et comportement OK du lecteur de carte
Version 18F27K42 MPLABX XC8 avec details sur ma page web (a vec code complet).

Je mets néamoins l'essentiel ici:

Init SPI

Code : Tout sélectionner

 #define MFRC522_CS LATBbits.LATB5 
    RC3PPS  =0x1E;      //RC3  (SCK)
    RC5PPS = 0x1F;      //RC5->MOSI SPI1:SDO1; 
    SPI1SDIPPS = 0x14;  //RC4->MISO  SPI1:SDI1;   was 0x14
    SPI1SSPPS = 0x12; //RC2->SS1
    RC2PPS = 0x20; //RC2->SS1    


Code : Tout sélectionner

    CPrint(" Init SPI1  clock 1 Mhz \r\n");
    SPI1CLK = 0x00;     // SPI Clock Source Fosc (64MHz)
    SPI1BAUD = 31;      // SPI Clock = 64MHz / (2*(BAUD+1)) = 1MHz;
    //SPI1BAUD = 15;      // SPI Clock = 64MHz / (2*(BAUD+1)) = 2MHz;
    SPI1TWIDTH = 0x00;  // 8b wide
    SPI1CON1 = 0b11000000;//  SMP=1, CKE=1, CKP=0, FST=0, SS/SDI/SDO act hi
    SPI1CON2 = 0x03;    // SS don't care, TXR=1, RXR=1 (legacy mode)
    SPI1CON0= 0x83;     // En SPI1, MSB, Master, BMODE=1    


Code : Tout sélectionner


char SPI1_Read_Byte 
(void)
{
   char rep=0;
    SPI1TCNTH=0;
    SPI1TCNTL=1;   
    SPI1CON2bits
.TXR=0;
    SPI1CON2bits.RXR=1;
    while (!PIR2bits.SPI1RXIF)// Check for any SPI Receive Interrupts;
    {__asm("NOP");
    }; 
    rep
=SPI1RXB;
  return (rep); // Return data from SPI Receive Buffer Register;
}


void  SPI1_WriteByte(char bb) 
{
    SPI1STATUSbits.CLRBF = 1;   // clearing the RXFIFO and TXFIFO buffers
    SPI1TCNTH = 0;
    SPI1TCNTL = 1;         // One byte transfert counter
    SPI1CON2bits.RXR=0;
    SPI1CON2bits.TXR=1;
    SPI1CON0bits.EN = 1;   // enable SPI1 peripheral
    SPI1TXB =bb;        // write the data into the output buffer
     while (SPI1CON2bits.BUSY)
     { __asm("NOP");
     }; // wait until completed
 }


je voulais utiliser aussi l'OLED CG9A01 , mais le format ROND n'est pas optimum pour cela..
un ecran LCD 2 (ou 4 ) lignes (en SPI!) serait mieux approprié ...
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 38 invités