Hilfe bei Programmierung des MCP2510 (CAN-Controller) gesuch

N

Nicolas Nickisch

Guest
Hi NG,

nach längerem Probieren habe ich mit dem MCP2510 noch arge Probleme.

Ich kann das Ding ansprechen, Register schreiben und lesen. ich gehe daher
mal davon aus, daß der externe Takt funktioniert und der Baustein auch
ansonsten geht.

Hier zunächst mal die Settings für die versch. Buszeiten:

//Settings für 125Kbit @ 16 MHz berechnet mit Bit-Time-Calculator von
www.intrepids.com
data[0]=(0<<6)| 1; // BRP=1, SJW=1xTq (CNF1)
data[1]=(1<<PRSEG0)|(7<<PHSEG10)|(1<<BTLMODE); //(CNF2) hex 0xb8
data[2]=5; // CNF3;

MCP2510_Write(CANCTRL, MODE_CONFIGURATION); // Baustein in Config-Mode
versetzen

// Konfiguration für 125Kbit/s @ 16MHz schreiben
MCP2510_Write_Mult(CNF1, &data[0], 3);

Ab hier ist die Konfiguration abgeschlossen ....

Später wird der Baustein momentan in den Loopback-Mode versetzt (test).

Ich poste mal den Sourcecode mit dem ich versuche eine message auf den
CAN-Bus loszulassen.

Über die Funktion uart_send_status wird über RS232 der Stand des TEC und der
Inhalt des EFLG-Registers verschickt.

Bis zu dem Punkt "nach Daten" sind TEC und EFLG jeweils 0 - ich denke das
ist gut so.

Nach dem Sendekommando liefert TEC 0xD8 und EFLG 00100011 (binär).

Etwas später enthält TEC den Wert 0x30 und EFLG 00100000.

Ich kann mir darauf keinen Reim machen.

Hat jemand eine Idee ?

Nicolas Nickisch





char CAN_SendMsg(struct Frame *Msg)
{
char CANMessage[10];
int i;
char status;

while(CHECKBIT((MCP2510_Read(TXB0CTRL)),TXREQ) )
{
// hoffentlich wird das nicht einfach wegoptimiert ...
} //warte darauf, daß evtl. Sendevorgänge in TXB0 abgesschlossen sind


// Ist das überhaut nötig ?
//MCP2510_Write(TXB0CTRL, ((0<<ABTF)& (0<<MLOA)& ((0<<TXERR)|(2<<TXP0))));
//Bits ABTF, MLOA & TXERR löschen

uart_send_status("CAN_SendMsg");

CANMessage[0]=(Msg->StdIdentifier>>3); //Identfier High-Byte
CANMessage[1]=(Msg->StdIdentifier & 0x07)<<5; // low-Bits


// Byte 2 & 3 wären für den extended identifier
if (Msg->extended==1)
{
CANMessage[2]=(Msg->ExtIdentifier>>24);
CANMessage[3]=(Msg->ExtIdentifier>>16);
}
else
{
CANMessage[2]=0;
CANMessage[3]=0;
}


CANMessage[4]=Msg->DLC;

for(i=0;i<Msg->DLC;i++)
{
CANMessage[i+5]=Msg->Data;
}

MCP2510_Write_Mult(TXB0SIDH,&CANMessage[0],Msg->DLC+3); // daten an MCP2510
senden
uart_send_status("nach Daten ");

MCP2510_RTS(MCP2510_RTSTXB0); // Buffer 0 senden
uart_send_status("nach Sendekommando ");

// Jetzt auf die erfolgreiche Sendung warten oder Fehlercode zurückgeben
....

while((MCP2510_Read(TXB0CTRL) & (1<<TXREQ))==0)
// 3 Bit nach rechts schieben und übrige Bits ausblenden -> warten bis
TX0REQ gelöscht ist
{

}
uart_send_status("nach while TXB0CTRL ");
return(status); // status zurückgeben
 

Welcome to EDABoard.com

Sponsor

Back
Top