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

Envoyer plusieurs octets avec SPI sur PIC16F
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2617
Enregistré en : juillet 2016
Localisation : Terre

#11 Message par Temps-x » mer. 1 avr. 2020 04:22 lien vers la Data-Sheet : Cliquez ici

Bonsoir,

Superphénix a écrit :Source du message J'ai mis mon programme d'envoi de données dans une boucle while et j'ai regardé avec mon oscillo analogique ce qu'il y a sur chaque PIN du PIC, et la réponse c'est qu'il n'y a rien du tout sauf pour SCE qui varie.


C'est trop rapide pour être vu à l'oscilloscope, quand j'ai commencé l'étude du mode SPI j'ai pensé comme toi,

Par la suite j'ai acheté un analyseur logique à 7 euros (celui du lien du post #7) et là miracle j'ai bien vu les signaux, de plus tu peux voir les séquences.

Sinon si tu n'es pas sur de toi, sur ta configuration tu peux l'écrire en mode SPI bit bang

Voir ICI ou je montre un exemple, quand on a compris ça fonctionne super bien.

==> A+
Modifié en dernier par Temps-x le mer. 1 avr. 2020 13:00, modifié 2 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Envoyer plusieurs octets avec SPI sur PIC16F
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#12 Message par satinas » mer. 1 avr. 2020 08:05 lien vers la Data-Sheet : Cliquez ici

Bonjour,
Il faut revoir le chapitre 12 sur les PPS.
SSPSSPPS, SSPCLKPPS, SSPDATPPS servent à router des inputs. On peut d'ailleurs affecter une même pin PPS à plusieurs fonctions input.
Pour router les outputs SCK et SDO, on fait l'inverse en affectant avec les registres RxyPPS une fonction output unique à une pin PPS. C'est pour éviter que cela fume si 2 fonctions output sont sur une même pin PPS.
Il est nécessaire de programmer les TRIS correspondants.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Envoyer plusieurs octets avec SPI sur PIC16F
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#13 Message par Superphénix » mer. 1 avr. 2020 17:32 lien vers la Data-Sheet : Cliquez ici

Il faut revoir le chapitre 12 sur les PPS.

Effectivement, j'étais passé très rapidement sur cette partie. J'ai fait la modification :

Code : Tout sélectionner

    SSPDATPPS = 0b00001010 ; // RB2=SDI
    RB1PPS = 0b00100011 ;   // RB1=SDO
    RD2PPS = 0b00100001 ;   // RD2=SCL

Et maintenant j'ai quelque chose sur SDO :) Par contre reste l'horloge où je n'ai rien. Le PIN est à 0.

C'est trop rapide pour être vu à l'oscilloscope, quand j'ai commencé l'étude du mode SPI j'ai pensé comme toi,

Mais si je le mets en boucle sans délais entre chaque transmission, tous les bits devraient être suffisamment serrées? En tout cas ça fonctionne pour SDO maintenant. Quoi que je fasse j'aurais l'analyseur logique peut être en mai-juin si je commande maintenant en Chine. Du coup pour l'instant je bricole. ^^

Sinon si tu n'es pas sur de toi, sur ta configuration tu peux l'écrire en mode SPI bit bang

J'ai pas compris ce que c'est ce mode. :-D

Envoyer plusieurs octets avec SPI sur PIC16F
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#14 Message par satinas » mer. 1 avr. 2020 18:32 lien vers la Data-Sheet : Cliquez ici

C'est trop rapide pour être vu à l'oscilloscope

Temps-x, faut pas regarder le SPI avec ton oscillo oled :-)
Un oscillo 2 voies est suffisant pour démarrer le SPI, de toute façon à quoi bon, ça ne peut que marcher.

Ton chip doit fonctionner en SPI mode 0 ou 3, comme souvent, faut voir son datasheet et configurer le pic en conséquence.
Page 25 https://www.google.fr/url?sa=t&rct=j&q= ... u4DJtnTSCB

Et maintenant j'ai quelque chose sur SDO

Donne plus de détails, parce que s'il n'y a pas de SCK, il n'y a rien sur SDO
On peut voir le programme complet.

Envoyer plusieurs octets avec SPI sur PIC16F
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#15 Message par Superphénix » mer. 1 avr. 2020 19:34 lien vers la Data-Sheet : Cliquez ici

Depuis le début je suis perdu avec les modes 0,1,2,3, j'ai l'impression que le numéro est attribué arbitrairement en fonction de celui qui rédige le document.
Le mode 0,0 de la page 25 c'est ce que j'avais configuré moi. (CKE = 1 CKP = 0)
Pour moi le mode 0 du datasheet du PIC(page447) c'est CKE = 0 et CKP = 0. Et le mode 3 c'est 1 1. Je suis perdu. :?:

Donne plus de détails, parce que s'il n'y a pas de SCK, il n'y a rien sur SDO

Sur le SDO du PIC il y a des états haut et des états bas. Un signal carré qui varie quoi.
SCK = 0V constamment et rien ne varie.

On peut voir le programme complet.

Code : Tout sélectionner

#define _XTAL_FREQ 4000000
#include <XC.h>
#include <stdio.h>
#include <stdlib.h>

#pragma config FOSC = XT
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config CLKOUTEN = OFF
#pragma config BOREN = OFF
#pragma config CP = OFF //Protection mémoire?
#pragma config MCLRE = OFF // PIN RESET
#pragma config PWRTE = OFF
#pragma config WDTE = OFF
#pragma config LVP = OFF
#pragma config LPBOR = OFF
#pragma config STVREN = OFF
#pragma config PLLEN = OFF
#pragma config ZCD = OFF
#pragma config PPS1WAY = OFF
#pragma config WRT = OFF

#define SEL_LCD PORTDbits.RD7

int main(int argc, char** argv)
{
    unsigned int i=0, j=0 ;
    unsigned char AFF1[3][19], AFF2[3][19] ; // Contiens les 6 trames à envoyer au BU. Je décompose en 2 pour éviter des problèmes de mémoire.
    TRISB   = 0b00001101 ;
    TRISD   = 0b00000001 ;
    ANSELB  = 0b00000000 ;
    ANSELD  = 0b00000001 ;
    PORTB   = 0b00010000 ;
    PORTD   = 0b01100000 ;
    OSCCON  = 0b00111000 ;
    // PPS :
    SSPDATPPS = 0b00001010 ; // RB2=SDI
    RB1PPS = 0b00100011 ;    // RB1=SDO
    RD2PPS = 0b00100001 ;    // RD2=SCL
   
    for(i=0 ; i<3 ; i++) for(j=0 ; j<19 ; j++) {AFF1[i][j]=0 ; AFF2[i][j]=0 ;} // Tout est à 0 sauf les octets qui suivent.
    AFF1[0][15]=0b00000001 ; AFF1[0][16]=0b01011111 ; AFF1[0][17]=0b11100111 ;
    AFF1[1][16]=0b00011111 ; AFF1[1][17]=0b11110111 ; AFF1[1][18]=0b10000001 ;
    AFF1[2][18]=0b00000010 ;
    AFF2[0][18]=0b00000011 ;
    AFF2[1][18]=0b00000100 ;
    AFF2[2][18]=0b00000101 ;
    AFF2[0][3]=0b00010000 ; AFF1[0][5]=0b10010001 ; AFF2[1][9]=0b10010001 ; AFF2[2][10]=0b10010001 ;   // N'importe quoi pour tester
   
    SSP1STATbits.SMP = 0 ;
    SSP1STATbits.CKE = 1 ;
    SSP1CON1bits.CKP = 0 ;
    SSP1CON1bits.SSPM = 0b0010 ; // 0010 = SPI Master mode, clock = FOSC/64=62500Hz ;
    SSP1CON1bits.SSPEN = 1 ; // SPI ON
   
   while(1)
   {
    for(i=0 ; i<3 ; i++)
    {   
        SSPBUF = 0b10010010 ;   // Adresse 49h
        while(!SSP1STATbits.BF) ;
        SEL_LCD = 1 ;
        for(j=0 ; j<19 ; j++)
        {   
            SSPBUF = AFF1[i][j] ;
            while(!SSP1STATbits.BF) ;
        }
        SEL_LCD = 0 ;
        __delay_us(100) ;
    }

    for(i=0 ; i<3 ; i++)
    {   
        SSPBUF = 0b10010010 ;   // Adresse 49h
        while(!SSP1STATbits.BF) ;
        SEL_LCD = 1 ;
        for(j=0 ; j<19 ; j++)
        {   
            SSPBUF = AFF2[i][j] ;
            while(!SSP1STATbits.BF) ;
        }
        SEL_LCD = 0 ;
        __delay_us(100) ;
    }
   }
   
    SSP1CON1bits.SSPEN = 0 ; // SPI OFF
   
    return (EXIT_SUCCESS);
}

Envoyer plusieurs octets avec SPI sur PIC16F
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#16 Message par satinas » mer. 1 avr. 2020 19:48 lien vers la Data-Sheet : Cliquez ici

Page 210, SDO et SCK sur ports B ou C seulement.
Les PPS c'est toujours un peu douloureux au début, après on s'y fait.

Lis le cours Bigonoff 18F87X, le SPI est très bien expliqué, et ne lis le pas trop rapidement :-)
Je crois que le datasheet du pic ne parle pas de ces modes, il s'en tient à CKE et CKP, c'est pourquoi je t'ai joint la doc SPI Microchip. Ceci-dit, j'ai vu sur Internet des sites qui ne dise pas la même chose sur ces modes, je préfère m'en tenir à la doc Microchip, et cela reste en accord avec les autres fabricants de chips.

Envoyer plusieurs octets avec SPI sur PIC16F
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#17 Message par Superphénix » mer. 1 avr. 2020 20:11 lien vers la Data-Sheet : Cliquez ici

J'ai payé 30€ pour le PCB et j'ai mis des jours à tout souder. :cry: :cry:
Quand je fais le routage je me fie à ça :
merde.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Envoyer plusieurs octets avec SPI sur PIC16F
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#18 Message par satinas » mer. 1 avr. 2020 20:17 lien vers la Data-Sheet : Cliquez ici

Je croyais que c'était un logiciel, oui souvent il y a des coquilles et manques de clarté dans les datasheets.
Tu n'as plus qu'à continuer en bit banging avec Temps-x :-)
Chez JLCPCB t'aurais perdu 2 euros :-)
C'est professionnel ?

Envoyer plusieurs octets avec SPI sur PIC16F
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2617
Enregistré en : juillet 2016
Localisation : Terre

#19 Message par Temps-x » mer. 1 avr. 2020 20:45 lien vers la Data-Sheet : Cliquez ici

Bonsoir satinas, Superphénix, et tout le forum,

satinas a écrit :Source du message Temps-x, faut pas regarder le SPI avec ton oscillo oled :-)


J'ai fait ça avec mon Oscilloscope HM512-2 15 MHz dual channel :langue:

satinas a écrit :Source du message le cours Bigonoff 18F87X, le SPI est très bien expliqué, et ne lis le pas trop rapidement :-)


Je rejoins ce que dis satinas, leçon numéro 2 page 303 explication du mode SPI, tout est marqué, il y a pas mieux, mais tout est en assembleur,

j'ai pas ton écran, j'ai pas ton microcontrôleur, j'ai pas de quoi programmer ton microcontrôleur.

Avec quoi programme tu ton Pic ?

Personnellement je changerais de pic, à l’identique je prendrais un Pic18F46k22, j'ai regardé c'est les mêmes brochages.

Si tu a fait une erreur sur ton brochage, tu peux le rattrapé comme le dis satinas avec le mode SPI bit bang, mais vu la lenteur des langages de haut niveau, tu es obligé de passé par ASM .

Je crois sur des langages de haut niveau qu'on peut inclure de l'assembleur, à voir avec des connaisseurs.

La première chose à faire c'est de faire un protocole SPI qui fonction, après on pourras avancé.... :wink:

==> A+
Modifié en dernier par Temps-x le jeu. 2 avr. 2020 01:49, modifié 2 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Envoyer plusieurs octets avec SPI sur PIC16F
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#20 Message par Superphénix » mer. 1 avr. 2020 21:41 lien vers la Data-Sheet : Cliquez ici

Chez JLCPCB t'aurais perdu 2 euros :-)
C'est professionnel ?

Habituellement je commande chez Elecrow, là je voulais tester Aisler. Enfaite c'est pas très chère non plus mais seulement si le PCB fait moins de 100mm de coté, et c'est pas mon cas. C'est pas professionnel. (heureusement^^)
Personnellement je changerais de pic, à l’identique je prendrais un Pic18F46k22, j'ai regardé c'est les mêmes brochages.

Pour l'instant je vais couper des pistes et souder des fils, pour pouvoir continuer. Et je referais le PCB après le confinement.
J'ai min longtemps pour choisir ce PIC pour d'autres raisons aussi...


Retourner vers « Langage C »

Qui est en ligne

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