AN169 : Mise en oeuvre bus SSI

Transcription

AN169 : Mise en oeuvre bus SSI
Note d’application
AN-169
Rev 1.0
MISE en OEUVRE DES CODEURS SSI
Exemple de code (microchip XC8) :
typedef union { // conversion et découpage d'un int en
bytes
Les codeurs des séries 22Y ou 25Y disposent
d'une interface série synchrone.
struct {
Le maître fournit une horloge et lit les 12 bits
formant la position actuelle du codeur.
};
Le codeur ne dispose pas de signal de
validation comme un « chip select » et doit
être resynchronisé à chaque transmission.
La resynchronisation est effectuée par la mise
à l'état haut du signal d'horloge « CLK »
pendant un temps dit « TimeOut ».
Ceci a pour conséquence d'imposer des temps
limites sur CLK, en effet une horloge trop
lente pourrait être interprétée comme un
TimeOut.
int valInt;
} valueInt;
unsigned int grayToBinary(unsigned int num) {
unsigned int mask;
for (mask = num >> 1; mask != 0; mask = mask
>> 1) {
num = num ^ mask;
}
return num;
}
int main(int argc, char** argv) {
La durée à l'état bas de CLK doit être
comprise entre 25ns et 16µs
valueInt dataVal;
La durée à l'état haut de CLK doit être
comprise entre 25ns et 16µs.
init();
while (1) {
TimeOut
dataVal.valInt = 0; // variable qui va contenir la
valeur lue sur le codeur SSI
clk = 0;
__delay_us(1); // la durée à l'état bas doit etre
entre 25ns et TimeOut
CLK
DATA
unsigned char low, high;
D11 D10
D0
for (char i = 0; i < 12; i++) {
0
clk = 1;
D'autre part les 12 bits sont transmis selon un
code Gray réduit, symétrique par rapport à la
valeur médiane.
__delay_us(1); // la durée à l'état haut doit
etre entre 25ns et TimeOut
clk = 0;
// la durée à l'état bas doit etre entre 25ns et
TimeOut
dataVal.valInt = (dataVal.valInt << 1) |
data; // le premier bit transmis est D11
// __delay_us(1); // la durée à l'état bas doit
etre entre 25ns et TimeOut
// donc ne pas rajouter de délai si la durée du
décalage est suffisamment longue
}
// Un dernier coup de clock, mais sans décalage
clk = 1;
__delay_us(1); // la durée à l'état haut doit etre
entre 25ns et TimeOut
Tél:04.50.70.54.54
[email protected]
http://www.megatron.fr
AN-169
2
clk = 0;
__delay_us(1); // la durée à l'état haut doit etre
entre 25ns et TimeOut
clk = 1;
//
__delay_us(17); // Timeout de 16µs mini
permettant la resynchronisation pour la demande
suivante
//
dataVal.valInt = grayToBinary(dataVal.valInt);
while (BusyUSART());
WriteUSART(dataVal.high); // par exemple sortie
sur UART du MSB
while (BusyUSART());
WriteUSART(dataVal.low); // par exemple sortie
sur UART du LSB
}
Exemple d'interface :
Les lignes CLK et DATA étant symétriques une
conversion de type RS422 est nécessaire
DCM-102-D
5 ou +24V
GND
2
1
+5V
CN3
C2
1
2
100nF
U1
1
+5V
2
3
4
8
7
6
5
CN1
5
1
4
2
3
+5V
2
3
C3
1
1
2
3
4
RO
RE
DE
DI
VCC
B
A
GND
6
7
6
5
http://www.megatron.fr
VCC
GND
CLK+
CLKDAT+
DAT-
DCM-106-D
2
8
MAX3082CPA
[email protected]
2
100nF
U2
Tél:04.50.70.54.54
4
5
+5V
120
1
R2
CN2
VCC
B
A
GND
MAX3082CPA
DCM-105-D
CLK
DATA
GND
VCC
RO
RE
DE
DI
1