реклама на сайте
подробности

 
 
> STM32F4, Serial Audio Interface, функции HAL
Atlantis-
сообщение Mar 24 2015, 13:33
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
В stm32f429 есть блок SAI и в нем, судя по описанию, есть 32-битный регистр данных. То есть в режиме I2S можно оперировать 32-битными значениями. Однако в библиотеке HAL в функции передачи данных нужно передавать 16-битные значения. Например
CODE

HAL_StatusTypeDef HAL_SAI_Transmit_IT(SAI_HandleTypeDef *hsai, uint16_t *pData, uint16_t Size)
{
if(hsai->State == HAL_SAI_STATE_READY)
{
if((pData == NULL) || (Size == 0))
{
return HAL_ERROR;
}

hsai->pTxBuffPtr = pData;
hsai->TxXferSize = Size;
hsai->TxXferCount = Size;

/* Process Locked */
__HAL_LOCK(hsai);

hsai->State = HAL_SAI_STATE_BUSY_TX;

/* Transmit data */
hsai->Instance->DR = (*hsai->pTxBuffPtr++);
hsai->TxXferCount--;

/* Process Unlocked */
__HAL_UNLOCK(hsai);

/* Enable FRQ and OVRUDR interrupts */
__HAL_SAI_ENABLE_IT(hsai, (SAI_IT_FREQ | SAI_IT_OVRUDR));

/* Check if the SAI is already enabled */
if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) != SAI_xCR1_SAIEN)
{
/* Enable SAI peripheral */
__HAL_SAI_ENABLE(hsai);
}


return HAL_OK;
}
else if(hsai->State == HAL_SAI_STATE_BUSY_TX)
{
/* Process Locked */
__HAL_LOCK(hsai);

/* Transmit data */
hsai->Instance->DR = (*hsai->pTxBuffPtr++);

hsai->TxXferCount--;

if(hsai->TxXferCount == 0)
{
/* Disable FREQ and OVRUDR interrupts */
__HAL_SAI_DISABLE_IT(hsai, (SAI_IT_FREQ | SAI_IT_OVRUDR));

hsai->State = HAL_SAI_STATE_READY;

HAL_SAI_TxCpltCallback(hsai);
}

/* Process Unlocked */
__HAL_UNLOCK(hsai);

return HAL_OK;
}

else
{
return HAL_BUSY;
}
}


Непонятно, почему так сделано? И можно ли как то обмануть библиотеку и работать с int-ами?

Сообщение отредактировал Atlantis- - Mar 24 2015, 13:42
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Atlantis-
сообщение Mar 24 2015, 15:09
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Еще мне с его настройками не совсем понятно, там их больше чем обычно. Мне нужно настроить передачу 24 бит на канал в 32-х битном фрейме. При настройке Cube не дает делать 32-битный фрейм в отличие от настроек I2S. В итоге у меня получилось так: Frame Length 64 bits, Data size 24 bits, Slot size 32 bits; Frame Synchro Definition: Channel Identification, Number of Slots 2, Frame Synchro Active Level Length 32. Все правильно?
Немного смущает, при 24-битном слоте и 32-битном регистре данных, что он будет отсылать в оставшихся 8 битах. То есть будет ли заменять их на нули.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016