Bonjour,
Pour un projet scolaire, je dois interfacer un SJA1000 (contrôleur de bus CAN) avec une carte de développement Cygnal contenant un coeur Intel 8051. Le SJA1000 est quant à lui disposé sur une carte annexe que nous avons développé et qui est pluggée sur le connecteur 64 broches de la carte de développement.
J'utilise l'IDE Silabs avec le compilateur Keil.
Mon problème se situe au niveau des fonctions pour écrire et lire dans les registres du SJA1000. Ce composant dispose d'un bus d'adresse/données multiplexé, et il faut donc écrire d'abord l'adresse, puis la donnée. J'ai suivi les chronogrammes décrits dans le datasheet du SJA1000, puis pour tester j'écris une valeur dans un registre, je le relis et je visualise la valeur lue sur le debugger.
Timings
Chronogrammes en lecture
Chronogrammes en écriture
Voici le code de mes fonctions de lecture/écriture :
Ici les différentes déclarations :Code:void write_SJA1000 (unsigned char adresse , unsigned char donnee) { ALE=1 ; SJA_AD_BUS=adresse ; ALE=0 ; CS=0 ; WR=0 ; SJA_AD_BUS=donnee ; WR=1 ; CS=1 ; } void read_SJA1000 (unsigned char adresse , unsigned char *donnee) { ALE=1 ; SJA_AD_BUS=adresse ; ALE=0 ; SJA_AD_BUS=0xFF ; CS=0 ; *donnee=SJA_AD_BUS ; RD=0 ; RD=1 ; CS=1 ; SJA_AD_BUS=0xFF ; }
Et enfin le morceau de code dans lequel je teste mes fonctions :Code:#define SJA_AD_BUS P3 sbit ALE=P2^4 ; //pin 4 du port 2 sbit CS=P2^5 ; //pin 5 du port 2 sbit WR=P2^6 ; //pin 6 du port 2 sbit RD=P2^7 ; //pin 7 du port 2 ... //Initialisations SJA_AD_BUS=0xFF ; CS=1 ; WR=1 ; RD=1 ; ALE=0 ;
Ici BTR0 est l'un des 2 registres permettant de configurer le débit sur le bus CAN, mais j'aurai pu tester avec n'importe quel autre registre...Code:unsigned char reg=0 ; ... write_SJA1000 (BTR0 , 0x81) ; delai_us (100) ; read_SJA1000 (BTR0 , ®) ;
Le problème est donc que la valeur que je lis dans reg via le debugger ne correspond pas à la valeur écrite précédemment. Je précise que nous avons testé avec un multimètre les 8 bits du port reliant le 8051 au SJA afin de vérifier que nous avions les bons niveaux logiques, ce n'est donc pas un problème hardware.
Je pense donc que à un problème d'interprétation des chronogrammes, pourtant ça à l'air de bien correspondre, mais même avec les rares morceaux de code que j'ai trouvé sur internet ça ne marche pas...
Pour finir voici le schéma de notre carte :
Merci d'avance.
-----