Очередная багофича HAL

Наткнулся на новый косяк библиотеки HAL в функции HAL_I2S_Transmit. Есть у нее параметр uint16_t Size, который удваивается в случае работы с данными 24 или 32 бита

// stm32f4xx_hal_i2s.c line 537
if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B))
{
  hi2s->TxXferSize  = (Size << 1U);
  hi2s->TxXferCount = (Size << 1U);
}
else
{
  hi2s->TxXferSize  = Size;
  hi2s->TxXferCount = Size;
}


Проблема в том, что переменные TxXferSize и TxXferCount имеют тип uint16_t. И если на вход HAL_I2S_Transmit передать размер 0x8000 и более, то после сдвига влево результат превращается в тыкву.

// stm32f4xx_hal_i2s.h line 110
typedef struct __I2S_HandleTypeDef
{
  SPI_TypeDef                *Instance;    /*!< I2S registers base address        */
  I2S_InitTypeDef            Init;         /*!< I2S communication parameters      */
  uint16_t                   *pTxBuffPtr;  /*!< Pointer to I2S Tx transfer buffer */
  __IO uint16_t              TxXferSize;   /*!< I2S Tx transfer size              */
  __IO uint16_t              TxXferCount;  /*!< I2S Tx transfer Counter           */

хорошая звуковая карта (192/24) за выходные

После тюнинга плеера остались разные микросхемы, остался трупик старого плеера (умер своей смертью после 3х лет работы).
Решил из того что есть собрать хорошую звуковую карту. fiio E10 на сходной элементной базе превосходит все бытовые карты (включая ASUS Xonar Essence ). Собственно его схему и берем за основу.



Читать дальше

I2S в FPGA на Verilog

WM8731Добрый день, уважаемые! Помню, в прошлый раз в статье S/PDIF на FPGA я пообещал продолжение о работе с аудиокодеком. Вот, наконец, нашел время написать продолжение.
Сначала хотел описать регистры конфигурации кодека WM8731, но потом решил начать с описания интерфейса I2S, потому что описание регистров это, можно считать, практически перевод датащита. В следующей статье напишу о регистрах конфигурации.

Читать дальше