Post Go back to editing

ADRV9009-ZCU106 no-OS (headless_arm.c) – TALISE_verifySpiReadWrite() fails at scratchpad write

Thread Summary

The user encountered an issue with the ADRV9009 FMC board on the ZCU106 using the no-OS project, where SPI writes to low addresses fail, specifically in the scratchpad write/read check. The vendor ID reads work correctly, but the scratchpad read-back is always 0x49. The final answer suggests verifying the CS and RESET lines, and checking the SPI mode or speed. The user has confirmed that the HDL constraints and JESD lanes are correct, and the issue seems to be related to the SPI write process or device state.
AI Generated Content
Category: Software
Product Number: ADRV9009
Software Version: no-OS repo 2023.2

Hi,

I am bringing up the ADRV9009 FMC board on the ZCU106 using the standard no-OS project from the Analog Devices GitHub (Vitis, 2023.2). I am using the headless_arm.c application file without any custom modifications.

When I run the code, I consistently hit an error during initialization. The Debug UART output looks like this:

Zynq MP First Stage Boot Loader <LF><CR>Release 2023.2 Sep 29 2025 - 17:14:23 PMU-FW is not running, certain applications may not be supported.<LF><CR> Started...
Hello
rx_clkgen: MMCM-PLL locked (122880000 Hz)
tx_clkgen: MMCM-PLL locked (61440000 Hz)
rx_os_clkgen: MMCM-PLL locked (61440000 Hz)
rx_adxcvr: OK (4915200 kHz)
tx_adxcvr: OK (2457600 kHz)
rx_os_adxcvr: OK (2457600 kHz)
ERROR: 347: TALISE_verifySpiReadWrite(): Cannot write to a low SPI address
error: TALISE_initialize() failed
Bye

I placed breakpoints and found that the failure happens inside TALISE_verifySpiReadWrite(), specifically at the scratchpad write/read check:

spiReg = 0;
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_SCRATCH_PAD, 0xB6);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal,
TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);

halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_SCRATCH_PAD, &spiReg);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal,
TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
if (spiReg != 0xB6) {
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_VERIFYSPI_WRITE_LOW_ADDR_ERROR, retVal, TALACT_ERR_RESET_FULL);
}

Interestingly, the earlier vendor ID reads (0x56 and 0x04) inside TALISE_verifySpiReadWrite() succeed without problems. So SPI is working for reads, but the scratchpad write fails every time.

I am using the default headless_arm example (no custom SPI/GPIO platform code). Could you advise what might cause writes to low SPI addresses to fail in this setup?
Is there an additional reset sequence, GPIO configuration, or unlock step required before the scratchpad test - anything that is not already provided in the ADI reference code?

Thanks in advance!

Thread Notes