Deutsch English Français Italiano |
<6448da3f$0$3072$426a34cc@news.free.fr> Als Lesezeichen speichern (was bedeutet das?) Anderen Usenet-Beitrag nachschlagen |
Path: ...!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder8.news.weretis.net!proxad.net!feeder1-2.proxad.net!cleanfeed2-b.proxad.net!nnrp2-1.free.fr!not-for-mail Newsgroups: fr.sci.electronique From: JKB <JKB@hilbert.invalid> Subject: Mise en veille =?UTF-8?Q?m=C3=A9moire?= MRAM Reply-To: <jkb@invalid> User-Agent: slrn/1.0.3 (Linux) Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Date: 26 Apr 2023 08:01:03 GMT Lines: 91 Message-ID: <6448da3f$0$3072$426a34cc@news.free.fr> Organization: Guest of ProXad - France NNTP-Posting-Date: 26 Apr 2023 10:01:03 CEST NNTP-Posting-Host: 62.212.98.88 X-Trace: 1682496063 news-4.free.fr 3072 62.212.98.88:11246 X-Complaints-To: abuse@proxad.net Bytes: 3900 Bonjour à tous, Je poste ici (j'ai aussi contacté le support du fabricant, sans réponse pour l'instant). Dans un circuit, j'utilise une mémoire MR25H256A. Il s'agit d'une mémoire magnétique permettant l'horodatage d'événements. J'arrive sans problème à y écrire et à relire les données, le problème n'est pas là. Le problème tourne autour du mode SLEEP. Je ne sais pas si certains d'entre vous ont déjà utilisé ce genre de mémoire. Actuellement, j'initialise la mémoire au démarrage du firmware et je lui envoie une commande sleep. Ensuite, le circuit se met en veille profonde (CPU arrêté, redémarrant sur une interruption d'une horloge à temps réel). La première interruption arrive pour l'instant au bout d'une minute, mais en utilisation réelle, ce sera plutôt une semaine. Entre le démarrage et le traitement de la première interruption, la mémoire n'est pas en veille (ça se voit à sa consommation). Lors du reveil du CPU, je lui envoie une seconde commande et, miracle, le composant se met effectivement en veille ! J'ai essayé de truander en envoyant deux fois la commande SLEEP lors de l'initialisation, en introduisant un délai entre les deux commandes SLEEP, ça ne fonctionne pas et je ne comprends pas. Le code actuel est le suivant : void mram_init() { uint8_t sr; // wp à l'état bas : impossible d'écrire dans le registre de statut gpio_off(&gpios[gpio_wp_mram]); mutex_lock(&mutex_spi); spi_select_device(dev_mram); gpio_on(&gpios[gpio_hold_mram]); spi_select_device(dev_none); mutex_unlock(&mutex_spi); mram_command0(MRAM_WAKE); sr = 0x82; mram_command0(MRAM_WREN); gpio_on(&gpios[gpio_wp_mram]); mram_command1(MRAM_WRSR, &sr); gpio_off(&gpios[gpio_wp_mram]); mram_command0(MRAM_WRDI); mram_command0(MRAM_SLEEP); return; } // MRAM_WREN, MRAM_WRDI, MRAM_SLEEP, MRAM_WAKE void mram_command0(uint8_t commande) { mutex_lock(&mutex_spi); spi_select_device(dev_mram); spi_send8(commande); spi_select_device(dev_none); mutex_unlock(&mutex_spi); return; } Après l'interruption, j'envoie simplement à la mémoire : mram_command0(MRAM_SLEEP); Comme la commande est traité la seconde fois, je suppose que la routine mram_command0() fonctionne. mutex_lock/unlock sont là parce que le firmware est multitâche et temps réel. spi_select_device() sélectionne le bon composant sur le bus SPI (il y a un capteur de température, un écran epaper, une RTC, un modem...). Ce bus SPI fonctionne bien. gpio_on/off positionnent les différentes lignes de contrôle de la mémoire. J'ai essayé tout ce qui était rationnel, j'ai relu la doc, je ne vois pas pourquoi après un 'certain' temps, la commande SLEEP est traitée et pourquoi elle ne l'est pas la première fois. Je suis preneur de toute idée. Bien cordialement, JKB -- Si votre demande me parvient en code 29, je vous titiouillerai volontiers une réponse.