Здравствуйте!
В 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