Перейти к содержанию
    

ADSP-CM409F проблемы c SPI

Здравствуйте.

Имеется кастомная плата с процессором ADSP-CM409F (Analog Devices). Задействовано два SPI интерфейса, и любые попытки транзакций чтения/записи не происходят (блокируются). Далее детали.

 

Используется два SPI интерфейса (SPI_0, SPI_1), оба подсоединены к Porct_C (к специальным пинам, которые могут быть промультиплексированы на SPI интерфейс):

image.png.2f688f21976549c7b4fa416567c9ff34.png

Мультиплексирование сделано используя PinMux тул (часть "ADSP-CM40x Enablement Package"):

image.thumb.png.3f9d938b29d58f29c0e168fcacc2e9a0.png

 

Код для тестирования SPI базируется на примере “SPI_flash_read” (также входящий в "ADSP-CM40x Enablement Package"), который использует выделенный SPI_2 интерфейс для чтения встроенной Flash памяти, и этот пример работает. Далее упрощённая версия кода (который не работает) для инициализации и чтения одного байта по SPI_1:

#include <stdio.h> 
#include <drivers/spi/adi_spi.h>

// SPI variables
uint8_t rx_buf[4] =  {0};
// SPI_1 transceiver setup for 1 byte RX operation (without prologue)
ADI_SPI_TRANSCEIVER xcvr  = { NULL, 0, NULL, 0, &rx_buf[0], 1 };
static ADI_SPI_HANDLE hSPI;
static uint8_t SpiMemory[ADI_SPI_INT_MEMORY_SIZE];


ADI_SPI_RESULT tst_spi1() {
/*******************************************************************************
 * SPI Init: Master, Non-DMA mode, Software SlaveSelect
 ******************************************************************************/
  ADI_SPI_RESULT res;
  res  = adi_spi_Open(1, &SpiMemory, ADI_SPI_INT_MEMORY_SIZE, &hSPI);
  res += adi_spi_SetMaster(hSPI, true); //set as master
  res += adi_spi_SetHwSlaveSelect(hSPI, false); // Software (not Hardware) Slave Select
  res += adi_spi_SetWordSize(hSPI, ADI_SPI_TRANSFER_8BIT); // 8-bits word size
  res += adi_spi_SetClock(hSPI, 39); // 2 MHz (for SYSKCLK = 80MHz)
  res += adi_spi_SetClockPolarity(hSPI, true); // Active HIHG clock
  res += adi_spi_SetClockPhase(hSPI, true); // Data transitions on the RISING edge of the clock
  res += adi_spi_RegisterCallback(hSPI, NULL, NULL); // none
  res += adi_spi_EnableDmaMode(hSPI, false); // Interrupt driven mode

/*******************************************************************************
 * SPI transfer to read 1 byte in either Blocking/Non-Blocking mode
 ******************************************************************************/
#define SPI_RW_BLOCKING
#ifdef SPI_RW_BLOCKING
  // Blocking Transfer
  res = adi_spi_ReadWrite(hSPI, &xcvr);
#else
  // Non-Blocking Transfer
  bool bAvailable = false;
    // Submit RX buffer to receive 1 char
  res = adi_spi_SubmitBuffer(hSPI, &xcvr);
  do {
    // Non-blocking check for rx_buf availability
    res = adi_spi_IsBufferAvailable(hSPI, &bAvailable);
    if (ADI_SPI_SUCCESS != res) {
      break; // exit the loop
    }
  } while (!bAvailable);
#endif // SPI_RW_BLOCKING

  return res;
}

 

Код состоит из двух частей:
  1. Инициализация (Master, Non-DMA mode, Software Slave-Select).
  2. Транзакция чтения 1 байта в блокирующем/неблокирующем режиме.

Проблема возникает во 2-ой части при попытке транзакции данных. Любая транзакция (чтения/записи в блокирующем или неблокирующем режиме) никогда не заканчивается, а зависает в бесконечном цикле ожидания. В блокирующем режиме код зависает на строке adi_spi_ReadWrite(hSPI, &xcvr):

image.thumb.png.f853e291d4f3ef40691f197481e42829.png

Внутри функции adi_spi_ReadWrite() видно, что код зависает на функции adi_osal_SemPend():

image.thumb.png.b2f03672140e670f9447716a0df8fa35.png

При входе в функцию adi_osal_SemPend(): видно что код просто крутится в бесконечном цикле while, в котором вроде что-то связанное с прерываниями (функции _adi_osal_InterruptsDisable()/_adi_osal_InterruptsEnable()):

image.thumb.png.1cfe51985f50a5d4e9299ffbebd189d1.png

Такая же проблема возникает в неблокирующем режиме. В этом случае после передачи буфера (функция adi_spi_SubmitBuffer(hSPI, &xcvr) ), код зависает на функции adi_spi_IsBufferAvailable(), т.е. буфер данных никогда не становится доступным.

Что конкретно не так непонятно. Пробовал разные настройки инициализации – не помогает. Пробовал разные комбинации чтения/записи данных разных размеров – ничего. Проблема идентична для обоих SPI интерфейсов (SPI_0 и SPI_1).

Может кто знает, в чем может быть проблема и как это решить?

 

 

ADSP-CM409F SPI debug.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...