Forum: Mikrocontroller und Digitale Elektronik DMA lesen und schreiben


von Lisa (Gast)


Lesenswert?

Hallo,

ich beschäftige mich mit dem folgenden Display:

http://www.buydisplay.com/default/tft-5-inch-lcd-display-module-w-controller-board-serial-i2c-ra8875

Es ist eine Funktion zum Lesen aus dem DMA gegeben, dieser sieht in etwa 
wie folgt aus:


1
///////////////The FLASH reading area   setting
2
void DMA_block_mode_size_setting(unsigned int BWR,unsigned int BHR,unsigned int SPWR)
3
{
4
    LCD_CmdWrite(BLOCK_WIDTH_DMA_TRANS);
5
    LCD_DataWrite(BWR);
6
    LCD_CmdWrite(BLOCK_WIDTH_1);
7
    LCD_DataWrite(BWR>>8);
8
9
    LCD_CmdWrite(BLOCK_HEIGHT_0);
10
    LCD_DataWrite(BHR);
11
    LCD_CmdWrite(BLOCK_HEIGHT_1);
12
    LCD_DataWrite(BHR>>8);
13
14
    LCD_CmdWrite(SOURCE_WIDTH_DMA_TRANS0);
15
    LCD_DataWrite(SPWR);
16
    LCD_CmdWrite(SOURCE_WIDTH_DMA_TRANS1);
17
    LCD_DataWrite(SPWR>>8);
18
}
19
20
21
/////////////FLASH read start position Settings
22
void DMA_Start_address_setting(unsigned long set_address)
23
{
24
    LCD_CmdWrite(START_ADD_0);
25
    LCD_DataWrite(set_address);
26
27
    LCD_CmdWrite(START_ADD_1);
28
    LCD_DataWrite(set_address>>8);
29
30
  LCD_CmdWrite(START_ADD_2);
31
    LCD_DataWrite(set_address>>16);
32
33
    LCD_CmdWrite(0xB3);
34
    LCD_DataWrite(set_address>>24);
35
}
36
37
///////////////check dma busy
38
void Chk_DMA_Busy(void)
39
{
40
41
  unsigned char temp;
42
  do
43
  {
44
45
  LCD_CmdWrite(0xBF);
46
47
  temp =LCD_DataRead();
48
  }while((temp&0x01)==0x01);
49
}
50
51
////////////Show the picture of the flash
52
void Displaypicture()
53
{
54
//   unsigned char picnumtemp;
55
   Write_Dir(FLASH_ROM_CLK,0X00);                   //FLASH frequency setting -> 0xb: SFCL frequency = System clock frequency
56
   Write_Dir(FLASH_ROM_CONFIG,0X87);                //FLASH setting -> 0b10000111 -> BIT 7: Serial Flash ROM 1 is selected BIT 1 - 0 = 11b = DUAL Mode 1; BIT 2 : DMA Mode
57
58
//   picnumtemp=picnum;
59
60
   Write_Dir(DMA_CONFIG,0X02);                              //FLASH setting; 0b00000010 = DMA Continuous or Block Read/Write Select Bit -> 1(Bit 1): Block
61
   Active_Window(0,479,0,271);
62
   MemoryWrite_Position(0,0);                               //Memory write position
63
//   DMA_Start_address_setting(261120*(picnumtemp-1));      //DMA Start address setting
64
   DMA_Start_address_setting(261120*(1-1));                 //DMA Start address setting
65
   DMA_block_mode_size_setting(480,272,480);
66
   Write_Dir(DMA_CONFIG,0X03);                              //FLASH setting; 0b00000011; 1: Block; BIT 0: WRITE: Set to 1 by MCU and reset to 0 automatically; READ: 0:Idle / 1:Busy
67
   Chk_DMA_Busy();
68
}

Natürlich muss ich dafür auch ersteinmal in den DMA schreiben. Noch ist 
mir nicht so ganz klar wie dies funktionieren soll. Gibt's da 
irgendwelche Anregungen / Ideen?

von Noch einer (Gast)


Lesenswert?

Du hast das Display mit normalem I2C am laufen?

Die Umstellung von Software-I2C auf DMA-I2C hat dann ja nichts mehr mit 
dem Dislay zu tun. Einen Controller auswählen, der DMA-I2C unterstützt 
und im Datenblatt/Appnote des Controllers schauen, wie man es benutzt.

von Lisa (Gast)


Lesenswert?

Noch einer schrieb:
> Du hast das Display mit normalem I2C am laufen?

Das Display läuft mit SPI.
Im Datenblatt steht eben nicht wie genau ich per DMA schreiben kann, 
sondern nur wie aus diesem lesen (siehe oben).

Ich müßte ja theoretisch auch beim schreiben die Start Adresse im 
Flash/Rom angeben, wieviel Bytes ich schreiben möchte etc.

Ich stelle es mir so vor:

1. Array im internen Flash ablegen
2. Vom Flash in DMA schreiben
3. Aus dem DMA lesen
4. Array kann aus internen Flash gelöscht werden

von Lisa (Gast)


Lesenswert?

Laut Datasheet sieht das Lesen aus dem DMA wie folgt aus:

1
1. Setting up the range of active windows(REG[30h] ~REG[37h]) and memory write
2
cursor position(REG[46h] ~REG[49h])
3
2. Setting up serial Flash/ROM configuration(REG[05h]).
4
3. Setting up DMA source starting address(REG[B0h] ~REG[B2h]).
5
4. Setting up DMA block width(REG[B4h] and REG[B5h]).
6
5. Setting up DMA block height(REG[B6h] and REG[B7h]).
7
6. Setting up DMA source picture width(REG[B8h] and REG[B9h]).
8
7. Enable DMA block mode by setting REG[BFh] bit 1.
9
8. Enable DMA start and check DMA busy signal by setting REG[BFh] bit 0.

Das habe ich bzw. ist im Beispiel - Code wie folgt realisiert:
1
Active_Window(0,479,0,271);                             // 1.
2
MemoryWrite_Position(0,0);                              // 1.
3
Write_Dir(FLASH_ROM_CONFIG,0X87);                       // 2. FLASH setting -> 0b10000111 -> BIT 7: Serial Flash ROM 1 is selected BIT 1 - 0 = 11b = DUAL Mode 1; BIT 2 : DMA Mode
4
DMA_Start_address_setting(261120*(3-0));                // 3. DMA Start address setting
5
DMA_block_mode_size_setting(480,272,480);               // 4., 5., 6.
6
Write_Dir(DMA_CONFIG,0X03);                             // 7.
7
Chk_DMA_Busy();                                         // 8.

So sollte ich aus dem DMA lesen können! Voraussetzung, dass im DMA auch 
etwas drin steht. Ich habe das Datenblatt jetzt zig mal durchforstet und 
ich habe immer noch keine Ahnung wie ich diesen beschreiben kann.

Einfach ein Beispiel, wie so etwas in der Regel abläuft oder ein 
Beispielcode (für einen anderen Controller oder irgendwas) würde mir 
schon sehr weiterhelfen.

Schönen Dank für jeglichen Input

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.