Нужно ли повторно инициализировать интерфейс i2s на stm32h743, но не на stm32f303? - PullRequest
0 голосов
/ 18 февраля 2020

Следующий код воспроизводит звуки с более чем 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 этот код воспроизводит все части первого звука. то есть он успешно соединяет несколько DMA.

Когда я пытаюсь воспроизвести второй семпл, 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?

...