Schreibfunktion funktioniert nicht

Gast #5728276
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
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.