Bonjour,
J'essaie de communiquer avec un AD5271 (20 kOhm) mais j'ai un décalage entre l'écriture et la relecture du registre RDAC, le problème n'est pas présent lorsque je fais la même chose avec le registre de configuration.
Je m'explique :
J'aimerais que ma routine d'écriture du registre RDAC fasse une relecture pour s'assurer que la valeur écrite est conforme (commandes 0x01 et 0x02 p.19). Le formate de la trame est donnée p.7.
Lorsque j'écris dans le registre de configuration et que je relis la valeur, j'obtiens bien la même chose (commandes 0x07 et 0x08). Par contre si je fais la même chose avec RDAC, la valeur correcte n'apparaît qu'après 3 cycles :
Le problème c'est que j'aimerais qu'il y ait un retour d'erreur si la valeur lue ne correspond pas à la valeur envoyée, donc l'idéal ce serait de pouvoir recevoir la donnée juste après la première écriture, sans avoir à écrire sur 3 cycles... J'ai essayé avec un délai d'1 seconde entre l'écriture et la lecture, pas de changement, c'est bien un problème de cycle d'écriture.Code:Terminal de debug : writeValue: 0 readValue: 0 writeValue: 78 readValue: 0 writeValue: 156 readValue: 78
voici une partie du code qui gère l'accès à l'AD5271 :
Quelqu'un a une idée du problème, ou rencontré le même problème?Code:/* AD5271_transferData - Simultaneously send and receive data word from AD5271 through SPI. * parameter wData : Data to send. * parameter rData : Data to read. * return status : 0 = success; negative = fail. */ int AD5271_transferData(unsigned short int wData,unsigned short int *rData) { int status=0; unsigned char wByte[2]; unsigned char rByte[2]; wByte[0]=(unsigned char)((wData>>8)&0xFF); wByte[1]=(unsigned char)(wData&0xFF); SPI3_configure(MASTER,NO_BUFFER,MODE_8_BIT,AD5271_CKE,AD5271_CKP,AD5271_SMP); status=SPI3_transferByteFrame(wByte,rByte,2); *rData=((unsigned short int)rByte[0]<<8)|(unsigned short int)rByte[1]; return status; } /* AD5271_writeData - Send data to AD5271 through SPI. * parameter command : Command address. * parameter wData : Data to send. * return status : 0 = success; negative = fail. */ int AD5271_writeData(unsigned char command,unsigned short int wData) { int status=0; unsigned short int value=0; value=((unsigned short int)((command<<10)&0x3C00)|(wData&0x03FF)); AD5271_CS_low(); status=AD5271_transferData(value,NULL); AD5271_CS_high(); return status; } /* AD5271_readData - Read data from AD5271 through SPI. * parameter command : Command address. * parameter wData : Data to write. * parameter rData : Data to read. * return status : 0 = success; negative = fail. */ int AD5271_readData(unsigned char command,unsigned short int wData,unsigned short int *rData) { int status=0; unsigned short int wValue=0; wValue=((unsigned short int)((command<<10)&0x3C00)|(wData&0x03FF)); AD5271_CS_low(); status=AD5271_transferData(wValue,rData); AD5271_CS_high(); return status; } /* AD5271_setResistor - Write value to RDAC to set resistor value. * parameter resistorValue : Resistor value to set. * return status : 0 = success; negative = fail. */ int AD5271_setResistor(unsigned long int resistorValue) { unsigned char wValue=0; if(resistorValue>AD5271_RESISTOR) return -1; wValue=(unsigned char)(((unsigned long int)resistorValue*255)/(unsigned long int)AD5271_RESISTOR); return (AD5271_writeData(AD5271_WRITE_RDAC,(unsigned short int)((wValue<<2)&0x03FC))); } /* AD5271_getResistor - Read resistor value from RDAC. * parameter resistorValue : Resistor value to get. * return status : 0 = success; negative = fail. */ int AD5271_getResistor(unsigned long int *resistorValue) { int status=0; unsigned short int rValue=0; status=AD5271_readData(AD5271_READ_RDAC,NULL,&rValue); *resistorValue=(unsigned long int)(AD5271_RESISTOR/255)*((unsigned long int)((rValue>>2)&0xFF)); return status; }
-----