2016-03-24 13 views
0

ich den folgenden Befehl verwenden, um übergeben Daten vom SPI Core-Flash-Speicher oder SD-Karte usw.SPI Daten Schreib-/Lese

XSpi_Transfer(&Spi, SendData, ResData, 1); 

Ich verstehe, dass wir geben müssen, um \ Lesen von Daten auf Speicher zu sparen eine Adresse.

Aber was ich nicht verstehe ist, wie ich die Adresse im obigen Befehl angeben.

Antwort

0

Diese github page zeigt ein Beispiel Funktion SpiAtmelFlashRead mit folgenden Syntax benannt:

SPI_Status = SpiAtmelFlashRead(&spi, Address, ByteCount); 

Der Code innerhalb der Lesefunktion ist:

/*****************************************************************************/ 
/** 
* 
* This function reads data from the Atmel Flash device connected to the SPI 
* interface. 
* 
* @param SpiPtr is a pointer to the SPI driver component to use. 
* @param Addr is the address from which the data is to be read from 
*  the Flash. 
* @param ByteCount is the number of bytes to read. 
* 
* @return XST_SUCCESS if successful else XST_FAILURE. 
* 
* @note  None. 
* 
******************************************************************************/ 
int SpiAtmelFlashRead(XSpi *SpiPtr, u32 Address, u16 ByteCount) 
{ 
    u16 Index; 

    /* 
    * Setup the read command with the specified address and data for the 
    * Atmel Flash. 
    */ 
    WriteBuffer[ATMEL_COMMAND_OFFSET] = ATMEL_COMMAND_READ; 
    WriteBuffer[ATMEL_ADDRESS_BYTE1_OFFSET] = (u8) (Address >> 16); 
    WriteBuffer[ATMEL_ADDRESS_BYTE2_OFFSET] = (u8) (Address >> 8); 
    WriteBuffer[ATMEL_ADDRESS_BYTE3_OFFSET] = (u8) Address; 

    /* 
    * Prepare the write buffer. Fill in some dummy data. 
    */ 
    for(Index = 4; Index < (ByteCount + ATMEL_READ_WRITE_EXTRA_BYTES); 
       Index++) { 
     WriteBuffer[Index] = ATMEL_DUMMYBYTE; 
    } 

    /* 
    * Prepare the Read Buffer. Fill in some initialization data into the 
    * the buffer. 
    */ 
    for(Index = 0; Index < (ByteCount + 
       ATMEL_READ_WRITE_EXTRA_BYTES); Index++) { 
     ReadBuffer[Index] = ATMEL_INITBYTE; 
    } 

    /* 
    * Send the read command to the Atmel Flash to read the specified number 
    * of bytes. 
    */ 
    TransferInProgress = TRUE; 
    XSpi_Transfer(SpiPtr, WriteBuffer, ReadBuffer, 
       ByteCount + ATMEL_READ_WRITE_EXTRA_BYTES); 

    /* 
    * Wait till the Transfer is complete and check if there are any errors 
    * in the transaction. 
    */ 
    while (TransferInProgress); 
    if(ErrorCount != 0) { 
     ErrorCount = 0; 
     return XST_FAILURE; 
    } 

    return XST_SUCCESS; 
} 

Diese github page ein Beispiel Funktion SpiAtmelFlashWrite namens zeigt mit der folgenden Syntax:

SPI_Status = SpiAtmelFlashWrite(&spi, Address, chunk, ByteCount); 

der Code innerhalb der Schreibfunktion ist:

/*****************************************************************************/ 
/** 
* 
* This function writes to the Atmel Flash device connected to the SPI interface. 
* 
* @param SpiPtr is a pointer to the SPI driver component to use. 
* @param Address is the address to which the data is written. 
* @param ByteCount contains the number of bytes to write. 
* 
* @return XST_SUCCESS if successful else XST_FAILURE. 
* 
* @note  None. 
* 
******************************************************************************/ 
int SpiAtmelFlashWrite(XSpi *SpiPtr, u32 Address, u16 ByteCount) 
{ 
    u16 Index; 

    /* 
    * Setup the write command with the specified address, and data to be 
    * written to the flash. 
    */ 
    WriteBuffer[ATMEL_COMMAND_OFFSET]  = ATMEL_COMMAND_WRITE; 
    WriteBuffer[ATMEL_ADDRESS_BYTE1_OFFSET] = (u8) (Address >> 16); 
    WriteBuffer[ATMEL_ADDRESS_BYTE2_OFFSET] = (u8) (Address >> 8); 
    WriteBuffer[ATMEL_ADDRESS_BYTE3_OFFSET] = (u8) (Address); 

    /* 
    * Prepare the write buffer. Fill in the data that is to be written into 
    * the Flash. 
    */ 
    for(Index = 4; Index < (ByteCount + ATMEL_READ_WRITE_EXTRA_BYTES); 
      Index++) { 
     WriteBuffer[Index] = (u8)(ATMEL_TEST_BYTE + Index); 
    } 

    /* 
    * Send the write command, address, and data to the Flash. 
    * No receive buffer is specified since there is nothing to receive. 
    */ 
    TransferInProgress = TRUE; 
    XSpi_Transfer(SpiPtr, WriteBuffer, NULL, 
      ByteCount + ATMEL_READ_WRITE_EXTRA_BYTES) 
          ; 

    /* 
    * Wait till the Transfer is complete and check if there are any errors 
    * in the transaction. 
    */ 
    while (TransferInProgress); 
    if(ErrorCount != 0) { 
     ErrorCount = 0; 
     return XST_FAILURE; 
    } 

    return XST_SUCCESS; 
} 
+0

Wie in Atmel Flash Beispiel erläutert: XSpi_Transfer (SpiPtr, WriteBuffer, Null, ByteCount + ATMEL_READ_WRITE_EXTRA_BYTES); Was ich nicht verstehe ist, dass (im obigen XSpi_transfer-Funktionsbeispiel), wenn der WriteBuffer die Adresse enthält (wie ersichtlich), dann werden die Daten in welcher Variable gespeichert. –

0

Das tatsächliche Protokoll für mit dem externen Speichergerät kommuniziert in ihrem Datenblatt angegeben wird (d.h. Die Art und Weise, wie Sie eine Adresse und Befehle an den Chip senden, ist zwischen Herstellern und Produktlinien unterschiedlich. Es sieht so aus, als ob Ihre Funktion einfach eine einzelne SPI-Übertragung initiiert. Wahrscheinlich müssen Sie die Funktion mehrmals aufrufen, um eine bestimmte Sequenz von Bytes/Wörtern zu senden, die zusammen einen Schreibbefehl, eine Adresse und Daten bilden. Dies hängt wiederum vom Datenblatt ab. Es wäre auch hilfreich zu sehen, was gerade passiert in XSpi_Transfer.

Denken Sie auch daran, die SPI-Polarität, Phase und Datenbits in Ihrer SPI-Konfigurationsroutine richtig einzustellen.

Verwandte Themen