Forum: Mikrocontroller und Digitale Elektronik Schreibfunktion funktioniert nicht


von Markus (Gast)


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

von Jim M. (turboj)


Lesenswert?

Das mit den Bitschiebereien üben wir aber nochmal.

Hint: Was passiert bei
1
msg[i] = LB& msk;

wenn msk = 0xFF00 ist (i==1)?

von Markus (Gast)


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

von Nico W. (nico_w)


Lesenswert?

0x0202 & 0xff00 == 0x0200

von Markus (Gast)


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
}

von Markus (Gast)


Lesenswert?

Und ja vielen Dank übrigens.
Hätte ich doch glatt vergessen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.