首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPI数据写入/读取

SPI数据写入/读取
EN

Stack Overflow用户
提问于 2016-03-25 01:50:57
回答 2查看 1.2K关注 0票数 0

我使用下面的命令将数据从SPI Core传递到闪存或SD卡等。

代码语言:javascript
复制
XSpi_Transfer(&Spi, SendData, ResData, 1);

我知道为了在内存中保存\读取数据,我们需要给出一个地址。

但我不明白的是如何在上面的命令中指定地址。

EN

回答 2

Stack Overflow用户

发布于 2016-03-25 03:18:03

github page显示了一个名为SpiAtmelFlashRead的示例函数,语法如下:

代码语言:javascript
复制
SPI_Status = SpiAtmelFlashRead(&spi, Address, ByteCount);

read函数内部的代码是:

代码语言:javascript
复制
/*****************************************************************************/
/**
*
* 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的示例函数,语法如下:

代码语言:javascript
复制
SPI_Status = SpiAtmelFlashWrite(&spi, Address, chunk, ByteCount);

write函数内部的代码是:

代码语言:javascript
复制
/*****************************************************************************/
/**
*
* 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
EN

Stack Overflow用户

发布于 2016-04-22 01:43:53

与外部存储设备通信的实际协议将在其数据手册中指定(即,向芯片发送地址和命令的方式因制造商和产品线而异)。看起来您的函数只是简单地启动了一个SPI传输。您很可能需要多次调用该函数来发送特定的字节/字序列,这些字节/字序列共同构成了写命令、地址和数据。同样,这一切都取决于数据表。了解一下XSpi_Transfer中到底发生了什么也会很有帮助。

还要记住,要确保在SPI配置例程中正确设置SPI极性、相位和数据位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36206794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档