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?
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"
la source
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"!
la source