PDA

Επιστροφή στο Forum : Ερώτηση CAN Bus



xmaze
22-11-12, 19:28
Γεία σας!

Εχω καιρό τώρα την απορία πώς ακριβώς λειτουργεί και τί μηνύματα στέλνονται με το πρωτόκωλο CAN. Έχει κανείς καμια ιδέα να μας εξηγήσει τί ακριβώς είναι ;

Πχ αν θέλω να διαβάσω τις στροφές του αμαξιού τί θα μπορούσα να κάνω;

johnnyb
22-11-12, 23:56
http://en.wikipedia.org/wiki/CAN_bus

http://canbuskit.com/what.php

http://www.interfacebus.com/CAN-Bus-Description-Vendors-Canbus-Protocol.html

http://documentation.renesas.com/doc/products/mpumcu/apn/rej05b0804_m16cap.pdf

(http://documentation.renesas.com/doc/products/mpumcu/apn/rej05b0804_m16cap.pdf)

xmaze
23-11-12, 02:26
Ωραίος φίλε μου, αλλά ψάχνω κατι ποιο τεχνικό με υλοποίηση, π.χ. με δυο μΕ που να στελνει ο ένας στον άλλον ενα μήνυμα τύπου "Hello World", δηλαδή κάτι πολύ απλό!!

johnnyb
23-11-12, 03:18
Εχει εφαρμογες στη microchip ( τοσο απλα δεν ξερω αν υπαρχουν )

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1480&redirects=can (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1480&redirects=can)

http://www.microchip.com/wwwcategory/TaxonomySearch.aspx?show=Application%20Notes&ShowField=no

(http://www.microchip.com/wwwcategory/TaxonomySearch.aspx?show=Application%20Notes&ShowField=no)Βrowze aplication notes -> select a function - >can




(http://www.microchip.com/wwwcategory/TaxonomySearch.aspx?show=Application%20Notes&ShowField=no)

xmaze
23-11-12, 14:27
Γενικά γνωρίζεις; Η πιο απλή μου ερώτηση είναι; Στέλνει μηνύματα κειμένου και αριθμών με το πρωτόκολλο ή στέλνει μόνο κωδικοποιημένα μηνύματα;

picdev
24-11-12, 09:15
Γενικά γνωρίζεις; Η πιο απλή μου ερώτηση είναι; Στέλνει μηνύματα κειμένου και αριθμών με το πρωτόκολλο ή στέλνει μόνο κωδικοποιημένα μηνύματα;
γενικά στα ψηφιακά στέλνεις bit-byte, τώρα το αν στέλνεις ascii η νούμερο είναι δικό σου θέμα

xmaze
24-11-12, 14:29
Θα ήθελα να κάνω μια διευκρυνηση, το "Γενικά γνωρίζεις;" ήταν λίγο μή σωστό, τώρα που το βλέπω μπορεί κάποιος να το εκλαμβανε ώς ειρωνικό, αλλά δέν ήταν! Σορρυ.
Επι του θέματος, ξέρω δηλαδή οτι στέλνεις 01010 πχ που είναι ένα μπαιτ με 8 ή περισσότερα μπίτ. Στο CAN Bus στέλνεις Ascii μηνύματα ή μόνο κωδικούς με κρυπτογραφημένες πληροφοριες;
Και άν στέλνεις Ascii πχ υπάρχει κάποιο παράδειγμα σε 010101 με ένα απλό μήνυμα;

picdev
24-11-12, 14:37
Το ένα byte έχει πάντα 8bit, το can bus δεν στέλνει τίποτα, εσύ στέλνεις, το πως θα κωδικοποιήσεις τα δεδομένα σου και πως τα αναπαριστάς είναι κάτι που έχει να κάνει με το πρόγραμμα του mE.
Εσύ μπορείς να στέλνεις 4 byte που είναι 4 ξεχωριστοί αριθμοί μέγεθους short , μπορείς να στέλνεις 4 byte που να είναι ένας int ριθμός. Γενικά όπως σου είπα στέλνεις byte σε όλα τα πρωτόκολλα

xmaze
25-11-12, 16:08
Επανέρχομαι γιατί με εστειλε η Avr sample τον mega64c1 που υποστηρίζει CAN bus και ψάχνω βιβλιοθήκες, αλλά βρίσκω μόνο για τον AT90CAN και ρωτάω μήπως ξέρει κανείς που μπορώ να βρώ καμια βιβλιοθήκη!!

tmav
25-11-12, 18:57
Μερικές πληροφορίες για το 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 έχουν την δυνατότητα να ακούν μία ή περισσότερες διευθύνσεις, οπότε
διαβάζουν μόνο τα μηνύματα που τους ενδιαφέρουν.

Όλα τα παραπάνω το καθιστούν ένα άπό τα ποιο ασφαλή δίκυα και για αυτό το λόγο χρησιμοποιείται
ευρέως σε αυτοκίνητα και βιομηχανία.

Γιάννης EECC
30-11-12, 11:46
Μερικές πληροφορίες για το 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 για να στηθεί μια υποτυπώδης επικοινωνία μεταξύ δύο κόμβων.

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

tmav
30-11-12, 13:01
Ο Mega64C1 και το Μcp2551 interface chip δημιουργούν ένα κόμβο. Θα χρειαστείς ακόμη ένα ζευγάρι ICs για δεύτερο κόμβο!

xmaze
30-11-12, 13:19
Ναι, έχω 2 μΕ. Αναμενω τους κώδικες σου με ανυπομονησία!! ευχαριστώ

Γιάννης EECC
01-12-12, 18:50
Λοιπόν Νίκο, το παρακάτω μου το έχει δώσει εδώ και πολλά χρόνια ένας συνάδελφος ονόματι 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
/================================================== ==========================*/

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

http://www.filesend.net/download.php?f=4789796abd28ebab816187763de30928

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

marioulinos
10-12-12, 13:49
γινεται σε αυτοκινητο χωριε canbus αΠΟ Την μανα του να περαστει γραμμη και καλα canbus ωστε να δουλεψει ενα rcd310?
ισχυει η θα μας τερλανει ο μαστορας?