Нужно ли мне повторно инициализировать интерфейс i2s на stm32h743, но не на stm32f303?

Следующий код воспроизводит звуки с более чем 65535 семплами, выводимыми через i2s через DMA:

#define LONG_PLAY_CHUNK 30000
static uint16_t *long_play_wav;
static int long_play_remaining;

// push a another LONG_PLAY_CHUNK samples out through I2S DMA
static void long_play_continue() {
    int chunk_size = long_play_remaining > LONG_PLAY_CHUNK ? LONG_PLAY_CHUNK : long_play_remaining;

    int status = HAL_I2S_Transmit_DMA(&hi2s2, long_play_wav, chunk_size);
    if (status != HAL_OK) {
        HAL_Delay(0);// add a breakpoint here to see errors
    }

    long_play_remaining -= chunk_size;
    long_play_wav += chunk_size;
}

// this is called when the DMA completes
void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s) {
    if (long_play_remaining > 0) {
        long_play_continue();
    }
}

// use this to play more than 65535 samples
void long_play(uint16_t *wav, int samples) {
    long_play_wav = wav;
    long_play_remaining = samples;
    long_play_continue();
}

На stm32f303 это работает нормально, я могу позвонить long_play() несколько раз (пока не закончился предыдущий звук).

На stm32h743 этот код воспроизводит все части первого звука. т.е. он успешно связывает несколько прямых доступов к памяти.

Когда я пытаюсь воспроизвести второй образец, HAL_I2S_Transmit_DMA() терпит неудачу.

Если я изменю код на:

    if (long_play_remaining > 0) {
        long_play_continue();
    } else {
        // this really shouldn't be needed here, and isn't needed on the f303
        MX_I2S2_Init();
    }

оно работает.

Призыв к MX_I2S2_Init() это значительный объем кода.

Должен ли я действительно позвонить MX_I2S2_Init() после завершения каждого образца, или это ошибка генерации кода CubeMX на h743?

0 ответов

Другие вопросы по тегам