STM32F769IDiscovery  1.00
uDANTE Audio Networking with STM32F7 DISCO board
SPDIF_Tx.c
Go to the documentation of this file.
1 /*
2  * SPDIF_Tx.c
3  *
4  * Created on: May 29, 2016
5  * Author: Torsten
6  */
7 
8 #include "main.h"
9 #include "AudioPlayer.h"
10 
11 /* Private typedef -----------------------------------------------------------*/
12 /* Private define ------------------------------------------------------------*/
13 /* Private macro -------------------------------------------------------------*/
14 /* Private variables ---------------------------------------------------------*/
15 
17 
19 
25 void SPDIF_Tx_Init(void)
26 {
27  /* Configure SAI in SPDIF-Tx Mode */
28  spdiftxhsai.Instance = SAI2_Block_A;
29  spdiftxhsai.Init.AudioMode = SAI_MODEMASTER_TX;
30  spdiftxhsai.Init.Synchro = SAI_ASYNCHRONOUS;
31  spdiftxhsai.Init.SynchroExt = SAI_SYNCEXT_DISABLE;
35  spdiftxhsai.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_96K; //WHY????
36  spdiftxhsai.Init.Mckdiv = 0;
37  spdiftxhsai.Init.MonoStereoMode = SAI_STEREOMODE;
38  spdiftxhsai.Init.CompandingMode = SAI_NOCOMPANDING;
39  spdiftxhsai.Init.TriState = SAI_OUTPUT_NOTRELEASED;
40  spdiftxhsai.Init.Protocol = SAI_SPDIF_PROTOCOL;
41  spdiftxhsai.Init.DataSize = SAI_DATASIZE_16;
42  spdiftxhsai.Init.FirstBit = SAI_FIRSTBIT_MSB;
44 
45  spdiftxhsai.FrameInit.FrameLength = 64;
46  spdiftxhsai.FrameInit.ActiveFrameLength = 32;
49  spdiftxhsai.FrameInit.FSOffset = SAI_FS_FIRSTBIT;
50 
51  spdiftxhsai.SlotInit.FirstBitOffset = 0;
53  spdiftxhsai.SlotInit.SlotNumber = 4;
54  spdiftxhsai.SlotInit.SlotActive = 0x0000000F; //SAI_SLOTACTIVE_ALL;
55 
56  if(HAL_SAI_Init(&spdiftxhsai)!= HAL_OK )
57  {
58  return;
59  }
60 }
61 
67 void SPDIF_Tx_Start(void)
68 {
69  /* Start transmission (DMA mode) */
70  HAL_SAI_Transmit_DMA(&spdiftxhsai, (uint8_t *)SPDIF_TX_buf, sizeof(SPDIF_TX_buf) / sizeof(uint16_t));
71 }
72 
73 static void SPDIF_Tx_CpyBuf(uint8_t *dst, uint8_t *src, int len)
74 {
75  while (len)
76  {
77  *dst++ = *(src + 1);
78  *dst++ = *(src + 0);
79  src += 2;
80  len -= 2;
81  }
82 }
83 
90 {
91  uint8_t *buf, *outBuf;
92  int bufLen;
93 
94  bufLen = AUDIO_PLAYER_GetBuffer(&buf);
95 
96  if (AUDIO_PLAYER_GetState() == 0)
97  outBuf = buf;
98  else
99  outBuf = buf + bufLen / 2;
100 
101  SPDIF_Tx_CpyBuf(&SPDIF_TX_buf[AUDIO_TOTAL_BUF_SIZE], outBuf, bufLen / 2);
102 }
103 
110 {
111  uint8_t *buf, *outBuf;
112  int bufLen;
113 
114  bufLen = AUDIO_PLAYER_GetBuffer(&buf);
115 
116  if (AUDIO_PLAYER_GetState() == 0)
117  outBuf = buf;
118  else
119  outBuf = buf + bufLen / 2;
120 
121  SPDIF_Tx_CpyBuf(&SPDIF_TX_buf[0], outBuf, bufLen / 2);
122 }
SAI_SlotInitTypeDef SlotInit
#define SAI_AUDIO_FREQUENCY_96K
#define AUDIO_OUT_BUFFER_SIZE
Definition: AudioPlayer.h:17
HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
#define SAI_STEREOMODE
#define SAI_CLOCKSTROBING_FALLINGEDGE
#define SAI_DATASIZE_16
SAI_HandleTypeDef spdiftxhsai
Definition: SPDIF_Tx.c:16
#define SAI_MASTERDIVIDER_ENABLE
#define SAI_SPDIF_PROTOCOL
#define SAI_FIRSTBIT_MSB
SAI_Block_TypeDef * Instance
#define SAI_ASYNCHRONOUS
uint8_t SPDIF_TX_buf[AUDIO_OUT_BUFFER_SIZE]
Definition: SPDIF_Tx.c:18
#define SAI_FS_FIRSTBIT
#define SAI2_Block_A
Definition: stm32f745xx.h:1311
#define SAI_OUTPUTDRIVE_DISABLE
#define AUDIO_TOTAL_BUF_SIZE
Definition: usbd_audio.h:108
#define SAI_SYNCEXT_DISABLE
#define SAI_FS_ACTIVE_LOW
#define SAI_OUTPUT_NOTRELEASED
#define SAI_FS_STARTFRAME
#define SAI_NOCOMPANDING
SAI_FrameInitTypeDef FrameInit
#define SAI_MODEMASTER_TX
void SPDIF_TX_HalfTransfer_CallBack(void)
ISR Handler for the SPDIF Tx (first buffer full)
Definition: SPDIF_Tx.c:109
#define SAI_FIFOTHRESHOLD_EMPTY
void SPDIF_TX_TransferComplete_CallBack(void)
ISR Handler for the SPDIF Tx (second buffer full)
Definition: SPDIF_Tx.c:89
void SPDIF_Tx_Start(void)
Start the SPDIF Tx transmission, output.
Definition: SPDIF_Tx.c:67
int AUDIO_PLAYER_GetState(void)
Definition: AudioPlayer.c:109
SAI_InitTypeDef Init
int AUDIO_PLAYER_GetBuffer(uint8_t **out_BufAddr)
Definition: AudioPlayer.c:117
#define SAI_SLOTSIZE_DATASIZE
void SPDIF_Tx_Init(void)
Initialize the SPDIF Tx transmission, forward as SPDIF out.
Definition: SPDIF_Tx.c:25
HAL_StatusTypeDef HAL_SAI_Init(SAI_HandleTypeDef *hsai)