A titre d'exemple, le code source utilisé dans le DSPiy pour le générer et les explications :
Code : Tout sélectionner
//fonction appellée lorsque l'on veut envoyer un mot
// les 7 bits de poids faible sont le data, les autres le device
void multidspyout(unsigned short d)
{
if(D01_ISO_OUT!=5)return;//on vérifie que l'on est bien en mode multidspiy
while(nbitmultidspiy!=0);//attend fin transmission si encours.
while(LPC_TMR32B0->TCR != 0x0);//pour être vraiment certain que le dernier bit soit sorti.
datamultidspiy=d; //datamultidspiy est une variable globale, c'est pas beau mais efficace.
nbitmultidspiy=25; //compteur pour savoir où l'on en est dans le transfert : nombre de bit*2 +1
GPIOSetValue(Port_ISO_OUT,Pin_ISO_OUT,1); //on place la sortie à 1 (dépend de son électronique)
LPC_TMR32B0 ->MR0 = 2400; //délai du start IR sony,
LPC_TMR32B0->TCR = 0x02; //reset timer
LPC_TMR32B0->TCR = 0x01; //start timer
//on a donc lancé le timer qui nous fera une interrupt dans 2400µS
}
//Timer en interruption
void TIMER32_0_IRQHandler(void)
{
if ( LPC_TMR32B0->IR & 0x1 )//on vérifie si c'est le flag du bon timer qui a déclenché l'interrupt
{
LPC_TMR32B0->IR = 1; // clear interrupt flag
LPC_TMR32B0->TCR = 0x02; // reset timer
if(nbitmultidspiy==0){LPC_TMR32B0->TCR = 0x0;return;} //on est arrivé à la fin, stop timer
if(nbitmultidspiy==1){nbitmultidspiy=0;GPIOSetValue(Port_ISO_OUT,Pin_ISO_OUT,0);LPC_TMR32B0 ->MR0 = 40000; LPC_TMR32B0->TCR = 0x01;return;}//fin de l'envoi des datas mais l'on génère un espace minimumentre 2 frames
if((nbitmultidspiy&1)){nbitmultidspiy--;GPIOSetValue(Port_ISO_OUT,Pin_ISO_OUT,0);LPC_TMR32B0 ->MR0 = 600; LPC_TMR32B0->TCR = 0x01;return;} //on force la sortie à zéro pendant 600µS si nbitmultidspiy est impaire
GPIOSetValue(Port_ISO_OUT,Pin_ISO_OUT,1);// forcément on est sur du paire donc sortie à 1.
if(datamultidspiy&(1)){LPC_TMR32B0 ->MR0 = 1200;}//Pour un data bit à 1 : 1200µS On
else {LPC_TMR32B0 ->MR0 = 600;}//Pour un data bit à 0: 600µS On
nbitmultidspiy--;//on décrémente
datamultidspiy=datamultidspiy>>1;//et rotation à droite pour positionner le bit suivant à transmettre
LPC_TMR32B0->TCR = 0x01; //start timer
}
}