Mise en veille mémoire MRAM

Liste des GroupesRevenir à fs electronique 
Sujet : Mise en veille mémoire MRAM
De : JKB (at) *nospam* hilbert.invalid (JKB)
Groupes : fr.sci.electronique
Date : 26. Apr 2023, 10:01:03
Autres entêtes
Organisation : Guest of ProXad - France
Message-ID : <6448da3f$0$3072$426a34cc@news.free.fr>
User-Agent : slrn/1.0.3 (Linux)
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.

Date Sujet#  Auteur
26 Apr 23 * Mise en veille mémoire MRAM3JKB
26 Apr 23 `* Re: Mise en veille mémoire MRAM2JKB
26 Apr 23  `- Re: Mise en veille mémoire MRAM1jules

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal