CS5460A à 8051/8052: Comment lire les données

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)

 
veuillez vous référer au lien suivant, il peut aider à U.

# 1205749 http://www.edaboard.com/viewtopic.php?p=1205749

 
J'ai lu ce poste et mis en œuvre les initialisations.mais il semble toujours être un problème.le bit de données 24 est toujours lu 00 00 00.Voici le code modifié.

void begin ()
(
unsigned int i;
RESET = 0; / / reset initial
SDelay (100);
RESET = 1;

write_to_register (0x5e, 0x00, 0x00, 0x01); / reg / status = 000001
write_to_register (0x40, 0x00, 0x00, 0x04); / / reg config = 000004
write_to_register (0x4A, 0x00, 0x00, 0x32); / nombre de cycles / = 000032
write_to_register (0x78, 0x00, 0x00, 0x08); / reg / ou de contrôle = 000008
write_to_register (0x74, 0x80, 0x00, 0x00); / reg / masque = 800000
write_to_register (0xE8, 0xFF, 0xFF, 0xFF); / conv start /, nd, nd, nd
write_to_register (0xFF, 0xFF, 0xFF, 0xFE); / / nd nd nd nd

read_register (0x0E); / / lire Inst reg actuelle
SDelay (200); / / delay

for (i = 0; i <50; i )
(
P2 = 0xFF; LED1 = 0; P0 = affichage ((high_byte>> 4) & 0x0F); / / Affichage à haute
SDelay (300);
P2 = 0xFF; LED2 = 0; P0 = affichage ((high_byte) & 0x0F);
SDelay (300);

P2 = 0xFF; LED3 = 0; P0 = affichage ((mid_byte>> 4) & 0x0F); / / Affichage mi
SDelay (300);
P2 = 0xFF; LED4 = 0; P0 = affichage ((mid_byte) & 0x0F);
SDelay (300);

P2 = 0xFF; LED5 = 0; P0 = affichage ((low_byte>> 4) & 0x0F); / / affichage faible
SDelay (300);
P2 = 0xFF; led6 = 0; P0 = affichage ((low_byte) & 0x0F);
SDelay (300);
)
retour;
)

write_to_register vide (commande char, faible, char mi, char élevé)
(
transfer_byte (commande); / / commande de transfert suivie par les données à 24 bits
transfer_byte (élevé);
transfer_byte (mi);
transfer_byte (faible);
retour;
)read_register vide (commande char)
(
transfer_byte (commande);
high_byte = recieve_byte (); / / Recevoir Bytes
mid_byte = recieve_byte ();
low_byte = recieve_byte ();
retour;
)

transfer_byte vide (nombre char)
(
unsigned int i;
for (i = 0; i <8; i )
(
if (nombre et 0x80) SDI = 1; / / bit à transférer est mis sur la SDI
d'autre SDI = 0;

SDelay (100); / / delay
SCLK = 1; SDelay (100); SCLK = 0; SDelay (100); / horloge / impulsion

nombre = nombre <<1; / / bit suivant
)
retour;
)recieve_byte char (void)
(
unsigned int i;
unsigned char x, sync = 0xFE;
SDI = 1;
for (i = 0; i <8; i )
(
x = x | SDO; / / bit de SDO recieced est stocké
x = x <<1;

if (sync & 0x80) SDI = 1; / / NOP stroboscopique sur SDI lors de la lecture
d'autre SDI = 0; / / 5460 selon le datasheet
sync sync = <<1;

SDelay (100); / / delay
SCLK = 1; SDelay (100); SCLK = 0; SDelay (100); / horloge / impulsion
)
return x;
)Ajouté après 26 minutes:
J'ai aussi essayé d'écrire à la lecture im registre.
write_to_register (0x4E, 0xFF, 0xFF, 0xFF); / / écrire au lieu de commencer à conv, nd, nd, ndwrite_to_register (0xFF, 0xFF, 0xFF, 0xFE); / / nd nd nd nd
Pas de changement.
 
Je VHA pas passé par le code ur, mais juste l'essayer avec d'autres thanTo épingles et T1 de contrôleur.

 
Le circuit est câblé sur un circuit imprimé.dévers de la changer.Je pense que c'est un problème logiciel.

 

Welcome to EDABoard.com

Sponsor

Back
Top