P
Pachi
Guest
BonjourJe suis confronté à un problème d'interface du CS5450A Cirrus à Atmel 89C51 / 89C52 microcontrôleur.Je veux savoir comment lire les données de la 5460A.Le SCK, SDO, SDI broches sont lus grâce à T0, T1 et épingles WR (Port 3 broches 4,5,6).Je suis passé par la fiche technique de 5460 et a essayé un peu de code, mais les octets lus sont une valeur arbitraire.Voici le code:
read_data (void)(write_to_register (0xE8, 0xFF, 0xFF, 0xFF); / / conv Démarrer, Nop, Nop, Nopwrite_to_register (0xFF, 0xFF, 0xFF, 0xFE); / / Sync1, Sync1, Sync1, sync0read_register (0x0E); / / Lire actuel registre)
write_to_register vide (commande char, faible, char mi, char élevé)(transfer_byte (commande);transfer_byte (élevé);transfer_byte (mi);transfer_byte (faible);retour
read_register vide (commande char)(transfer_byte (commande);high_byte = recieve_byte (); / * Recevez octets * /mid_byte = recieve_byte ();low_byte = recieve_byte ();retour
transfer_byte vide (nombre char)(q unsigned int, x, b [8];pour (q = 7; q! = 0; q -) / / convertir en binaire(x = nombre / (1 <<q);= Nombre Nombre - x * (1 <<q);b [q] = x
SCLK = 0;
pour (q = 7; q! = 0; q -)(SDI = b [q]; / bit place / à transmettreSCLK = 1; SCLK = 0; / / impulsion de l'horloge)SDI = 1;retour
recieve_byte char (void)(unsigned int i;unsigned char x [8], la synchronisation [8] = "11111110";SDI = 1;for (i = 0; i <8; i )(x = SDO / / recevoir des bitsSDI = synchronisation ; / / datasheet dit sync0 devrait être stroboscopique sur SDI/ / Lors de la lecture de SDO
SCLK = 1; SCLK = 0; / / impulsion de l'horloge)return x
Ajouté après 20 minutes:is:
Le
résultat est:
high_byte = = mid_byte low_byte = 10
En outre, les appels de fonction write_to_register font aucun effet (même sortie sans eux).Sans read_register, les valeurs sont comprises entre 0 chacune, de sorte read_register fonctionne, mais pas correctement (il montre toujours ces valeurs, peu importe ce que le courant / tension est lu)
read_data (void)(write_to_register (0xE8, 0xFF, 0xFF, 0xFF); / / conv Démarrer, Nop, Nop, Nopwrite_to_register (0xFF, 0xFF, 0xFF, 0xFE); / / Sync1, Sync1, Sync1, sync0read_register (0x0E); / / Lire actuel registre)
write_to_register vide (commande char, faible, char mi, char élevé)(transfer_byte (commande);transfer_byte (élevé);transfer_byte (mi);transfer_byte (faible);retour
read_register vide (commande char)(transfer_byte (commande);high_byte = recieve_byte (); / * Recevez octets * /mid_byte = recieve_byte ();low_byte = recieve_byte ();retour
transfer_byte vide (nombre char)(q unsigned int, x, b [8];pour (q = 7; q! = 0; q -) / / convertir en binaire(x = nombre / (1 <<q);= Nombre Nombre - x * (1 <<q);b [q] = x
pour (q = 7; q! = 0; q -)(SDI = b [q]; / bit place / à transmettreSCLK = 1; SCLK = 0; / / impulsion de l'horloge)SDI = 1;retour
recieve_byte char (void)(unsigned int i;unsigned char x [8], la synchronisation [8] = "11111110";SDI = 1;for (i = 0; i <8; i )(x = SDO / / recevoir des bitsSDI = synchronisation ; / / datasheet dit sync0 devrait être stroboscopique sur SDI/ / Lors de la lecture de SDO
SCLK = 1; SCLK = 0; / / impulsion de l'horloge)return x
Ajouté après 20 minutes:is:
Le
résultat est:
high_byte = = mid_byte low_byte = 10
En outre, les appels de fonction write_to_register font aucun effet (même sortie sans eux).Sans read_register, les valeurs sont comprises entre 0 chacune, de sorte read_register fonctionne, mais pas correctement (il montre toujours ces valeurs, peu importe ce que le courant / tension est lu)