Post Go back to editing

flash,spi

Category: Software
Product Number: ADSP-21569
Software Version: cces12.1

/*********************************************************************************
Copyright(c) 2020 Analog Devices, Inc. All Rights Reserved.
This software is proprietary and confidential. By using this software you agree
to the terms of the associated Analog Devices License Agreement.
*********************************************************************************/

/*****************************************************************************
 * SPI_MemoryMappedMode.c
 *****************************************************************************/

#include <stdio.h>
#include <sys/platform.h>
#include <drivers/spi/adi_spi.h>
#include "adi_initialize.h"
#include "SPI_MemoryMappedMode.h"

ADI_SPI_HANDLE hSpi;
uint8_t SpiMemory[ADI_SPI_BIDIR_MEMORY_SIZE];

uint8_t ReadBuffer[BUFFER_SIZE]={0};

/* prototype */
void ConfigSoftSwitches_EV_21569_SOM(void);
void ConfigSoftSwitches_EV_SOMCRR_EZKIT(void);

static void CheckResult(ADI_SPI_RESULT Result) {
    if (Result != ADI_SPI_SUCCESS) {
        printf("Failed with error code 0x%08X\n", Result);
    }
}

int main()
{
    uint32_t Result,gpioMaxCallbacks;
    ADI_SPI_RESULT eResult;
    ADI_SPI_MMRDH_PARAM Mmrdh;
    uint32_t *pSPI_MEM ;


    adi_initComponents();

    ConfigSoftSwitches_EV_21569_SOM();
    ConfigSoftSwitches_EV_SOMCRR_EZKIT();

    /* open SPI */
    eResult = adi_spi_Open(SPI_DEVICE_NUM, ADI_SPI_DIR_BIDIRECTION, SpiMemory, ADI_SPI_BIDIR_MEMORY_SIZE, &hSpi);
    CheckResult(eResult);

    /* Set the MMRDH parameters
     * struct ADI_SPI_MMRDH_PARAM available in adi_spi_2156x.h has detailed description of
     * the below mentioned fields */
    Mmrdh.bCmdSkip = false;
    Mmrdh.bCmdPins = false;
    Mmrdh.bAddrPin = false;
    Mmrdh.bMergeEnable = false;
    Mmrdh.bWrapEnable = false;

    Mmrdh.nOpcode = CMD_SINGLE_MODE_READ;
    Mmrdh.nModeField = 0x00u;
    // Mmrdh.nAddrSize = ADI_SPI_MMRDH_ADRSIZE_3BYTE;
    Mmrdh.nAddrSize = ADI_SPI_MMRDH_ADRSIZE_4BYTE;
    Mmrdh.nDummybytes = ADI_SPI_MMRDH_0_DUMMY_BYTE;
    Mmrdh.nTristateTiming = ADI_SPI_MMRDH_NEVER_TRISTATE;

    eResult = adi_spi_SetSlaveSelectDelay(hSpi,true,true,3ul);
    CheckResult(eResult);

    eResult = adi_spi_SetWordSize(hSpi,ADI_SPI_WORDSIZE_32BIT);
    CheckResult(eResult);

    eResult = adi_spi_SetHWSlaveSelect(hSpi,true);
    CheckResult(eResult);

    eResult = adi_spi_SetSlaveSelect(hSpi,ADI_SPI_SSEL_ENABLE1);
    CheckResult(eResult);

    eResult = adi_spi_Enable_MemMappedMode(hSpi,Mmrdh,NULL);
    CheckResult(eResult);

    /* Read the contents of the SPI Flash memory which should be verified with
     * the data written into by the flash programmer */
    uint32_t sectorAddress = SECTOR_OFFSET;

    pSPI_MEM = (uint32_t *)0x60000000;
    int32_t pIntBuffer[COUNT];
    int32_t *tmp;
    uint32_t currentAddress;
    for(uint32_t i=0; i<COUNT; i++)
    {
        // ReadBuffer[LoopVar]= *pSPI_MEM++;
    	//currentAddress = (uint32_t)(pSPI_MEM + sectorAddress + (i * sizeof(int32_t)));
    	currentAddress = (uint32_t)(pSPI_MEM + SECTOR_OFFSET + i );
    	// printf("Reading from address: 0x%08X\n", currentAddress);
    	 pIntBuffer[i] = *(int32_t *)currentAddress;
    }
    printf("Reading from address: 0x%08X\n", currentAddress);

    eResult = adi_spi_Disable_MemMappedMode(hSpi);
    CheckResult(eResult);

    /* Close the SPI driver */
    eResult = adi_spi_Close(hSpi);
    CheckResult(eResult);

/*************************************************************************************************************/
    /* open SPI */
    eResult = adi_spi_Open(SPI_DEVICE_NUM, ADI_SPI_DIR_BIDIRECTION, SpiMemory, ADI_SPI_BIDIR_MEMORY_SIZE, &hSpi);
    CheckResult(eResult);

    eResult = adi_spi_SetSlaveSelect(hSpi, SPI_SELECT_NUM);
    CheckResult(eResult);

    eResult = adi_spi_SetWordSize(hSpi, ADI_SPI_WORDSIZE_32BIT);
    CheckResult(eResult);


    /* Read the contents of the SPI Flash memory */
    int32_t intBuffer[COUNT];
    int32_t pReadData[COUNT];
    ADI_SPI_TRANSCEIVER_PARAM transceiver;
    sectorAddress = SECTOR_OFFSET;
    /* Read the contents of the SPI Flash memory */
    for (uint32_t i = 0; i < COUNT; i++) {
    	//currentAddress = (uint32_t)(pSPI_MEM + SECTOR_OFFSET + i );
    	currentAddress = (uint32_t)( pSPI_MEM+SECTOR_OFFSET + i);
        // Setup the transceiver for read operation
    	uint8_t command[4] = {0x03, (currentAddress >> 16) & 0xFF, (currentAddress >> 8) & 0xFF, (currentAddress >> 0) & 0xFF};
    	// uint8_t command[5] = {0x13,(currentAddress >> 24) & 0xFF, (currentAddress >> 16) & 0xFF, (currentAddress >> 8) & 0xFF, currentAddress & 0xFF}; // 0x0B is the opcode for 32-bit address read
    	transceiver.pTransmitter = command; //
        transceiver.pReceiver = & intBuffer[i];
        transceiver.TxBytes = sizeof(command);
        transceiver.RxBytes = sizeof(command); // Size of data to read

        eResult = adi_spi_CoreTransceiver(hSpi, &transceiver);
        CheckResult(eResult);
		
        /* Read the contents of the SPI Flash memory */

        uint8_t seqReadWrite[4];
        seqReadWrite[0]         = 0x03;
        seqReadWrite[1]         = (currentAddress >> 16) & 0xFF;
        seqReadWrite[2]         = (currentAddress >> 8) & 0xFF;
        seqReadWrite[3]         = (currentAddress >> 0) & 0xFF;
        eResult = adi_spi_CoreWrite(hSpi,seqReadWrite,4);

        eResult = adi_spi_CoreRead(hSpi,&pReadData,COUNT,ADI_OSAL_TIMEOUT_FOREVER);

        uint8_t seqReadWrite2[5];
        seqReadWrite2[0]         = 0x13;
        seqReadWrite2[1]         = (currentAddress >> 24) & 0xFF;
        seqReadWrite2[2]         = (currentAddress >> 16) & 0xFF;
        seqReadWrite2[3]         = (currentAddress >> 8) & 0xFF;
        seqReadWrite2[4]         = (currentAddress >> 0) & 0xFF;
        eResult = adi_spi_CoreWrite(hSpi,seqReadWrite2,5);

        eResult = adi_spi_CoreRead(hSpi,&pReadData,COUNT,ADI_OSAL_TIMEOUT_FOREVER);

    }
    printf("Reading from address: 0x%08X\n", currentAddress);

    /* Close the SPI driver */
    eResult = adi_spi_Close(hSpi);
    CheckResult(eResult);
/*************************************************************************************************************/
    return 0;

}

I am using an adsp-21569 development board with an IS25LP512M on the SOM. I plan to read data through the SPI interface, starting from the address 0x60000000. The reference routine reads data using the memory-map method without any issues. However, I have not been successful using either adi_spi_CoreRead or adi_spi_CoreTransceiver. Could you please help me troubleshoot the problem?