PI7C9X760

Liste des GroupesRevenir à fs electronique 
Sujet : PI7C9X760
De : JKB (at) *nospam* hilbert.invalid (JKB)
Groupes : fr.sci.electronique
Date : 28. Apr 2023, 18:24:02
Autres entêtes
Organisation : Guest of ProXad - France
Message-ID : <644c0132$0$7630$426a34cc@news.free.fr>
User-Agent : slrn/1.0.3 (Linux)
Bonjour à tous,

L'un d'entre vous a-t-il déjà joué avec le composant en référence ?
Il s'agit d'un pont SPI/RS232. Il est câblé sur une carte, j'arrive
à lui parler au travers du bus SPI, mais je n'ai jamais rien de
correct sur la sortie.

J'ai l'impression qu'en fonction de l'ordre d'écriture dans les
différents registres de configuration, le résultat n'est pas le
même.

J'essaie de configurer l'engin en 115200 1N8. J'ai donc écrit ceci :

void
pi7c9x760_init()
{
    // Interruptions
    // Mode FIFO
    pi7c9x760_sfr2(false);
    pi7c9x760_write(0x03, 0xBF);
    // EFR accessible si LCR=0xBF et SFR[2]=0
    pi7c9x760_write(0x02, 0b11010000); // EFR: CTS/RTS, EFR4
    // IER accessible si LCR[7]=0
    pi7c9x760_lcr7(false);
    pi7c9x760_write(0x01, 0b00010011); // IER: sleep mode, TX/RX data ready irqs
    // FCR accessible si LCR[7]=0
    pi7c9x760_write(0x02, 0b01010111); // FCR

    // 115200, 8N1
    // Diviseur 8
    // Sample rate 26 (16 - SCR + CPRN)
    // SCR vaut par défaut 0.
    pi7c9x760_sfr2(true);
    // CPR accessible lorsque LCR=0xBF et SRF[2]=1
    pi7c9x760_write(0x03, 0xBF);        // LCR
    pi7c9x760_write(0x04, 0x1A);        // CPR
    // Contrôle de flux : auto-cts et auto-rts, CD et RI
    // MCR accessible si LCR[7]=0
    pi7c9x760_lcr7(false);
    pi7c9x760_write(0x04, 0b00001100);  // MCR
    // TLR accessible si EFR[4]=1 et MCR[2]=1
    pi7c9x760_write(0x07, 0b00000000);  // TLR
    pi7c9x760_write(0x03, 0b10000000);  // LCR
    // DLH et DLL accessibles parce que LCR[7]==1 et LCR!=0xBF
    pi7c9x760_write(0x01, 0b00000000);  // DLH
    pi7c9x760_write(0x00, 0b00001000);  // DLL
    pi7c9x760_write(0x03, 0b00000011);  // LCR
   
    // SFR pour DSR/DTR
    return;
}  

avec les deux routines suivantes :

static void
pi7c9x760_lcr7(bool valeur)
{
    uint8_t     tmp;

    tmp = pi7c9x760_read(0x03);

    if (valeur)
    {
        pi7c9x760_write(0x03, tmp | 0b10000000);
    }
    else
    {
        pi7c9x760_write(0x03, tmp & 0b01111111);
    }

    return;
}

static void
pi7c9x760_sfr2(bool valeur)
{
    uint8_t     lcr;
    uint8_t     tmp;


    lcr = pi7c9x760_read(0x03);
    pi7c9x760_write(0x03, 0xBF);        // LCR
    pi7c9x760_write(0x0D, 0x5A);        // SFREN

    tmp = pi7c9x760_read(0x07);

    if (valeur)
    {
        pi7c9x760_write(0x07, tmp | 0b00000100);
    }
    else
    {
        pi7c9x760_write(0x07, tmp & 0b11111011);
    }

    pi7c9x760_write(0x03, lcr);
    return;
}

Les opérations de lecture et d'écriture se passent bien (j'arrive à
relire ce que j'ai écrit dans un registre). C'est la configuration
qui ne se passe pas bien. Par moment, j'ai réussi à envoyer des
données sur le port série, mais sans doute pas à la bonne vitesse.
J'ai revérifié ma configuration et, depuis, le composant est muets
mais j'arrive toujours à y lire des données cohérentes. Typiquement,
lorsque je polle les interruptions, je lis ceci :

POL: 00 C1 03

Donc aucune interruption en cours (00), la valeur du registre (C1,
correct) et le registre LCR 03 (correct aussià).

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
28 Apr 23 * PI7C9X7603JKB
2 May 23 +- Re: PI7C9X7601JKB
3 May 23 `- Re: PI7C9X7601JKB

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal