Использование DMA для чтения EEPROM на шине SPI (SSP)

Я использую процессор NXP LH79525, ARM7TDMI. Имеется EEPROM, подключенный по шине SPI к порту SSP.

Цель состоит в том, чтобы прочитать EEPROM в SRAM для более быстрого доступа.

Настоящий рабочий код отправляет команду чтения в EEPROM, считывает данные по байтам, что занимает много времени.

Я хочу использовать DMA для чтения EEPROM на шине SPI напрямую, без вмешательства ЦП.

Вот мой фрагмент кода:

// Initialize the DMA for use with SPI bus.
// Source is the EEPROM on the SPI bus.
// Destination is "buffer".

p_dma_stream_2->source_low = 0U;
p_dma_stream_2->source_high = 0U;
const uint32_t dest_addr = (uint32_t) buffer;

p_dma_stream_2->dest_low = (dest_addr & 0xFFFFU);
p_dma_stream_2->dest_high = (dest_addr >> 16U);

p_dma_stream_2->max_count = bytesToRead;

*p_dma_intr_mask = 0U;  // Disable all dma interrupts.
*p_dma_intr_clear = 0xFF;   // Clear the interrupts.

SSP->dmacr = 0x01;  // Enable reading with DMA

p_dma_stream_2->control = 0x06U; // + 0x01 to enable transfer.

// 0x400 - status of stream 2. 1 == stream is active.

uint32_t status = *p_dma_status;
while ((status & 0x400U) != 0U)
{
    OSTimeDelay(10U); // 10 milliseconds
    status = *p_dma_status;
}

Я считываю неправильные значения из EEPROM при использовании приведенного выше примера.
Регистры DMA считают правильно. SSP уже инициализирован перед этим фрагментом кода для чтения байтов.

Я ищу фрагмент примера рабочего кода, но не нашел его в Интернете.


person Thomas Matthews    schedule 20.03.2014    source источник
comment
Хотя это программная проблема, было бы полезно, если бы вы могли отслеживать данные, чтобы выяснить, предоставляет ли EEPROM достоверные данные, которые не собирает ваш процессор, или если массовая операция неверна, и EEPROM не дает вам правильных данных. . Вы можете рассмотреть что-то вроде логического анализатора (возможно, простую плату CYC68013A с sigrok или, если она не слишком быстрая, bus pirate), или вы можете просмотреть таблицу данных и перепроверить свои предположения, или, возможно, вы можете запрограммировать умный шаблон в EEPROM и просто посмотрите на чтение с помощью области.   -  person Chris Stratton    schedule 21.03.2014
comment
Я сравниваю данные, прочитанные с использованием прямого доступа SSP, с чтением данных через DMA. Вот откуда я знаю, что данные неверны.   -  person Thomas Matthews    schedule 21.03.2014
comment
Да, но вы не знаете, является ли проблема с более быстрой операцией чтения причиной того, что EEPROM выдает неверные данные, или проблема с настройкой периферийного устройства DMA или SPI приводит к тому, что механизм DMA не собирает и не сохраняет достоверные данные, которые EEPROM излучает. Еще одна вещь, которую вы можете сделать, это заменить EEPROM счетчиком и подключить MISO к различным выходным битам счетчика, что должно дать вам данные, которые изменяются через буфер по предсказуемой схеме, если DMA и SPI настройка правильная.   -  person Chris Stratton    schedule 21.03.2014
comment
Я предполагаю, что вы очищаете кеши ЦП, прежде чем проверять данные?   -  person mfro    schedule 21.03.2014


Ответы (1)


Согласно этому Руководству пользователя таблица 5-1 кажется, что SSPRX назначен к потоку 0 и поддерживает ширину исходных данных только в полслова (таблица 5-15).

Похоже, ваш код использует Stream 2 и адресацию байтов.

person user3443267    schedule 20.03.2014