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