Mémoire flash: la page entière doit-elle être effacée avant d'écrire quelques octets seulement?

16

Une question facile, j'espère! Je ne trouve pas de réponses définitives ...

J'écris des pilotes pour une puce de mémoire flash SST25VF064C . Il communique via SPI.

Comme toute mémoire flash (à ma connaissance), elle doit être effacée (tous les bits = 1) avant de pouvoir être écrite (bits = 0). Pour cette puce, la plus petite zone pouvant être effacée est de 4 Ko.

Sa mémoire est divisée en pages de 256 octets. Avec une seule instruction, je peux écrire de un octet à 256 octets dans une page spécifiée. Je n'ai pas besoin de commencer sur une limite de page: le premier emplacement à programmer peut être n'importe où dans une page.

La règle générale est de s'assurer que la page est effacée avant d'y écrire. Mais, puis-je écrire dans une page déjà écrite, si j'évite les zones déjà écrites? Par exemple, disons que je stocke des données dans les octets 0-127. Puis-je écrire plus tard 128 octets supplémentaires sur la même page, si je commence à 128 octets?

bitsmack
la source

Réponses:

13

Oui, après tout effacement, vous pouvez utiliser un nombre illimité d'opérations distinctes pour écrire des données (en changeant les bits de 1 à 0) avant l'opération d'effacement suivante.

Vous pouvez même réécrire un emplacement précédemment écrit, tant que vous ne supprimez que plus de bits. Cela peut être pratique pour maintenir des éléments tels que les bitmaps d'allocation.

Dave Tweed
la source
Excellent, merci! C'était exactement ce que je cherchais.
bitsmack
Notez que certaines puces n'aiment pas que vous écriviez un octet plus tôt après un autre en regardant différentes fiches techniques, mais cela semble varier d'un appareil à l'autre.
Vality du
1
@Vality: Pouvez-vous en donner un exemple?
Dave Tweed
3
Les microcontrôleurs @DaveTweed NXP LPC21xx et LPC23xx ont un octet de somme de contrôle pour chaque 16 octets de mémoire; vous devez écrire les 16 octets à la fois car la somme de contrôle est écrite dans cette opération. Si vous venez plus tard et essayez d'écrire des zéros dans la même "ligne", les zéros sont écrits, mais une nouvelle somme de contrôle est également écrite par rapport à la précédente; il y a des chances qu'il ait des 1 où le précédent avait des 0, donc la somme de contrôle devient invalide. Je ne me souviens pas si le MCU vous permet de lire une ligne avec une mauvaise somme de contrôle. Quoi qu'il en soit, ce serait un exemple de «varier selon les appareils».
Guillermo Prandi
1
"n'importe quel nombre d'opérations distinctes pour écrire ... la prochaine opération d'effacement." Notez que certaines parties, en particulier les mémoires flash intégrées dans les MCU, indiqueront un nombre maximal d'écritures avant qu'un effacement ne soit nécessaire. Il est probable que la violation de cette limite risque de corrompre d'autres zones de la mémoire, il est donc important de faire attention à ces limites.
ajb
5

puis-je écrire dans une page déjà écrite, si j'évite les zones déjà écrites?

Si je comprends p. 16 de la fiche technique correctement, il dit: Avec cette puce particulière, vous ne devez pas écrire dans une page déjà écrite, même si vous évitez les zones déjà écrites.

détails

La puce de mémoire flash SST25VF064C Fiche p. 16 indique "L'instruction de programme de page programme jusqu'à 256 octets de données dans la mémoire. L'adresse de page sélectionnée doit être à l'état effacé (FFH) avant de lancer l'opération de programme de page."

Je suppose donc que "la page sélectionnée entière doit être dans l'état effacé (chaque octet sur la page FFh) avant de lancer une opération de programme de page." SST ou Microchip a-t-il publié de la documentation clarifiant cette phrase exaspérément ambiguë?

D'après mon expérience, le fabricant de toutes les puces flash MLC et de certaines puces flash SLC plus récentes exige qu'une fois qu'une page a été écrite, la page doit être effacée avant que cette page ne soit réécrite, même si vous ne voulez changer que 1 bit en un 0 bit. (Ceci est appelé la "règle d'écriture unique" dans l'article YAFFS .)

D'après mon expérience, toutes les anciennes puces flash vous permettent de changer n'importe quel 1 bit en 0 bit sans cycle d'effacement, même si ce bit est dans une page ou même un octet qui a déjà eu d'autres bits programmés à zéro - un la page du flash peut être programmée plusieurs fois entre les effacements. (Ceci est appelé "écriture multiple" dans l'article YAFFS).

La fiche technique du fabricant est une promesse conditionnelle que le fabricant vous fait. Tant que vous suivez toutes les recommandations de la fiche technique, le fabricant promet que la puce fonctionnera comme spécifié. Je soupçonne que si vous programmez une page déjà écrite, en évitant les zones déjà écrites, il y a de fortes chances qu'une lecture immédiate puisse donner les données que vous attendez - les octets nouvellement écrits sont les valeurs que vous venez d'écrire, et les autres octets sont probablement inchangés. Cependant, comme cela ne suit pas les recommandations de la fiche technique, vous ne pouvez plus compter sur toutes les promesses de la fiche technique. J'entends des rumeurs selon lesquelles une telle activité non autorisée fait souffrir le temps de rétention des données et l'endurance, en raison de la perturbation du programme, de la surprogrammation, du piège de charge, des effets similaires au marteau perforateur DRAM , etc.

"Le schéma d'utilisation de la mémoire influe sur le taux d'erreur sur les bits. Programmation de pages partielles, programmation de pages non séquentielles dans le bloc, lecture excessive par bloc sans effacement ainsi qu'un nombre non égal d'opérations de lecture dans un seul bloc augmentation du nombre de lectures perturber les erreurs. " - Michal Jedrak. "Mémoire Flash NAND dans les systèmes embarqués".

"Une perturbation de programme se produit lorsqu'un bit est involontairement programmé de" 1 "à" 0 "pendant un événement de programmation de page. Cette erreur de bit peut se produire soit sur la page en cours de programmation, soit sur une autre page du bloc. Conditions de tension de polarisation dans le blocage pendant la programmation de la page peut entraîner une petite quantité de courant à pénétrer dans les cellules de mémoire à proximité. Des tentatives répétées de programmation de page partielle continueront d'aggraver cette situation. " - Douglas Sheldon et Michael Freie. "Test de dérangement dans les mémoires Flash" . p. 8, 9.

"Une perturbation de programme se produit lorsqu'un bit est involontairement programmé (1 à 0) pendant une opération de programmation. ... Cette condition est aggravée par une programmation aléatoire dans le bloc et par l'application de plusieurs écritures partielles sur les pages." "Atténuation des défaillances flash Yaffs NAND"

davidcary
la source
0

Il est fort probable que le logiciel de programmation que vous utilisez écrit déjà les 256 octets "requis". Il "apparaît" comme si il vous donnait la possibilité d'écrire de un à 256 octets, mais je soupçonne que ce qu'il fait est OU-ing les octets que vous voulez avec un "masque" de 256 "FF". Si cela est correct, vous pouvez écrire "en toute sécurité" une fois n'importe quel octet , sans avoir à effacer la totalité des octets 4K. Si une somme de contrôle est écrite en dehors de votre contrôle, alors, très probablement, une somme de contrôle non valide sera créée lorsque vous écrivez un autre octet dans un segment précédemment écrit. Les implications de cela dépendent de la puce.

Si votre logiciel de programmation ne fait pas le "OU-ing", vous pouvez le faire vous-même. Effacez un segment de 256 octets, écrivez les octets dans la ou les positions correctes, OU avec un masque de 256 octets de FF, et écrivez le segment sur la page souhaitée.

Vous pouvez déterminer facilement si l'une ou l'autre méthode fonctionne avec une puce particulière . Écrivez dans les 128 premiers octets, écrivez dans les 128 derniers octets, vérifiez que les 128 premiers octets ne sont PAS "foirés"!

Guill
la source