Bonjour,
J'utilise un pic pour enregistrer des info en provenance d'un GPS (communication série) et j'ai pas mal d'informations a stocker. C'est ce que m'a orienté vers ce micro (128 K).
Je sais lire et écrire dans la flash que j'utilise comme une "data flash". Mon appareil lie le GPS et affiche les coordonnées sur un LCD. J'enregistre les positions latitude, longitude, vitesse, heure etc
Bref pas mal de data. Mon problème c'est que je n'arrive pas a écrire dans le dernier bloc de 1024.
Pour écrire une info, la page de 1024 doit être effacé et l’écriture est faite par bloc de 64 octets.
Je commence a écrire en 0x3000 et tout se passe normalement jusque 0x1FC00. Ensuite aucune écriture !
Je ne comprend pas ou se trouve mon pb (bug ?).
Ci dessous un extrait de mon code.
C'est une demande personnel, rien de pro dans cette demande. C'est une occupation pour les soirée et aussi le week end.Code:#define WRITE_FLASH_BLOCKSIZE 64 #define ERASE_FLASH_BLOCKSIZE 1024 #define END_FLASH 0x1FFFF /* stockage en mémoire par bloc de 32 octets et mise à jour de Cpt_Value */ if (Cpt_Value > (ERASE_FLASH_BLOCKSIZE - 1)) { //appel ecriture si bloc rempli if (rul_FlashAddress <= END_FLASH) { FLASH_WriteBlock(rul_FlashAddress,rub_SaveToFlash); //write 64 bytes * 16 block rul_FlashAddress = rul_FlashAddress + ERASE_FLASH_BLOCKSIZE; /* prepare next flash address */ } Cpt_Value = 0; } //function to write T_UBYTE FLASH_WriteBlock(T_ULONG writeAddr, T_UBYTE *flashWrBufPtr) { T_ULONG blockStartAddr = (T_ULONG )(writeAddr & ((END_FLASH) ^ (ERASE_FLASH_BLOCKSIZE-1))); T_UBYTE GIEBitValue = INTCONbits.GIE; // Save interrupt enable T_UBYTE i; T_UBYTE Block; // Flash write must start at the beginning of a row if( writeAddr != blockStartAddr ) { return -1; } Block = 16; // Block erase sequence // FLASH_EraseBlock(writeAddr); Application will do it // Block write sequence TBLPTRU = (T_UBYTE)((writeAddr & 0x00FF0000) >> 16); // Load Table point register TBLPTRH = (T_UBYTE)((writeAddr & 0x0000FF00)>> 8); TBLPTRL = (T_UBYTE)(writeAddr & 0x000000FF); do { // Write block of data for (i=0; i<WRITE_FLASH_BLOCKSIZE; i++) { TABLAT = flashWrBufPtr[i]; // Load data byte if (i == (WRITE_FLASH_BLOCKSIZE-1)) { asm("TBLWT"); } else { asm("TBLWTPOSTINC"); } } EECON1bits.WREN = 1; INTCONbits.GIE = 0; // Disable interrupts EECON2 = 0x55; EECON2 = 0xAA; EECON1bits.WR = 1; // Start program EECON1bits.WREN = 0; // Disable writes to memory INTCONbits.GIE = GIEBitValue; // Restore interrupt enable Block--; asm("TBLWTPOSTINC"); /* start page */ flashWrBufPtr = flashWrBufPtr + 0x40; /* next 64 byte */ } while (Block != 0); // write 16 pages of 64 bytes return 0; }
Merci de vos retour.
-----