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

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2410
Âge : 72
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#21 Message par paulfjujo » sam. 18 mars 2023 17:50

Bonjour à tous ,

voici la version 18F27K42 en XC8 MPLAB
:-D la version SPI bit bang est OK ...

:mur: mais impossible à ce jour ,d'initialiser l'écran en SPI Hardware
testé à plusieurs vitesses 125Khz, 1Mhz ,4Mhz ...

Ce SPI harware donne du fil à retordre ... beaucoup plus compliqué que sur un 18F26K22 ..
et malgré la discussion sur ce sujet ([PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V) post#26 à 28
et la datasheet sus nommée ...
j'arrive à voir ma sequence d'init OLED ..quasiment la meme au niveau SQA analyser ...mais il n'en veut pas ...
il me semble que le SPI Hardware ne peut se synchroniser que sur le front montant, ou au milieu ... mais pas sur le front descendant ...

Mon analyser logique (50MHz) est peut etre ric rac pour voir certains details temporels ..
utilisé avec un decodeur de protocole SPI .(incorpoé au SQA). qui a peut etre aussi ses faiblesses.
:sifflotte: tout comme le bonhomme !

sur la datasheet OLED GC9A01 page 29, je lis :

Host processor drives the CSX pin to low and starts by setting the D/CX bit on SDA. The bit is read by
GC9A01 on the first rising edge of SCL signal. On the next falling edge of SCL, the MSB data bit (D7) is set
on SDA by the host. On the next falling edge of SCL, the next bit (D6) is set on SDA.


la pin _SC (chip selection) est mise à zero par le MCU ( PIC18F Host)
le _DC bit (choix Commande si 0 ou 1 si data ) est lu sur le front montant de SCL (clock SPI RC3)
et sur le front descendant le bit DATA MSB est lu ( depuis RC5 MOSI MCU ) ... et ainsi de suite pour les autres datas..

:!!: je ne vois pas comment initialiser le SPI pour lecture data sur front descendant ...

idea ! Satinas et DVIPER16 ideas ?

projet MPLAB XC8 2.36 et C99
directive de compilation à valider pour le choix mode Software ou Hardware
#define VERSION "2022-0318"
#define With_SPI_Software // Test OLED OK !
//#define With_SPI_Hardware // problemo

18F27K42_TEST_OLED_GC9A01_SPI_2023.zip


en mode SPI soft bit bang
SQA_Init_OLED_OK_avec_SPI_bit_bang_XC8_20230318.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou FantasPic t'aideras

OLED GC9A01 et SPI Hardw 18F27K42
satinas
Expert
Expert
Messages : 1100
Enregistré en : novembre 2015

#22 Message par satinas » sam. 18 mars 2023 19:52

Hello,

Où est la doc qui parle de ça ?
le _DC bit (choix Commande si 0 ou 1 si data ) est lu sur le front montant de SCL (clock SPI RC3)
et sur le front descendant le bit DATA MSB est lu ( depuis RC5 MOSI MCU ) ... et ainsi de suite pour les autres datas..

:!!: je ne vois pas comment initialiser le SPI pour lecture data sur front descendant ...


Lignes à enlever, réservées au mode slave
SPI1SCKPPS = 0x13; // RC3 SCK ->SPI1:SCK1;
SPI1SSPPS=0x05; // RA5 par defaut

Ligne à enlever, il vaut mieux démarrer en pilotant SS en mode i/o donc avec LATC2
RC2PPS = 0x20; // RC2->SS1

L'avantage de ce nouveau module est de choisir la taille en bits des mots et paquets échangés.
Essaie de tester cela, BMODE = 1 semble se comporter comme les anciens modules spi, 1 seul mot de 8 bits only.
SPIxTCNT write is optional TXR/RXR = 1/1 and BMODE=1. If BMODE=0, a write to SPIxTCNT is required to start
Avec BMODE=1, il envoie des mots de TWIDTH bits (compteur optionnel de mots TCNT décrémenté).
Avec BMODE=0, il envoie TCNT mots de 8 bits puis un mot de TWIDTH bits (j'ai pas compris si TCNT décompte des mots ou des bits).

Code : Tout sélectionner

void My_Init_SPI1(void)
{
  SPI1CON0 = 0x03;    // off, msb first, master, BMODE=1
  SPI1CON1 = 0x00;    // SMP=0, CKE=0, CKP=0, FST=0, SSP=0, SDIP=0, SDOP=0
  SPI1CON2 = 0x03;    // SSET=0, TXR=1, RXR=1
  SPI1CLK  = 1;       // 3->CLKREF 2->MFINTOSC=500Khz 1->HFINTOSC=16Mhz 0->FOSC=64MHz
  SPI1BAUD = 3;       // SPI Speed 16MHz / (2x(3+1)) = 16/8 = 2MHz
  LATCbits.LATC2 = 1; // SS high
  SPI1CON0bits.EN = 1;// on
}

void SendData(Byte c) // SS low par LATC2=0 ayant été fait au préalable
{
  _DC = 1;
  SPI1TXB = c;
  while (!PIR2bits.SPI1RXIF) { }
  c = SPI1RXB;
}

Quand cela marchera, tu pourras tester :
- BMODE = 0 et TCNT.
- le mode Transmit Only avec RXR = 0 (qui devrait aussi marcher avec BMODE=1 et sans TCNT).
- le SS piloté par le module SPI (là on a besoin de TCNT pour savoir quand le transfert est fini).

Il faut ajuster CKE et CKP selon le mode SPI 0 à 3 utilisé par l'afficheur.
Pour la sdcard et les lcds SPI, j'utilise le mode 0 (CKP=0, CKE=1) ou le mode 3 (CKP=1, CKE=0)
Les 2 autres modes sont mode 1 (CKP=CKE=0) et mode 2 (CKP=CKE=1).
En mode 0 et 3, le pic écrit le bit au front descendant, le slave lit au front montant.
En mode 1 et 2, le pic écrit le bit au front montant, le slave lit au front descendant.
https://en.wikipedia.org/wiki/Serial_Pe ... _Interface

PS: Les registres config SPI non renseignés sont à 0 au reset :)

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2410
Âge : 72
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#23 Message par paulfjujo » dim. 19 mars 2023 11:21

bonjour à tous,


Merçi Satinas pour tes éclairements toujours utiles ..

Des nouvelles du Front ( pas national!)

modif init -> usage du mode0
mais .. :sad: RIEN NE SE PASSE !

mais , en même temps que la rosée , l'inspiration du matin !

Suppression des tests SPI préalables à 'init du LCD !
qui devait etre déboussolé par les cdes du test :
CPrint(" SPI HARDW 10 Sequences : 0x01 0x80 0xAA 0x0F 0x55 0xF0 \r\n");
à priori , réutiliser la 1ere commande dans l'init GC9A01
soit SendCmd(0x01) "init logiciel" ne fait pas le menage dans le LCD !
... donc :!!: NE PAS TESTER LE SPI AVANT L'INIT LCD
le mieux est l'ennemi du bien !

Test sur l'init SPI :
SPI à 2MHz ...OK (source FOSC/4=16Mhz)
SPI à 4MHz ..BAD ..(source FOSC/4=16Mhz) oops pas d'init OLED !
SPI à 8MHz ...OK (source FOSC=64Mhz)
:?: resultats assez curieux ! BAD à 4MHZ et OK à 8MHz !

je vais faire des chronos sur effacement d'ecran complet
et/ou chargement image 240x240 65K couleurs .. pour verifier à 8MHz

Code : Tout sélectionner




void My_Init_SPI1
(void)
{
  
SPI1CON0 0x03;    // off, msb first, master, BMODE=1
  
SPI1CON1 0x00;    // SMP=0, CKE=0, CKP=0, FST=0, SSP=0, SDIP=0, SDOP=0
  
SPI1CON2 0x03;    // SSET=0, TXR=1, RXR=1
 // CLKREF :  2->MFINTOSC=500Khz , 1->HFINTOSC=16Mhz  ,0->FOSC=64MHz
 // SPI1CLK  = 1;     //CLKREF =1   
 // SPI1BAUD = 3;     // SPI Speed 16MHz / (2x(3+1)) = 16/8 = 2MHz .. OK
 // SPI1CLK  = 1;    
 // SPI1BAUD = 1;     // SPI Speed 16MHz / (2x(1+1)) = 16/4 = 4MHz .. BAD
  
SPI1CLK  0;       // CLKREF =0  ->FOSC=64MHz
  
SPI1BAUD 3;       // SPI Speed 64MHz / (2x(3+1)) = 64/8 = 8MHz ..OK!!
  //En mode 0 et 3, le pic écrit le bit au front descendant, le slave lit au front montant.
  //En mode 1 et 2, le pic écrit le bit au front montant, le slave lit au front descendant.
  //mode 0 (CKP=0, CKE=1)
  //mode 1 (CKP=CKE=0) 
  //mode 2 (CKP=CKE=1).       
  //mode 3 (CKP=1, CKE=0)
  
SPI1CON0bits.BMODE=1;
  
SPI1CON1bits.CKP=0;  
  
SPI1CON1bits.CKE=1;
  
LATCbits.LATC2 1// SS high
  
SPI1CON0bits.EN 1;// on
}

void SendData(Byte c// SS low par LATC2=0 ayant été fait au préalable
{
  
_DC 1;
  
SPI1TXB c;
  while (!
PIR2bits.SPI1RXIF) { };
  
SPI1RXB;
}

void SendCmd(Byte c// SS low par LATC2=0 ayant été fait au préalable
{
  
_DC 0;
  
SPI1TXB c;
  while (!
PIR2bits.SPI1RXIF) { };
  
SPI1RXB;



à priori on n' a pas de notion d'esclave ,ni on ne se sert de lecture du OLED,
hormis si on voulait recuperer les infos ID1,2,3, ..
Il me semble qu'on peut inhiber completement la partie SS ( pas ceux avec la croix !)
SPI1CON2bits.SSET=1; // 1 = SS(out) is driven to the active state continuously ?

SPI_Hardware_18F27K42_Diagram.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou FantasPic t'aideras

OLED GC9A01 et SPI Hardw 18F27K42
satinas
Expert
Expert
Messages : 1100
Enregistré en : novembre 2015

#24 Message par satinas » dim. 19 mars 2023 12:01

Bonjour,
En fait je ne vois pas l'intérêt de générer automatiquement le slave select, puisque le plus souvent on le descend avant d'envoyer une flopée de données, c'est peu de chose. Nécessaire si on fait du DMA peut être.

Par contre le port parallèle des pics plus évolués permet de générer automatiquement le strobe de validation, on peut donc simplifier et accélérer le transfert d'un buffer vers l'afficheur, testé sur l'afficheur Arduino parallèle 8 bits. Sans compter l'emploi du DMA, que je n'ai pas pu tester, mais je connais quelqu'un pas loin qui va s'y coller sur SPI :-)

Il y a un exemple de DMA SPI dans la doc "Using the SPI Module on 8-Bit PIC® Microcontrollers".
Autre chose, en mode Transmit Only, il doit falloir attendre entre les écritures du registre SPIxTBX, ton premier programme en tenait compte. Je n'ai pas trouvé la taille du TXFIFO.

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2410
Âge : 72
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#25 Message par paulfjujo » dim. 19 mars 2023 14:19

Test OK avec SPI à 8MHz

Transfert d'une image BMP240x240 65K couleurs en RGB565 --> 250 mS
verifié avec SQA analyser..

SQA_Ecriture_BMP_240x240_SPI_Hardw_18F27K42.jpg


l'effacement d'ecran ..dure aussi 18mS !
y a pas photo, le SPI Hardware demenage ...
Le seul probleme est qu'on a que 128K de flash ..1 seule image à la fois
:sifflotte: il reste la SD card au dos du module ...
et le DMA à tester !

mais je vais en rester là, pour l'instant ..
le Squelette 18F27K42 en SPI Hardw est OK , finalement prêt .. à etre habillé avec d'autres fonctionalités.

Je vais pouvoir retourner sur le sujet Audiophone ...

:!!: nota :
il y a beaucoup de warning dans le fichier de compilation ..mais est-ce bien utile de vouloir tous les éradiquer ?
sachant que meme un accent francais ex: "é" genere aussi un warning ..
je finis d'ailleurs à ne plus les ecrire , ces accents !
:sifflotte: .. la poussiere..sous le tapis ! :eek: . .. pas bien .. hein !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le dim. 19 mars 2023 20:39, modifié 1 fois.
Aides toi, le ciel ou FantasPic t'aideras

OLED GC9A01 et SPI Hardw 18F27K42
francois77
Passioné
Passioné
Messages : 298
Enregistré en : avril 2022

#26 Message par francois77 » dim. 19 mars 2023 15:06

:bravo: :bravo: :bravo:

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2410
Âge : 72
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#27 Message par paulfjujo » dim. 19 mars 2023 17:32

:furieux: jamais content !

Pourquoi ne puis-je pas initialiser la vitesse SPI à 4 MHz , soit à partir de FOSC=64Mhz , soit à partir de FOSC/4 16Mhz

// SPI1CLK = 1; //CLKREF =1
// SPI1BAUD = 3; // SPI Speed 16MHz / (2x(3+1)) = 16/8 = 2MHz .. OK
// SPI1CLK = 1;
// SPI1BAUD = 1; // SPI Speed 16MHz / (2x(1+1)) = 16/4 = 4MHz .. BAD
SPI1CLK = 0; // CLKREF =0 ->FOSC=64MHz
SPI1BAUD = 3; // SPI Speed 64MHz / (2x(3+1)) = 64/8 = 8MHz ..OK!!
// SPI1CLK = 0; // CLKREF =0 ->FOSC=64MHz
// SPI1BAUD = 7; // SPI Speed 64MHz / (2x(7+1)) = 64/16 = 4MHz ..NON ! =8MHz ?BAD

je veux tester à 4 MHz, parce que mon analyser logique semble perdre les pedales avec un SPI à 8MHz
nota : le decodage SPI se fait par l'application ScanStudio 4.0.17 SQA IKALOGIC

SQA_18F27K42_TEST_Trame_SPI_HW_8MHz_2023-0319_X.jpg


les valeurs de datas ne correspondent pas aux etats lus visuellement sur le signal MOSI !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou FantasPic t'aideras

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2410
Âge : 72
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#28 Message par paulfjujo » dim. 19 mars 2023 17:52

oops

je me suis rappelé d'un probleme qui concernait la sortie RA6 FOSC Out
sur laquelle la frequence n'etait pas OK ( normale FOSC/4 -> 64/4=16Mhz
probleme de config hardware et registre SLRCONA

Bon dieu mais c'est bien sur ,comme disait l'inspecteur Bourrel !

modif config Init_Harware

SLCONC =0x80; // RC7 =RX UART PORT SPI débridé! idea ! Turbo enclenché

je refais la manip ...

Code : Tout sélectionner


  CPrint
(" TEST signaux SCLK et  MOSI SPI Hardware avec SQA analyser (RA3=Synchro capture)\r\n");
    CPrint(" SPI HARDW Sequence : 0x01 0x10 0X20 0x40 0x80 0xAA 0x0F 0x55 0xF0 \r\n");
    CPrint(" Armer la capture dans 3 sec !\r\n");
    Delay_xSec(3);
    Led_R=0;
        _DC=1;  
        SQA
=1;
        SPI1_WriteByte(0x01); 
        SPI1_WriteByte
(0x10); 
        SPI1_WriteByte
(0x20); 
        SPI1_WriteByte
(0x40); 
        SPI1_WriteByte
(0x80);
        SPI1_WriteByte(0xAA); 
        SPI1_WriteByte
(0x0F);
        SPI1_WriteByte(0x55); 
        SPI1_WriteByte
(0xF0);
         SQA=0;



SQA_18F27K42_TEST_Trame_SPI_HW_8MHz_sans_SLowRate_2023-0319_X.jpg


Analyser OK !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou FantasPic t'aideras

OLED GC9A01 et SPI Hardw 18F27K42
satinas
Expert
Expert
Messages : 1100
Enregistré en : novembre 2015

#29 Message par satinas » dim. 19 mars 2023 18:05

Bravo :-)
j'allais t'écrire de regarder la page 765, je sais pas si c'est lié.
En théorie SCK monte à 10MHz en full-duplex et 16MHz en Transmit Only.
Note 1: SPIxCON1.SMP bit must be set and the slew rate control must be disabled on the clock and data pins
(clear the corresponding bits in SLRCONx register) for SPI to operate over 4 MHz.

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2410
Âge : 72
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#30 Message par paulfjujo » dim. 19 mars 2023 21:02

bonsoir

testé : SPIxCON1.SMP bit must be set :!: ... ne change rien !

Rajout du chronometrage avec SMT1
SPI à 8MHz ?


(20:43:42.426) Init et Test Compteur 24 bits SMT1 sur FOSC 64MHz
(20:43:42.454) Start SMT1 pour __delay_ms(50);
(20:43:42.482) Stop. SMT1 =3200008 soit 50000 uS

(20:43:45.502) Init OLED Rond CG9A01
(20:43:45.502) Start SMT1 pour Init_CG9A01();
(20:43:46.281) Stop. SMT1 =16051236 soit 250800 uS <------ 250mS

(20:43:46.580) Test duree Ecran Noir (SPI 8MHz!) avec SMT1 compteur <----- ~30mS
(20:43:46.879) Duree = 1886808 soit 29481 uS

(16:56:48.064) Test Duree de Chargement image Voltmetre.bmp <------------- 133 mS
(16:56:48.465) Stop. SMT1=8509260 ,soit 132957 uS
(16:56:48.474)


Code : Tout sélectionner


   CPrint
(" Test duree Ecran Noir (SPI 8MHz!) avec SMT1 compteur\r\n"); 
    SMT1_Init
();
    ST=&SMT1_Measure;   // pointeur Byte sur debut entier long 32 bits
    SMT1_Measure=0;
    SMT1STATbits.RST=1;   // init FFFFFF
    SMT1CON0bits.SMT1STP=0;
    SMT1CON1bits.SMT1GO=1; // start chrono
    
    Ecran_Noir
();
    
    SMT1CON1bits
.SMT1GO=0;  // stop chrono
    *(ST)=  SMT1TMRL;
    *(ST+1)=SMT1TMRH;
    *(ST+2)=SMT1TMRU;
    *(ST+3)=0;
    sprintf(txt, "\r\n Duree = %lu  soit ",SMT1_Measure);
    Print(txt);
    L1=SMT1_Measure>>6; //64
    sprintf(txt, "%lu uS \r\n",L1);
    Print(txt);
    CRLF1(); 
Aides toi, le ciel ou FantasPic t'aideras


Retourner vers « Langage C »

Qui est en ligne

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