Bonjour, j'utilise un pic18F et je veux gérer une horloge en temps réel avec une liaison SPI. J'ai donc acheté un DS1306, après déjà plusieurs semaines de développement, je n'arrive toujours pas à écrire l'heure dans le registre RTC du DS1306. J'utilise le schéma typique de la documentation constructeur sauf une broche(SERMODE) que je met à 5V au lieu de la masse fin d'utiliser la liaison, j'utilise un quartz 32.768Khz, j'arrive a lire ce qu'il y a sur le bus, mais je n'arrive pas écrire manuellement l'heure dans ce registre. Lorsque j'essaye d'écrire, je vois a l’oscilloscope que le compteur est à zéro dés la mise sous tension. Je tiens à préciser que j'utilise la librairie SPI du compilateur xc8 avec MPLAB en IDE.
Doc constructeur du DS1306 : http://datasheets.maximintegrated.com/en/ds/DS1306.pdf
Doc constructeur du pic18f : http://ww1.microchip.com/downloads/e...Doc/39960d.pdf
Dans l'attente de vos suggestions !Code:#include "p18cxxx.h" #include "spi.h" #define CS_ON LATDbits.LATD7 = 1 #define CS_OFF LATDbits.LATD7 = 0 #define _XTAL_FREQ 20000000 void Configuration_PORTS(void) { TRISC = 0; // PORT C en sortie TRISG = 0; // PORT G en sortie TRISB = 0; // PORT B en sortie TRISDbits.TRISD7 = 0; //RD7 en sortie (CS) TRISDbits.TRISD4 = 0; //RD4 en sortie (Serial data out (SDO)) TRISDbits.TRISD5 = 1; //RD5 en entrée (Serial data IN (SDI)) TRISDbits.TRISD6 = 0; //RD6 en sortie Horloge (SCK) } void init_SPI(void) { //On utilise le MSSP2 SSP2STATbits.SMP = 1; //Master mode SSP2STATbits.CKE = 1; //1 = Transmit occurs on the transition from active to Idle clock state ;0 = Transmit occurs on the transition from Idle to active clock state SSP2STATbits.BF = 1; SSP2CON1bits.SSPEN = 1; //activer SDO/SDI/SCK | SSP2CON1bits.CKP = 0; //clock high or low SSP2CON1bits.SSPM1 = 1; } void delayy() { for (int u = 0; u <= 5; u++) { u++; } } void opends1306(){ CS_ON; delayy(); WriteSPI2(0x8F); WriteSPI2(0); CS_OFF; delayy(); } void writeds1306(){ char sec = 0x30; char min = 0x47; char hr = 0x12; CS_ON; delayy(); WriteSPI2(0x80); WriteSPI2(sec); WriteSPI2(min); WriteSPI2(hr); delayy(); CS_OFF; void readds1306() { CS_ON; delayy(); WriteSPI2(0x00); sec=ReadSPI2(); min=ReadSPI2(); hr=ReadSPI2(); delayy(); CS_OFF; } void main(void) { Configuration_PORTS(); Configuration_timer(); init_SPI(); opends1306(); writeds1306(); while (1) { readds1306(); CLRWDT(); } }
Merci.
Cordialement,
Robintou.
-----