2016-03-24 6 views
0

Я использую следующую команду, чтобы передать данные из SPI Ядра на флэш-память или карту памяти SD и т.д.записи данных SPI/чтение

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

Я понимаю, что для того, чтобы сохранить \ чтения данных из памяти, мы должны дать адрес.

Но я не понимаю, как указать адрес в приведенной выше команде.

ответ

0

Этот github page показан пример функции с именем SpiAtmelFlashRead со следующим синтаксисом:

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

Код внутри функции считывания:

/*****************************************************************************/ 
/** 
* 
* 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; 
} 

Этот github page показан пример функции с именем SpiAtmelFlashWrite со следующим синтаксисом:

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

Код внутри функции записи является:

/*****************************************************************************/ 
/** 
* 
* 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

Как объясняется в примере Atmel Flash: XSpi_Transfer (SpiPtr, WriteBuffer, NULL, ByteCount + ATMEL_READ_WRITE_EXTRA_BYTES); я не понимаю, что (в приведенном выше примере функции XSpi_transfer), если WriteBuffer содержит адрес (как видно), тогда данные сохраняются в какой переменной. –

0

Фактический протокол для обмена данными с внешним устройством памяти будет указан в его техническом описании (т.е. то, как вы отправляете адрес и команды на чип, будет отличаться между производителями и линейками продуктов). Похоже, ваша функция просто инициирует передачу одного SPI. Скорее всего, вам придется вызвать функцию несколько раз, чтобы отправить определенную последовательность байтов/слов, которые в совокупности составляют команду, адрес и данные для записи. Опять же, все это зависит от спецификации. Было бы также полезно посмотреть, что именно происходит в XSpi_Transfer.

Также не забудьте убедиться, что бит SPI-полярности, фазы и данных правильно установлен в вашей программе настройки SPI.