Нужно ли мне повторно инициализировать интерфейс 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?