PI7C9X760

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

Reply to
JKB
Loading thread data ...

Bonsoir,

Je me réponds à moi-même.

Le PI7C9X760 semble être à la tension minimale d'alimentation près un SC16IS760 de NXP (la version NXP demande 2,5V là où celle de Pericom demande 1,8V).

J'ai téléchargé la doc de NXP qui est autrement mieux fichue est j'ai enfin réussi à obtenir quelque chose sur le port de sortie.

La configuration est maintenant la suivante :

void pi7c9x760_init() { // CTS : input // RTS : output // DTR : output (GPIO 5) // DSR : input (GPIO 4) // RI : input (GPIO 7) // CD : input (GPIO 6)

// 115200, 8N1 // Diviseur 8 // Sample rate 26 (16 - SCR + CPRN) // SCR vaut par défaut 0.

// CPR accessible par LCR==0xBF et SFR[2]==1 pi7c9x760_write(0x03, 0xBF); // LCR pi7c9x760_write(0x0D, 0x5A); // SFREN pi7c9x760_write(0x07, 0x04); // SFR pi7c9x760_write(0x04, 0x1A); // CPR pi7c9x760_write(0x09, 0x06); // TX/RX Control Register pi7c9x760_write(0x07, 0x00); // SFR

pi7c9x760_write(0x03, 0x80); // LCR : divisor latch enable // DLH et DLL accessibles parce que LCR[7]==1 et LCR!=0xBF // Diviseur 8 pi7c9x760_write(0x01, 0x00); // DLH pi7c9x760_write(0x00, 0x08); // DLL

// Access EFR register pi7c9x760_write(0x03, 0xBF); // LCR pi7c9x760_write(0x02, 0x01); // EFR

// 8N1 pi7c9x760_write(0x03, 0x03); // LCR

// FIFO pi7c9x760_write(0x02, 0x67); // FCR

// Interruptions pi7c9x760_write(0x01, 0x03); // IER: TX/RX data ready irqs

return; }

Les routines de lecture et d'écriture sont toujours les mêmes. Je lis toujours correctement les contenus des registres.

Dans une routine, j'essaie maintenant d'envoyer des caractères ASCII sur le port série et j'obtiens :

2023-05-02 19:25:14.406852: E8 E9 E9 E8 E8 EB E9 E8 EA EB EB EA EA EB EB EC EC ED ED EC EE EF EF EE EC 2023-05-02 19:25:15.718416: E8 E9 E9 E8 EA EB E9 EA EA E9 E9 EA EA EB EB EC EC ED ED EC EC ED ED EC EE 2023-05-02 19:25:17.014097: E8 E9 E9 E8 E8 E9 EB EA E8 EB EB EA EA EB EB EC EC ED ED EE EC ED ED EC EE 2023-05-02 19:25:18.309762: E8 E9 E9 EA E8 E9 EB E8 EA EB E9 EA EA EB EB EC EC ED ED EC EC ED ED EE EE 2023-05-02 19:25:19.621330: E8 E9 E9 EA E8 E9 E9 E8 EA E9 EB EA EA EB EB EC EC ED ED EE EC EF ED EC EE 2023-05-02 19:25:20.916976: E8 E9 E9 E8 EA E9 E9 EA EA E9 EB EA EA EB EB EC EC ED ED EC EC EF ED EE EE 2023-05-02 19:25:22.228530: E8 E9 E9 E8 E8 E9 E9 E8 E8 EB E9 EA EA EB EB EC EC ED ED EC EC EF ED EC EC

Là, j'obtiens bien mes 25 caractères. Sauf que... je tente d'envoyer ceci :

for(i = 'A'; i < 'Z'; i++) { pi7c9x760_write(0x00, i); }

La vitesse sur le port semble donc être la bonne. LSR vaut $60, donc FIFO data error et THR et TSR vides.

Pourquoi FIFO error ? Je suppose que c'est ce qui explique la non répétabilité des données transmises.

Je suis preneur de toute idée,

JKB

Reply to
JKB

C'est un mystère intégral (et comme la doc est lacunaire...). J'ai sorti le scope pour vérifier ce qu'envoiyait le composant et j'ai pu voir les bonnes trames, mais à 187000 bauds au lieu de 115200 !

J'ai réglé la vitesse avec 8 comme diviseur et 26 comme 'sample rate'. 187000 correspond à 8/16 (16 étant la valeur par défaut du 'sample rate'). Pourtant, j'écris bien dans le registre CPR.

J'ai remplacé 8/26 par 13/16. Et ça fonctionne.

JKB

Reply to
JKB

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.