Schreibfunktion funktioniert nicht

Gast #5728276
Lesenswert?
• ▲
▼
Hallo

Bei mir funktioniert leider die HAL Funktion nicht, deshalb bin ich 
dabei die Funktion liesDaten zu schreiben.

Ich habe sie soweit fertig und versuche damit die angekommenen Daten 
RDLR_ und RDHR_ Byteweise in Data[0-8] zu schreiben.
Aber irgendwie schreibt er mir nur die Data[0] und Data[4], welche 
zufällig so richtig sind.

Deshalb würde ich gerne wissen, was ich da nicht richtig mache.
Unten in der for versuche ich solange i kleiner 3 ist zu verunden und 
schiebe immer 8 bits nach links, um Data[0-3] zu erhalten.
Wenn msk = 0 ist stelle ich auf den Anfanswert zurück und beginne von 
neu, diesmal aber mit dem HB
1
ausführung im main (einmal)
2

3
main:
4
CAN_getData(&rxMessage.Data[0]);
5

6
can.c
7
CanTxMsgTypeDef txMessage;
8
CanRxMsgTypeDef rxMessage;
9

10
can.h
11
extern CanTxMsgTypeDef txMessage;
12
extern CanRxMsgTypeDef rxMessage;
13
void CAN_getData(uint8_t* msg);
14

15
im can.c
16
function:
17
void liesDaten(uint8_t* msg)  
18
{
19
  /* check if a message is filtered and received by FIFO 0 */
20
  if ((CAN->RF0R & CAN_RF0R_FMP0)!=0)
21
  {
22
   uint32_t LB = 0;
23
    uint32_t HB= 0;
24
    
25
    LB = CAN->sFIFOMailBox[0].RDLR;                     // read data low bits register
26
    HB= CAN->sFIFOMailBox[0].RDHR;                     // read data high bits register
27
    releaseFIFOx(FIFO_0);                                  // FIFO must be released   
28
  
29
    uint32_t msk = 0xFF;
30
    
31
    for(uint8_t i = 0; i<8; i++)
32
    {
33
      if(i<=3)
34
      {
35
        msg[i] = LB& msk;
36
        msk <<= 8;
37
      }else
38
       {
39
         msg[i] = HB & msk;
40
         msk <<= 8;
41
       }
42
       
43
       if(msk == 0)
44
       msk = 0xFF;
45
    }
46
  }
47
  
48
}

Ich wäre um Ratschläge sehr dankbar
Gast #5728321
Lesenswert?
• ▲
▼
Jim M. schrieb:
> Das mit den Bitschiebereien üben wir aber nochmal.
>
> Hint: Was passiert bei
> msg[i] = LB& msk;
>
> wenn msk = 0xFF00 ist (i==1)?

Ja

wenn LB zB 0x02020202 ist
i = 0;

start: i=0
msg[0] =
02020202 LB
000000FF msk
ergibt 02
msk = 0000FF00

i=1
msg[1] =
02020202 LB
0000FF00 msk
ergibt 02

ich sehe leider nicht wo das Problem ist
Gast #5728356
Lesenswert?
• ▲
▼
Nico W. schrieb:
> 0x0202 & 0xff00 == 0x0200


Autssch :(

ok, hier die Verbesserung:

1
void liesDaten(uint8_t* msg)  
2
{
3
  /* check if a message is filtered and received by FIFO 0 */
4
  if ((CAN->RF0R & CAN_RF0R_FMP0)!=0)
5
  {
6
   uint32_t LB = 0;
7
    uint32_t HB= 0;
8
    
9
    LB = CAN->sFIFOMailBox[0].RDLR;                     // read data low bits register
10
    HB= CAN->sFIFOMailBox[0].RDHR;                     // read data high bits register
11
    releaseFIFOx(FIFO_0);                                  // FIFO must be released   
12
  
13
    uint32_t msk = 0xFF;
14
    uint8_t x = 0;
15
    
16
    for(uint8_t i = 0; i<8; i++)
17
    {
18
      if(i<=3)
19
      {
20
        msg[i] = (LB& msk) >> x;
21
        msk <<= 8;
22
        x += 8;
23
      }else
24
       {
25
         msg[i] = (HB & msk) >> x;
26
         msk <<= 8;
27
         x += 8;
28
       }
29
       
30
       if(msk == 0)
31
{
32
       msk = 0xFF;
33
       x=0;
34
}
35
    }
36
  }
37
  
38
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.