AT90can128 - UART Interrupt + CAN

Gast #1677267
Lesenswert?

Ich habe einen AT90can128 und will ein rs232 signal auf can bus 
ausgeben...
Nun habe ich Peter Fleurys Uart library verwendet um die uart per 
interrupt einzulesen...
Nun habe ich folgendes Problem: Der Interrupt zerhackt die CAN Messages, 
immer dann wenn während dem CAN Senden gerade ein Zeichen eintrift...

So sieht die CAN Sende Funktion aus:
1
void send_std_can_msg(unsigned int std_id, unsigned char std_dlc, unsigned char * buffer)
2
{
3
  st_cmd_t msg;     // message descriptor store in code area
4

5
  msg.pt_data = &buffer[0];
6
  
7
  msg.status = 0;
8
  msg.handle = 0;
9
   
10

11
     msg.ctrl.ide = 0;   //-- CAN 2.0A
12
        msg.dlc = std_dlc;        //-- Max
13
        msg.id.std = std_id;
14
        msg.cmd = CMD_TX_DATA;
15

16
        while(can_cmd(&msg) != CAN_CMD_ACCEPTED);
17
    while(can_get_status(&msg) == CAN_STATUS_NOT_COMPLETED);
18
    
19
  
20
}

Muss ich das Schreiben der CAN-Register atomar machen? Wenn ich beim 
ganzen CAN Sende prozess die interrupts deaktiviere, dann verpass ich 
doch die eintreffenden Zeichen per UART...
Gast #2064031
Lesenswert?

Hi,
was würde denn passieren, wenn du den Status undefiniert hast. In der 
can_lib.c wird den Status vom (cmd->status==MOB_PENDING) abgefragt, ein 
undefinierter status wie z.B.:
1
 st_cmd_t msg;     // message descriptor store in code area
2
 msg.pt_data = &buffer[0]; 
3
// msg.status = 0;
4
 msg.handle = 0;
5
 msg.ctrl.ide = 0;   //-- CAN 2.0A
6
 msg.dlc = std_dlc;        //-- Max
7
 msg.id.std = std_id;
8
 msg.cmd = CMD_TX_DATA;

macht die Abfrage in der Luft, trotzdem habe ich ohne (msg.status = 0;) 
Daten auf dem CAN senden können. Erklärung?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren