Σελίδα 2 από 2 ΠρώτηΠρώτη 1 2
Εμφάνιση αποτελεσμάτων : 11 έως 18 από 18

Θέμα: Ερώτηση CAN Bus

  1. #11
    Νέο Μέλος Το avatar του χρήστη Γιάννης EECC
    Όνομα
    Γιάννης
    Εγγραφή
    Jul 2012
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    11

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από tmav Εμφάνιση μηνυμάτων
    Μερικές πληροφορίες για το CAN bus:
    1. είναι multidrop half dublex (δηλαδή πάνω στο bus υπάρχουν πολλές συσκευές, κάτι σαν το RS485)
    2. Κάθε συσκευή έχει την δική της μοναδική διεύθυνση (11bits ή 29bits)
    3. Οι standard ταχύτητες που παίζει είναι συνήθως 125Kbits, 250Kbits, 500Kbits.
    4. Μπορείς να στείλεις πακέτα σε συγκεκριμένη διεύθυνση με μέγεθος 1-8bytes. Σε περίπτωση
    που θέλεις να στείλεις παραπάνω bytes πρέπει να τα σπάσεις σε πολλά πακέτα.
    5. Ο CAN controller αναλαμβάνει να παραδώσει το πακέτο στην διεύθυνση. Μιας και είναι
    multidrop μπορεί η οποιαδήποτε συσκευή να στείλει πακέτα ταυτόχρονα με οποιαδήποτε άλλη
    στο bus. Σε περίπτωση που υπάρχει colision μεταξύ δύο πακέτων αυτόματα ο can controller
    του microcontroller θα ξαναστείλει το πακέτο μέχρι να πάρει ACK από τον δέκτη. Επίσης
    αυτόματα εισάγει CRC για να διασφαλιστεί η ακεραιότητα των δεδομένων.
    5. Οι CAN controllers έχουν συνήθως buffers για το rx/tx έτσι ώστε
    να μπορούν να δέχονται πολλαπλά πακέτα.
    6. Οι CAN controllers έχουν την δυνατότητα να ακούν μία ή περισσότερες διευθύνσεις, οπότε
    διαβάζουν μόνο τα μηνύματα που τους ενδιαφέρουν.

    Όλα τα παραπάνω το καθιστούν ένα άπό τα ποιο ασφαλή δίκυα και για αυτό το λόγο χρησιμοποιείται
    ευρέως σε αυτοκίνητα και βιομηχανία.
    Να προσθέσω ότι οι ταχύτητες μπορεί να είναι (με ασφάλεια) και στο 1Mbps.
    Επίσης, στο CAN δεν υπάρχει ποτέ collision.
    Το κάθε CAN transceiver χρησιμοποιεί ένα NRZ (Non-Return to-Zero) signal pattern με το οποίο μεταδίδει πρώτα το identifier (την 11bit ή 29bit διεύθυνση που αναφέρεις) ένα bit τη φορά, και συνεχίζει μετά με τα data. Σε περίπτωση που κάποια άλλη συσκευή προσπαθήσει να κάνει μετάδοση "χάνει" αυτός που θα μεταδώσει πρώτος άσσο "1" ενώ συνεχίζει αυτός που μεταδίδει "0". Αυτό λέγεται "no penalty arbitration" γιατί αυτός που "κερδίζει" τον έλεγχο του Bus δεν αντιλαμβάνεται αλλαγές ούτε χάνει χρόνο με επαναμεταδόσεις, εξού και η ασφάλεια που σωστά αναφέρεις λόγω του ότι είναι πλήρως real-time η απόδοσή του.
    Επίσης, το CAN είναι broadcast bus οπότε όλοι ακούνε όλους. Οι CAN controllers που περιλαμβάνονται συνήθως σε microcontrollers σου δίνουν τη δυνατότητα να ορίσεις φίλτρα για τα 11bit ή 29bit identifier ώστε να φιλτράρουν αυτόματα μηνύματα που δεν σε αφορούν και το CAN controller να λαμβάνει μόνο αυτά που θέλεις (να ενεργοποιείται το rx interrupt ή rx poll bit).
    Επειδή τα CAN Controller (state machine) και το CAN transceiver (CAN PHY) σου δίνουν τη δυνατότητα (το πρωτόκολλο, το μέσο) αλλά όχι και τη μέθοδο να επικοινωνήσεις δεδομένα και να στήσεις ένα δίκτυο συσκευών, έχουν εδώ και χρόνια εφαρμοστεί διάφορα συμπληρωματικά πρωτόκολλα που χρησιμοποιούν το CAN σαν backbone (π.χ. DeviceNet, ControlNet, CANopen, κλπ).
    Ελπίζω να μη σας κούρασα.
    Νίκο, έχω αναπτύξει εδώ και αρκετά χρόνια διάφορα πρωτόκολλα σχετικά με το CAN και θα ψάξω να ποστάρω κάποια απλά παραδείγματα σε C για να στηθεί μια υποτυπώδης επικοινωνία μεταξύ δύο κόμβων.

    0 Not allowed! Not allowed!

  2. Ένα μέλος ευχαρίστησε τον Γιάννης EECC για αυτό το χρήσιμο μήνυμα:

    xmaze (30-11-12)

  3. #12
    Μέλος Το avatar του χρήστη xmaze
    Όνομα
    Νίκος
    Εγγραφή
    May 2010
    Περιοχή
    Μακεδονία
    Μηνύματα
    1.034

    Προεπιλογή

    Εχω εναν Mega64C1 με CAN Controler και παρήγγειλα extra Μcp 2551 CAN tranceiver, με αυτά φαντάζομαι μπορώ να κάνω 2 υποτυπώδεις δοκιμαστικούς κόμβους;

    0 Not allowed! Not allowed!

  4. #13
    Μέλος
    Όνομα
    Θανάσης
    Εγγραφή
    Sep 2009
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    47

    Προεπιλογή

    Ο Mega64C1 και το Μcp2551 interface chip δημιουργούν ένα κόμβο. Θα χρειαστείς ακόμη ένα ζευγάρι ICs για δεύτερο κόμβο!

    0 Not allowed! Not allowed!

  5. #14
    Μέλος Το avatar του χρήστη xmaze
    Όνομα
    Νίκος
    Εγγραφή
    May 2010
    Περιοχή
    Μακεδονία
    Μηνύματα
    1.034

    Προεπιλογή

    Ναι, έχω 2 μΕ. Αναμενω τους κώδικες σου με ανυπομονησία!! ευχαριστώ

    0 Not allowed! Not allowed!

  6. #15
    Νέο Μέλος Το avatar του χρήστη Γιάννης EECC
    Όνομα
    Γιάννης
    Εγγραφή
    Jul 2012
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    11

    Προεπιλογή

    Λοιπόν Νίκο, το παρακάτω μου το έχει δώσει εδώ και πολλά χρόνια ένας συνάδελφος ονόματι A. David για τους TI DSP (TMS320F241 αν θυμάμαι) και τον ευχαριστώ. Στο στέλνω γιατί είναι μικρό και καλό τεστ για αρχική επικοινωνία. Μη σε απασχολεί το ότι είναι για άλλο επεξεργαστή, συνήθως οι registers για το CAN μοιάζουν πολύ από επεξεργαστή σ' επεξεργαστή.

    Αρχείο: patchCan.h
    Κώδικας:
    /*-----------------------------------------------------------------------------
    / Structure for message box. The layout of this structure corresponds to the
    / layout of the hardware Tx buffer.
    /------------------------------------------------------------------------------*/
    
    
    struct t_msg
    {
    	unsigned int id;    
    	unsigned int DLC;
    	unsigned int byte10;
    	unsigned int byte32;
    	unsigned int byte54;
    	unsigned int byte76;
    };
    
    
    
    
    
    
    
    
    /*=============================================================================
    /  
    / Function Prototypes:::
    /  
    /  Function and argument types are declared here for both local and external
    /  use. The structs for message boxes and nodes need to be defined before the
    /  prototypes can be given so that the prototypes can use the structs.
    /==============================================================================*/
    
    
    	void init_can(void);
    	void init_msgboxes(int);
    	void ManageTx(void);
    	void message_long(struct t_msg *);
    
    
    
    
    
    
    /*=============================================================================
    /  
    / Hardware definitions:::
    /  
    /  	Hardware control and signals are defined here. Refer to the TI TMS320F241
    /   manual for full descriptions of the functions of the hardware control and
    /	signal bits.
    /  
    /==============================================================================*/
    
    
    /*-----------------------------------------------------------------------------
    / Definitions for BusOff (BO) signal and AutoBusOn (ABO) control.
    /------------------------------------------------------------------------------*/
    
    
    #define BO					(1<<2)
    #define ABO					(1<<7)
    #define BusOff				(CANESR & BO)
    
    
    #define MaxTxErrorsPerTx 	50
    
    
    #define Waiting 			1
    #define TxSuccessful 		2  	
    #define TxFailed 			4
    
    
    
    
    /*-----------------------------------------------------------------------------
    / These macros clear the interrupt request hardware signals, use them to
    / clear the interrupt at the end of the ISR,
    /------------------------------------------------------------------------------*/
    
    
    #define	_ClearVRInterrupt()			CANRCR |=(1<<4)
    
    
    
    
    
    
    /*-----------------------------------------------------------------------------
    / These macros enable and disable the CAN module.
    /------------------------------------------------------------------------------*/
    
    
    #define _DisableCAN()				IMR &=~0x10
    #define _EnableCAN()                IMR |= 0x10
    
    
    
    
    
    
    
    
    /*-----------------------------------------------------------------------------
    /  E n d   O f   F i l e   P a t c h C a n . H
    /------------------------------------------------------------------------------*/
    Αρχείο: patchCan.c
    Κώδικας:
    /*=============================================================================
    /                        
    /============================================================================*/
    
    
    #include<stdlib.h> 
    #include<c241_c.h>
    #include<w_dog.h> 
    #include "patchcan.h"
    
    
    
    
                      
    /************************************************************************/
    /*                                                                      */
    /*  This routine initialzes the CAN Module for 1Mbit transfer rates		*/
    /*	message box 0 is used for reception of valve responce packets		*/
    /*	message box 5 is used for transmition of demands					*/
    /*																		*/
    /************************************************************************/
    
    
    void init_can(void)
    {
        /* set up CAN controler */
        OCRB |= 0xC0;   /* I/O pins */
        
        /* set up bit rates */
        CANMCR = 0x3400;				/* change configuration request */ 
        while((CANGSR &(1<<4)) == 0);   /* wait for request to be granted */
        
    	/* Set bit config as Tseg1 = 5 and Tseg2 = 2, sjw = 2 sync on falling edge only */
        CANBCR1 = 	(1<<10) | (2<<8) | (0<<7) | (5<<3) | (2<<0);	
    
    
    
    
        CANBCR2 = 0x1;					/* baud rate prescaler baud rate = 1M Bit 10 TQ */ 
        
        CANMCR &=~(1<<12);  			/* clear Change configuration Bit */  
        CANMCR |= ABO;					/* Enable AutoBusOn */
        while((CANGSR &(1<<4)) != 0);   /* wait for request to be granted */   
    }
    
    
    
    
    /*===========================================================================
    / init_msgboxesMaster
    /    Passed in: Nothing
    /    Returned: void
    /
    / Function:
    /	Sets up message boxes 0 and 2 to recieve stuff.
    / 
    /===========================================================================*/      
    
    
    void init_msgbox(void)
    {
        CANMDER = 0x00;	    	/* disable message boxs */
        CANMCR |= (1<<8);		/* set Change Data Field Request */    
       	CANMSGID0H = 0x5000;	/* set ID for MSGBOX0 as 10000000000b and enable mask*/
    	CANLAM0_H = 0x1FC;		/* set acceptance mask   1000xxxxxxxb */
    	CANMSGID2H = 0x4200; 	/* set ID for MSGBOX2 as 00010000000b and enable mask*/
    	CANLAM1_H = 0x1FC;		/* set acceptance mask   0001xxxxxxxb */
    	CANMCR &= ~(1<<8); 		/* clear Change Data Field Request */
        CANMCR |= ABO;					/* Enable AutoBusOn */
    	CANMDER = (1<<0) | (1<<5) | (1<<2) | (1<<6);	/* enable message box 5 for tx and 0 and 2 for rx */
    	CANIMR = (1<<8) | (1<<15) | (1<<10);   /* enable low priority rx interupt on all msgboxs */
    	CANRCR |= 0x0F;		/* don't notify if an RX message is lost */    											     
        IMR |= 0x10;            /* enable Interrupt 5  */
    }
    
    
    
    
    /*=============================================================================
    / message_long
    /    Passed in: pointer to message structure
    /    Returned: void
    /
    / Function:
    /	Transmits a long message over the can.
    /                        
    /============================================================================*/
    
    
    void message_long(struct t_msg *msg)
    {
    	if (!BusOff)
    	{
    		CANMDER &= ~(1<<5);				/* Disable message box 5*/ 
    		CANMCR |= (1<<8);			/* set Change Data Field Request */    	
    		
    		CANMSGID5H = (msg->id&0x7FF)<<2;	/*Mask in the 11 bit ID */
    		CANMSGCTRL5 = msg->DLC;
    		CANMBX5A = msg->byte10;
    		CANMBX5B = msg->byte32;
    		CANMBX5C = msg->byte54; 		
    		CANMBX5D = msg->byte76;       
    
    
    		ManageTx();	
    	}
    }   
    
    
    
    
    
    
    /*=============================================================================
    / ManageTx
    /    Passed in: void
    /    Returned: void
    /
    / Function:
    /	
    /                        
    /============================================================================*/
    
    
    void ManageTx(void)
    {
    int WaitingForTx;    
    
    
        CANMCR = (1<<10);		/* clear Change Data Field Request and set DBO */ 
        CANMCR |= ABO;			/* Enable AutoBusOn */
    
    
        CANMDER |= (1<<5);		/* enable message box 5 */
    
    
    	WaitingForTx = Waiting;
    
    
    	CANTCR = 0x80;			/* request trasmit	*/
    
    
    	while (WaitingForTx == Waiting)
    	{
    		if (CANTCR & 0x8000)
    			WaitingForTx = TxSuccessful;
    		if (CANESR & 0x003)
    			WaitingForTx = TxFailed;
    	}
    
    
    	if (WaitingForTx == TxSuccessful)
    	{
    		CANTCR = 0x8000;
    	}
    	else
    	{
    		CANTCR |= 1<<3;
    	}
    }
    
    
    /*===========================================================================*/
    /*===========================================================================*/
    /*                                                                           */
    /*   this ISR responds to a level 5 interrupt.                               */  
    /*   if the interrupt was caused by an rx in message box0, the flow data is  */
    /*   extracted and saved in NodeQ[];                                         */
    /*   SCI is also set up to use this interrupt which has to be handled        */
    /*   context saving is only done once					                     */
    /*                                                                           */
    /*===========================================================================*/
    /*===========================================================================*/
    
    
    interrupt void c_int_can(void)
    {
    int i,iRxID,iBuff,iFirstMatch;
    int itemp,itemp2;
      
    	IMR &= ~0x10;
    	asm(" clrc INTM ");        
    	
    	if(_ValveResponseReceived)      /* rx in mbox0 = valve responce */
    	{ 
    	
    		/* do CAN module work around */
    		CANMDER &= ~(1<<0);    /* disable message box 0 */
    		CANMCR |= (1<<8);      /* set CDR bit */
    		CANMSGID0H = 0x5000;   /* set ID for MSGBOX0 as 1000 0000000b and enable mask*/
    		CANMCR = (1<<10);      /* clear Change Data Field Request and set DBO */ 
    		CANMDER |= (1<<0);     /* enable msgbox0 */
    		
    		_ClearVRInterrupt();                    /* clear RMP bit (+ IF bit)*/  
    	}
    
    
    	IFR |= 0x10;
    	asm(" setc INTM ");     
    
    
    	IMR |= 0x10;
    }  
    
    
    
    
    /*=============================================================================
    /              E N D   O F   F I L E   P A T C H C A N . C                        
    /============================================================================*/

    0 Not allowed! Not allowed!

  7. #16
    Νέο Μέλος Το avatar του χρήστη Γιάννης EECC
    Όνομα
    Γιάννης
    Εγγραφή
    Jul 2012
    Περιοχή
    Θεσσαλονίκη
    Μηνύματα
    11

    Προεπιλογή

    Σου στέλνω κι ένα πιο προχωρημένο παράδειγμα δικό μου (για τους ίδιους επεξεργαστές) που μπορείς να τροποποιήσεις για το δικό σου uC.
    Υπόψιν ότι τα mailboxes ίσως και να μη σ' αφορούν αφού πολλοί controllers δε διαθέτουν παρά μόνο ένα mailbox για λήψη μηνυμάτων.
    Τον κώδικα του παραδείγματος τον έχω συγκεντρώσει σ' ένα αρχείο.
    Ελπίζω να βοήθησα.

    http://www.filesend.net/download.php...6187763de30928

    0 Not allowed! Not allowed!

  8. #17
    Μέλος Το avatar του χρήστη xmaze
    Όνομα
    Νίκος
    Εγγραφή
    May 2010
    Περιοχή
    Μακεδονία
    Μηνύματα
    1.034

    Προεπιλογή

    Ευχαριστω πολύ, θα το μελετήσω αυτές τις μέρες και μόλις έρθουν τα transceivers θα ξεκινήσω να το δουλέψω!!

    0 Not allowed! Not allowed!

  9. #18
    Μέλος Το avatar του χρήστη marioulinos
    Όνομα
    Μάριος
    Εγγραφή
    Jan 2010
    Περιοχή
    Ιωάννινα
    Μηνύματα
    135

    Προεπιλογή

    γινεται σε αυτοκινητο χωριε canbus αΠΟ Την μανα του να περαστει γραμμη και καλα canbus ωστε να δουλεψει ενα rcd310?
    ισχυει η θα μας τερλανει ο μαστορας?

    0 Not allowed! Not allowed!
    ΜΗΝ ΚΥΝΗΓΑΣ ΤΗΝ ΤΥΧΗ ΣΟΥ ΜΠΟΡΕΙ ΝΑ ΤΗΝ ΠΙΑΣΕΙΣ

Σελίδα 2 από 2 ΠρώτηΠρώτη 1 2

Παρόμοια Θέματα

  1. can bus IC παραγγελια.
    By katmadas in forum Εξαρτήματα & Datasheets
    Απαντήσεις: 13
    Τελευταίο Μήνυμα: 18-02-17, 20:39
  2. Can-Bus
    By Bobiras in forum Μικροελεγκτές
    Απαντήσεις: 17
    Τελευταίο Μήνυμα: 06-11-16, 09:56
  3. Bus interface
    By p_stama in forum Διάφορα Κυκλώματα
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 04-06-14, 12:45
  4. can bus programming
    By savoulis in forum Μικροελεγκτές
    Απαντήσεις: 2
    Τελευταίο Μήνυμα: 24-11-09, 18:53

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας