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
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#1 Message par Superphénix » dim. 29 mars 2020 17:11 lien vers la Data-Sheet : Cliquez ici

Bonjour

C'est la première fois que je tente de programmer une liaison SPI.
Le maître est un PIC16F1779 et les esclaves 3 CIs dont un BU97550KV avec lequel je suis en train de faire des tests.

J'ai écris un premier programme que je n'ai pas encore testé et qui envoie 1 octet :

Code : Tout sélectionner

    SSPDATPPS = 0b00001001 ; // RB1
    SSPCLKPPS = 0b00011010 ; // RD2
    SSPSSPPS  = 0b00011111 ; // RD7 (LCD)
   
    SSP1STATbits.SMP = 0 ;
    SSP1STATbits.CKE = 1 ;
    SSP1CON1bits.CKP = 0 ;
    SSP1CON1bits.SSPM = 0b0010 ; // 62500Hz // 0010 = SPI Master mode, clock = FOSC/64  ;  0001 = SPI Master mode, clock = FOSC/16
    SSP1CON1bits.SSPEN = 1 ; // SPI ON
   
        SSPBUF = data ;   // data=char
        while(!SSP1STATbits.BF) ; // Wait for Data Transmit/Receipt complete
   
    SSP1CON1bits.SSPEN = 0 ; // SPI OFF


Ma question est, comment faire pour envoyer plusieurs octets de sorte à ce que le BU97550KV les reçois dans le bon ordre ?
Suffit t'il de faire :

Code : Tout sélectionner

        SSPBUF = data1 ;
        while(!SSP1STATbits.BF) ;
        SSPBUF = data2 ;
        while(!SSP1STATbits.BF) ;
        SSPBUF = data3 ;
        while(!SSP1STATbits.BF) ;
        … ??


Et comment le BU97550KV sait quel octet reçu correspond à quoi ?

Autre question: Y a t'il des avantages de choisir un mode d'horloge plutôt qu'un autre avec SMP, CKE, CKP ? Là j'en ai choisis un qui me semblait le plus normale sans savoir si c'est mieux ou pas.

Merci

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

#2 Message par Temps-x » dim. 29 mars 2020 20:14 lien vers la Data-Sheet : Cliquez ici

Bonsoir,

Je suis pas dans ma section, car je pratique l'assembleur (ASM), mais pour la configuration voici ce qui faut faire pour ton PIC16F1779 en version ASM

:roll: Quand tu vas maitriser le protocole SPI, il faudra envoyer les séquences spécifique pour ton écran.

oops Je crois que tu veux aller trop vite, il y a du boulot crois moi, mais bon tu es au bon endroit, c'est quand même mieux que Futura ou tu
as pas eu grande réponse.

Note : J'ai pas vérifier le brochage des sorties SPI sur ton Pic, ici c'est un exemple

Exemple en ASM

Code : Tout sélectionner

;*************************************** assignations ***************************************** 

#DEFINE dc      LATA,2                 ; RA2 ==> sélection du mode : commande = 0 , donnée = 1
#DEFINE cs      LATA,1                 ; RA1 ==> activer ou désactiver la transmission
#DEFINE rst     LATA,0                 ; RA0 ==> reset de l'écran

;************************** configuration des registres pour mode SPI **************************
 
      movlw B
'01000000'                   ; B7 = 0 : lecture des données au milieu
      movwf SSP1STAT                      
; 
             
      movlw B
'00100001'                   ; B0 ...B3 = spi en mode Maître, B5 = polarité négative
      movwf SSP1CON1                      
; horloge = FOSC/16 application 64 /16 = 4Mbps 

;************************ configuration du registre TRISC pour mode SPI ************************ 

      movlw B
'01010000'                   ; 
      movwf TRISC                         
; 

;*************************** " exemple pour utilisation du mode SPI" ***************************

      
      movlw 0x10
      rcall command                       
; pour commande de ton LCD

      movf datas
,W
      rcall donner                        
; pour donner de ton LCD


boucle
      nop
      bra boucle


;*********************************************************************************************** 
command
      bcf dc                              
; DC = 0  en mode commande
      bra spi                          
     
;*********************************************************************************************** 
donner
      bsf dc                              
; DC = 1 en mode donnée
      bra spi                             
;     

;*********************************************************************************************** 
spi     
      bcf cs                              
; mise en fonction du mode SPI

                                          
; charger les données dans W     
      movwf SSP1BUF                       
; puis les transmettres dans le registre pour l'envoi 
attends
      btfss SSP1STAT,BF                   ; attendre
      bra attends                         ; boucler jusqu'
a finition d'envoie des données

      bsf cs                              ; mise hors fonction du mode SPI

      movf SSP1BUF,W                      ; précaution de lecture pour vider registre  
      
      return


==> A+
: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

#3 Message par Superphénix » lun. 30 mars 2020 22:11 lien vers la Data-Sheet : Cliquez ici

La dernière fois que j'ai fait de l'assembleur c'était en cours à l'IUT en 2011. Du coup là j'ai un peu de mal :-D
A première vu ça ressemble à ce que j'ai fait.

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

#4 Message par Superphénix » mar. 31 mars 2020 00:43 lien vers la Data-Sheet : Cliquez ici

J'ai avancé mon programme comme je le pensais et évidement après test ça ne fait rien.
Je ne sais pas s'il s'agit d'un problème de bits de configuration du BU ou de la manière dont j'ai fait le programme en C qui ne marche pas, mais l’afficheur n'affiche rien.
Je poste le code 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_RTC PORTDbits.RD5
#define SEL_GPS PORTDbits.RD6
#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   = 0b11100000 ;
    OSCCON  = 0b00111000 ;
    // PPS :
    SSPDATPPS = 0b00001001 ; // RB1
    SSPCLKPPS = 0b00011010 ; // RD2
    SSPSSPPS  = 0b00011111 ; // RD7
   
    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
   
    for(i=0 ; i<3 ; i++)
    {   
        SSPBUF = 0b10010010 ;   // Adresse 49h
        while(!SSP1STATbits.BF) ;
        SEL_LCD = 0 ;
        for(j=0 ; j<19 ; j++)
        {   
            SSPBUF = AFF1[i][j] ;
            while(!SSP1STATbits.BF) ;
        }
        SEL_LCD = 1 ;
        __delay_us(100) ;
    }

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


J'ai fait aussi ce jolie tableau qui contient les octets des trames à envoyer au BU :
trammes spi BU.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

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

#5 Message par Temps-x » mar. 31 mars 2020 00:55 lien vers la Data-Sheet : Cliquez ici

Bonsoir,

Superphénix a écrit :Source du message Ma question est, comment faire pour envoyer plusieurs octets de sorte à ce que le BU97550KV les reçois dans le bon ordre ?


Je vais te poser la question inverse, parce que là.... tu nous demande de lire la datasheet à ta place, et de le comprendre

Peux tu nous dire.... sur quelle page de la datasheet de l'écran as tu vue ça pour le mode SPI... BU97550KV

Et comment le BU97550KV sait quel octet reçu correspond à quoi ?


:roll: il y a une base de donnée ou sont stockés les adresses, dans les adresses il y a des informations, faut pas chercher plus loin, car tu es pas constructeur.

On te donne la datasheet ou théoriquement tout est inscrit pour faire fonctionner ton écran.


Superphénix a écrit :Source du message Autre question: Y a t'il des avantages de choisir un mode d'horloge plutôt qu'un autre avec SMP, CKE, CKP ? Là j'en ai choisis un qui me semblait le plus normale sans savoir si c'est mieux ou pas.


Là tu confonds tous,

SMP :1 = Données d'entrée échantillonnées à la fin du temps de sortie des données
==> ==> 0 = Données d'entrée échantillonnées au milieu du temps de sortie des données

Généralement on choisi le milieu, mais tout dépend de ton écran

CKE :1 = la transmission se produit lors du passage de l'état d'horloge actif à l'état inactif
==> ==> 0 = la transmission se produit lors du passage de l'état inactif à l'état d'horloge actif

CKP :1 = l'état inactif de l'horloge est un niveau élevé
==> ==> 0 = l'état inactif de l'horloge est un niveau bas

Pour ton écran... il y a surement un reset a faire, avant de lui envoyer les commandes, de plus je te conseille d'acheter un analyseur logique
ceux à 10 euros suffit voici un lien


Superphénix a écrit :Source du message La dernière fois que j'ai fait de l'assembleur c'était en cours à l'IUT en 2011


Moi j'en suis jamais sorti, et j'ai maintenant mes bibliothèque que je peux modifier à tout moment.

==> A+
: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

#6 Message par Superphénix » mar. 31 mars 2020 01:40 lien vers la Data-Sheet : Cliquez ici

Je ne l'ai pas vu, c'est pour ça que je demande.
Par contre je crois que j'ai oublié d'expliquer quelque chose. Le PIC est connecté au BU et les sorties du BU sont connectés à l'écran. L'écran affiche des segments et icones. Il a 80PIN, c'est un 1/8duty, 1/4bias. µC+BU+Écran sont sur la même carte, que j'ai conçu.
Pour les données je m'oriente par rapport aux trames à la page 8.
il y a une base de donnée ou sont stockés les adresses, dans les adresses il y a des informations, faut pas chercher plus loin, car tu es pas constructeur.

C'est bon pour cette question. J'ai trouvé les adresses, qui font tout simplement partie de ce qui est envoyé dans les trames de la page 8. (le DD à la fin de chaque trame)

Ok pour SMP, CKE, CKP.

Pour ton écran... il y a surement un reset a faire

Il le fait automatiquement au démarrage (page66). J'ai ajouté le condensateur de 100nF comme ils le demandent à une autre page, pour que ça puisse fonctionner.

Merci pour le lien, ça m'intéresse parce que j'en ai pas.

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

#7 Message par Temps-x » mar. 31 mars 2020 01:59 lien vers la Data-Sheet : Cliquez ici

Re
Superphénix a écrit :Source du message Merci pour le lien, ça m'intéresse parce que j'en ai pas.


A lire entièrement, voici une explication pour mettre en fonction l'analyseur logique ICI j'ai le même et j'en suis content. :wink:

Je vais regarder la datasheet de ton écran sans rien te promette, car l'anglais :furieux: je connais pas du tout, je le devine c'est tout.


==> A+
: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

#8 Message par satinas » mar. 31 mars 2020 08:43 lien vers la Data-Sheet : Cliquez ici

Bonjour,
après le while(!SSP1STATbits.BF) ;
il faut lire SSPBUF, ce qui remet à zéro le bit BF.
Si le bif BF reste à 1, les while suivants ne seront pas bon.

Il se peut que l'écriture de SSPBUF le remette aussi à zéro, il faudrait regarder.
Je n'ai pas la réponse car je lis toujours SSPBUF, le spi c'est un échange d'octet, et c'est un même registre qui fait tout le boulot.

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

#9 Message par Superphénix » mar. 31 mars 2020 23:34 lien vers la Data-Sheet : Cliquez ici

Je vais regarder la datasheet de ton écran sans rien te promette, car l'anglais :furieux: je connais pas du tout, je le devine c'est tout.

Moi aussi ça me ralentit ^^

il faut lire SSPBUF, ce qui remet à zéro le bit BF.

Je viens de faire le test en rajoutant des a=SSPBUF; mais toujours rien :/

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

#10 Message par Superphénix » mer. 1 avr. 2020 01:08 lien vers la Data-Sheet : Cliquez ici

Des nouvelles! 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.
SCL=0V
SDO=0V
SDI=0V


Retourner vers « Langage C »

Qui est en ligne

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