Bonjour a tous,
Je suis entrain de programer un bus CAN a l'aide d'un sja 1000
Le soucis c'est que j'ai crée un programme mais il marche pas est ce que quelqu'un peut me dire ou est l'erreur? le programme ne fait pas l'initialisation
Merci pour votre aide.
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include "SPCCAN1DEF.h"
#include "SPCCAN1LIB.h"
#include "SPCCAN1STR.h"
void exit(int n);
void Affi_Info();
void Affi_Message(int nerr);
void delay_(int twait);
void Fin_program(int nerr);
void InitCan(CAN_NUM,BYTE,BYTE);
void reception(CAN_NUM,BYTE*);
void emission(CAN_NUM,BYTE,BYTE,BYT E,BYTE*);
DRIVER_INFO VInfoDriver;
//----------------------------------//
// Programme Principal
//----------------------------------//
void main(void)
{
int nerr,i;
BYTE fin_boucle=0;
BYTE pStatus;
BYTE Recep[8];
BYTE emiss[8];
// Init du Driver
// Lecture des informations de configuration
nerr = SCB_DrvGetConfig(&VInfoDriver, SIZE_DRVINFO);
if (nerr == SCB_NOERROR)
printf(" -- Driver carte SPC_CAN1 initialise\n");
else {
printf(" +++ Erreur Init Driver carte SPC_CAN1 :");
Fin_program(nerr);
}
//----------------------------------------------------------------------
// Configuration de la carte
//----------------------------------------------------------------------
// reset de la carte CAN
nerr = SCB_CanHardwareReset();
if (nerr == SCB_NOERROR)
printf(" -- Reset Hard des CAN initialise\n");
else {
printf(" +++ Erreur Init Driver carte SPC_CAN1 :");
Fin_program(nerr);
}
//****************************** ****************************** *************
// Programme à insérer
//****************************** ****************************** ************
char test;
InitCan(SJA1 ,0x20,0x09);
printf("init");
nerr=SCB_ReadByteSJA(SJA1,0,&t est);
if (nerr != SCB_NOERROR)
{
printf(" +++ LECT MODE\n");
printf(test);
Fin_program(nerr);
}
else {
printf(" +++ Erreur lect");
Fin_program(nerr);
}
// Sortie du programme
//---------------------------------
nerr=0;
Fin_program(nerr);
}
// Fin du programme principal
// Focntion de sortie du programme
void Fin_program(int nerr)
{
if (nerr > SCB_NOERROR)
Affi_Message(nerr);
printf("\n .... taper une touche pour terminer : ");
nerr=SCB_DrvIrqDisable(1);
nerr=SCB_DrvIrqDisable(2);
nerr=SCB_FifoStopWait();
getche();
exit(0);
}
//------------------------------------
// Affichage de l'erreur
void Affi_Message(int nerr)
{
PCHAR pMsge;
pMsge = SCB_ErreurMessage(nerr);
printf("\n Erreur num [%02d] = %s\n\n", nerr, pMsge);
}
//------------------------------------
// Fonction delai
void delay_(int twait)
/****************************** ****************************** *************/
/* */
/* Temporisation de <twait> millisecondes */
/* */
/****************************** ****************************** *************/
{
//clock_t goal;
DWORD goal, time;
time = (DWORD)clock();
goal = time + (DWORD)twait;
while (goal > (DWORD)clock());
}
//---------------------------------------
// Fonction d'initialisation d'un controleur CAN
void InitCan(CAN_NUM Num,BYTE Acr,BYTE Amr)
{ int nerr;
BYTE pDat;
/* Arrêt de toute transmission par CAN (page 12)*/
nerr=SCB_WriteByteSJA(Num,0, 0x01 );
if (nerr != SCB_NOERROR)
{
printf(" +++ Erreur Mode RESET\n");
Fin_program(nerr);
}
/* Permet l'utilisation d'une horloge externe (non employée ici) ainsi que la version du CAN utilisée (le bit $CBP$ sera mis à 1.
page 55 */
nerr=SCB_WriteByteSJA(Num,31, 0x48 );
if (nerr != SCB_NOERROR)
{
printf(" +++ MODE\n");
Fin_program(nerr);
}
/* Déterminer l'Acceptance Code Register (registre 4) */
nerr=SCB_WriteByteSJA(Num,4, Acr);
if (nerr != SCB_NOERROR)
{
printf(" +++ Erreur Acceptance Code\n");
Fin_program(nerr);
}
/* La ligne suivante permet de déterminer le filtre afin que le noeud réagisse uniquement à son identificateur (voir page 20 pour le configurer) */
nerr=SCB_WriteByteSJA(Num,5, Amr );
if (nerr != SCB_NOERROR)
{
printf(" +++ Acceptance Mask\n");
Fin_program(nerr);
}
/* Fixe la vitesse max du SJA1000 */
/* Calculer les registres $N_{NBT}$, $N_{BRP}$, $N_{SEG1}$, $N_{SEG2}$ et $N_{SJW}$ et déterminer les valeurs des registres d'adresse 6 et 7 (page 50) ATTENTION utilisez les équations fournies*/
nerr=SCB_WriteByteSJA(Num,6, 0xC7 );
if (nerr != SCB_NOERROR)
{
printf(" +++ BREG1\n");
Fin_program(nerr);
}
nerr=SCB_WriteByteSJA(Num,7, 0x45 );
if (nerr != SCB_NOERROR)
{
printf(" +++ BREG2\n");
Fin_program(nerr);
}
/* Détermine le mode du bus */
nerr=SCB_WriteByteSJA(Num,8, 0x1A );
if (nerr != SCB_NOERROR)
{
printf(" +++ MODE du BUS\n");
Fin_program(nerr);
}
/* tester le registre d'adresse 0 pour déterminer si le noeud sort de son mode RESET */
do {
nerr=SCB_WriteByteSJA(Num,0, 0x00 );
if (nerr != SCB_NOERROR)
{
printf(" +++ Erreur Sortie MODE RESET\n");
Fin_program(nerr);
}
nerr=SCB_ReadByteSJA(Num,0,&pD at);
if (nerr != SCB_NOERROR)
{
printf(" +++ LECT MODE\n");
Fin_program(nerr);
}
}
while((pDat& 0x00 )!= 0x01 );
}
-----