Forum: Mikrocontroller und Digitale Elektronik stm32 sd-card und Nand flash


von axel (Gast)


Lesenswert?

Guten Tag,
Vielleicht kann mir einer Weiterhelfen bei meinem Problem.
Ich hane eine Funktionierende SD-Card Routine mit der ich BMP's ans 
Display anzeigen kann,Nun Wollte ich gerne BMP's die immer mal angezeigt 
werden sollen ins NAND Flash zu schreiben von der sd-Card.

könnte mir da einer weiterhelfen
Die Page grösse vom NAND ist 2048KB
mfg
1
//BMP READ TO DISPLAY
2
void read_pic(u16 point_x , u16 point_y ,char *name)
3
{
4
u8 rgb[2];
5
6
7
 res = f_open(&fsrc, name, FA_READ);    
8
 if ( res == FR_OK )
9
 { 
10
  f_read(&fsrc, (u8 *)&bmp, sizeof(bmp), &br);   
11
12
13
  if( (bmp.pic_head[0]=='B') && (bmp.pic_head[1]=='M') )  
14
   {
15
    res = f_lseek(&fsrc, ((bmp.pic_data_address_h<<16)|bmp.pic_data_address_l));
16
17
      ty=bmp.pic_h_l;
18
      while(ty) {
19
      
20
          ty--;
21
22
           f_read(&fsrc, &bmp_buffer, (bmp.pic_w_l)*3, &br);
23
            
24
       for(tx=0;tx<bmp.pic_w_l;tx++) 
25
             {
26
               point.x = ty;//ty;
27
               point.y = tx;//tx;
28
               point.r = *(tx*3 +2+bmp_buffer);
29
               point.g = *(tx*3 +1+bmp_buffer);
30
               point.b = *(tx*3 +0+bmp_buffer);                                 
31
              
32
//         Draw_Point(point.y + point_x  ,point.x + point_y  ,RGB888ToRGB565(point.r,point.g,point.b));  
33
       
34
           rgb[0] = point.r
35
           rgb[1] = point.g
36
           rgb[2] = point.b
37
           Write_pic();
38
             }
39
             
40
       if(ty==0) continue;
41
         }
42
43
44
       f_close(&fsrc);  
45
  
46
47
48
   }       
49
 }
50
}
51
52
//WRITE BMP TO NAND
53
void Write_pic()
54
{
55
    //NAND memory address to write to // 
56
    WriteReadAddr.Zone = 0x00;
57
    WriteReadAddr.Block = 0x00;
58
    WriteReadAddr.Page = 0x00; 
59
60
    //Erase the NAND first Block 
61
    NAND_status = FSMC_NAND_EraseBlock(WriteReadAddr);
62
  //Write data to FSMC NAND memory 
63
  NAND_status = FSMC_NAND_WriteSmallPage(rgb, WriteReadAddr, NAND_PageNumber);
64
}

von axel (Gast)


Lesenswert?

Da kann mir wohl niemand einen Tipp geben.
Mfg

von ♪Geist (Gast)


Lesenswert?

Du hast dein Anliegen geschildert, aber nicht dein Problem. Wie können 
wir dir beim Anliegen helfen?

von axel (Gast)


Lesenswert?

Mein Problem ist wie ich die Bild daten in den Nand schreibe.
Das Anzeigen der BMP auf Display Funktioniert , Einzelne Zeichen in den 
Nand schreiben und Lesen geht auch.

Zb. Wenn ich ein Bild hab mit 320x240pixel hab ich ja in einer  Zeile 
320x3=960Byte.
Die Page Grösse vom Nand ist 2048Byte.

Wie muss ich jetz in den Nand schreiben .
Ich habe 64pages zu je 2048byte.


Vielleicht kann mir einer weiterhelfen.

von ♪Geist (Gast)


Lesenswert?

Das hier:
1
u8 rgb[2];
2
...
3
rgb[0] = point.r
4
rgb[1] = point.g
5
rgb[2] = point.b

wird wohl nicht gehen! Du hast du zwei Bytes reserviert. Aber ehrlich 
gesagt, ist dein Problem immer noch nicht klar. Geht es dir darum, wie 
die Bytes im Speicher organisiert werden sollen oder wie? Dein NAND hat 
dementsprechend 2048*64 = 131072 Bytes
Bildinformation ist dabei 960Byte * 240 Zeilen = 230400 Bytes
Wird wohl nicht passen oder verstehe ich irgendwas falsch?

von axel (Gast)


Angehängte Dateien:

Lesenswert?

Die Bilder liegen auf der SD-Card als normale BMP Pics die man auch mitn 
PC anschauen kann also kein ARRAY.

Als NAND hab ich diesen hier K9F1G08U0B

Das BMP hat zb320x128 Pixel Wären dann 122800Byte sollte passen.

Vielleicht habe ich mich etwas falsch Ausgedrückt, ich wollte das gern 
somachen
das ich das Bild von der SD-Card erstmal nur Zeilenweise in de Puffer 
rgb lade und dann den puffer ins Nand schreibe.

Wie ich das nun ins Nand schreibe da liegt mein Problem





1
//BMP READ TO DISPLAY
2
void read_pic(u16 point_x , u16 point_y ,char *name)
3
{
4
u8 rgb[2048];
5
6
7
 res = f_open(&fsrc, name, FA_READ);    
8
 if ( res == FR_OK )
9
 { 
10
  f_read(&fsrc, (u8 *)&bmp, sizeof(bmp), &br);   
11
12
13
  if( (bmp.pic_head[0]=='B') && (bmp.pic_head[1]=='M') )  
14
   {
15
    res = f_lseek(&fsrc, ((bmp.pic_data_address_h<<16)|bmp.pic_data_address_l));
16
17
      ty=bmp.pic_h_l;
18
      while(ty) {
19
      
20
          ty--;
21
22
           f_read(&fsrc, &bmp_buffer, (bmp.pic_w_l)*3, &br);
23
            
24
       for(tx=0;tx<bmp.pic_w_l;tx++) 
25
             {
26
               point.x = ty;//ty;
27
               point.y = tx;//tx;
28
               point.r = *(tx*3 +2+bmp_buffer);
29
               point.g = *(tx*3 +1+bmp_buffer);
30
               point.b = *(tx*3 +0+bmp_buffer);                                 
31
              
32
//         Draw_Point(point.y + point_x  ,point.x + point_y  ,RGB888ToRGB565(point.r,point.g,point.b));  
33
       
34
           rgb[0] = point.r
35
           rgb[1] = point.g
36
           rgb[2] = point.b
37
           Write_pic();
38
             }
39
             
40
       if(ty==0) continue;
41
         }
42
43
44
       f_close(&fsrc);  
45
  
46
47
48
   }       
49
 }
50
}
51
52
53
//WRITE BMP TO NAND
54
void Write_pic()
55
{
56
    //NAND memory address to write to // 
57
    WriteReadAddr.Zone = 0x00;
58
    WriteReadAddr.Block = 0x00;
59
    WriteReadAddr.Page = 0x00;   //Page 0-64
60
61
    //Erase the NAND first Block 
62
    NAND_status = FSMC_NAND_EraseBlock(WriteReadAddr);
63
  //Write data to FSMC NAND memory 
64
  NAND_status = FSMC_NAND_WriteSmallPage(rgb, WriteReadAddr, NAND_PageNumber);
65
}

von axel (Gast)


Lesenswert?

Da kann mir scheinbar keiner weiterhelfen.

von axel (Gast)


Lesenswert?

Scheinbar gibs niemand der sich damit auskennt.

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.