MindSDK_MM32F5270/device/drivers/hal_i2s.h
Yilin Sun 3977144e90
Initial MM32F527x commit.
Signed-off-by: Yilin Sun <imi415@imi.moe>
2023-03-27 21:54:40 +08:00

230 lines
6.6 KiB
C

/*
* Copyright 2022 MindMotion Microelectronics Co., Ltd.
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __HAL_I2S_H__
#define __HAL_I2S_H__
#include "hal_common.h"
/*!
* @addtogroup I2S
* @{
*/
/*!
* @brief I2S driver version number.
*/
#define I2S_DRIVER_VERSION 0u /*!< i2s_0. */
/*!
* @addtogroup I2S_STATUS
* @{
*/
#define I2S_STATUS_BUSY SPI_I2S_CSTAT_BUSY_MASK /*!< Status flag when I2S is transmitting or receiving. */
#define I2S_STATUS_TX_FULL SPI_I2S_CSTAT_TXFULL_MASK /*!< Status flag when I2S transmiter buffer is full. */
#define I2S_STATUS_TX_DONE SPI_I2S_CSTAT_TXEPT_MASK /*!< Status flag when I2S transmiter buffer & transmiter are empty. */
#define I2S_STATUS_RX_DONE SPI_I2S_CSTAT_RXAVL_MASK /*!< Status flag when I2S receiving buffer is with available data. */
/*!
* @}
*/
/*!
* @addtogroup I2S_INT
* @{
*/
#define I2S_INT_TX_EMPTY SPI_I2S_INTEN_TXIEN_MASK /*!< Interrupt flag when I2S transmiter buffer is empty. */
#define I2S_INT_TX_DONE SPI_I2S_INTSTAT_TXEPTINTF_MASK /*!< Interrupt flag when I2S transmiter buffer & transmiter are empty. */
#define I2S_INT_RX_DONE SPI_I2S_INTEN_RXIEN_MASK /*!< Interrupt flag when I2S receiving buffer is with available data. */
#define I2S_INT_XFER_ERROR SPI_I2S_INTEN_FREIEN_MASK /*!< Interrupt flag when I2S xfer data error. */
/*!
* @}
*/
/*!
* @brief I2S polarity type.
*/
typedef enum
{
I2S_Polarity_0 = 0u, /*!< CPOL = 0, Clock line is low when idle. */
I2S_Polarity_1 = 1u, /*!< CPOL = 1, Clock line is high when idle. */
} I2S_Polarity_Type;
/*!
* @brief I2S data width type.
*/
typedef enum
{
I2S_DataWidth_16b = 0u, /*!< Data width is 16 bit. */
I2S_DataWidth_24b = 1u, /*!< Data width is 24 bit. */
I2S_DataWidth_32b = 2u, /*!< Data width is 32 bit. */
} I2S_DataWidth_Type;
/*!
* @brief I2S protocol type.
*/
typedef enum
{
I2S_Protocol_PHILIPS = 0u, /*!< Philips xfer protocol. */
I2S_Protocol_MSB = 1u, /*!< MSB xfer protocol. */
I2S_Protocol_LSB = 2u, /*!< LSB xfer protocol. */
I2S_Protocol_PCM = 3u, /*!< PCM xfer protocol. */
} I2S_Protocol_Type;
/*!
* @brief I2S xfer mode type.
*/
typedef enum
{
I2S_XferMode_TxOnly = 0u, /*!< Enable Tx only. */
I2S_XferMode_RxOnly = 1u, /*!< Enable Rx only. */
I2S_XferMode_TxRx = 2u, /*!< Enable both Tx and Rx. */
} I2S_XferMode_Type;
/*!
* @brief I2S xfer channel type.
*/
typedef enum
{
I2S_Channel_Left = 0u, /*!< Left Xfer channel. */
I2S_Channel_Right = 1u, /*!< Right Xfer channel. */
} I2S_Channel_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref I2S_InitMaster() to initialize the I2S module.
*/
typedef struct
{
uint32_t ClockFreqHz; /*!< Bus Clock Freq. */
uint32_t SampleRate; /*!< This member configures the I2S sample rate. */
I2S_DataWidth_Type DataWidth; /*!< Specifies the number of bits of data to be transmitted. */
I2S_Polarity_Type Polarity; /*!< Specifies the polarity of clock. */
I2S_Protocol_Type Protocol; /*!< Specifies different communication protocols. */
I2S_XferMode_Type XferMode; /*!< Specifies different communication transmit modes. */
bool EnableMCLK; /*!< Specifies whether enable MCLK. */
} I2S_Master_Init_Type;
/*!
* @brief Initialize the I2S Master module.
*
* @param I2Sx I2S instance.
* @param init Pointer to the initialization structure. See to @ref I2S_Master_Init_Type.
* @return None.
*/
void I2S_InitMaster(I2S_Type * I2Sx, I2S_Master_Init_Type * init);
/*!
* @brief Enable the I2S module.
*
* The I2S module should be enabled before sending or receiving data.
*
* @param I2Sx I2S instance.
* @param enable 'true' to enable the module, 'false' to disable the module.
* @return None.
*/
void I2S_Enable(I2S_Type * I2Sx, bool enable);
/*!
* @brief Get the current status flags of the I2S module.
*
* @param I2Sx I2S instance.
* @return Status flags. See to @ref I2S_STATUS.
*/
uint32_t I2S_GetStatus(I2S_Type * I2Sx);
/*!
* @brief Enable interrupts of the I2S module.
*
* @param I2Sx I2S instance.
* @param interrupts Interrupt code masks. See to @ref I2S_INT.
* @param enable 'true' to enable the indicated interrupts, 'false' to disable the indicated interrupts.
* @return None.
*/
void I2S_EnableInterrupts(I2S_Type * I2Sx, uint32_t interrupts, bool enable);
/*!
* @brief Get the interrupts status flags of the I2S module.
*
* @param I2Sx I2S instance.
* @return Interrupt status flags. See to @ref I2S_INT.
*/
uint32_t I2S_GetInterruptStatus(I2S_Type * I2Sx);
/*!
* @brief Clear the interrupt status flags of the I2S module.
*
* @param I2Sx I2S instance.
* @param interrupts The mask codes of the indicated interrupt flags to be cleared.
* @return None.
*/
void I2S_ClearInterruptStatus(I2S_Type * I2Sx, uint32_t interrupts);
/*!
* @brief Put the data into transmiter buffer of the I2S module.
*
* @param I2Sx I2S instance.
* @param data Data value to be send through the transmiter.
* @return None.
*/
void I2S_PutData(I2S_Type * I2Sx, uint32_t dat);
/*!
* @brief Get the data from receiver buffer of the I2S module.
*
* @param I2Sx I2S instance.
* @return The data value received from the receiver.
* @return data Data value to be received from the transmiter.
*/
uint32_t I2S_GetData(I2S_Type * I2Sx);
/*!
* @brief Enable the DMA trigger from the I2S module.
*
* The DMA trigger events are the same as the interrupts.
*
* @param I2Sx I2S instance.
* @param enable 'true' to enable the DMA trigger, 'false' to disable the DMA trigger.
* @return None.
*/
void I2S_EnableDMA(I2S_Type * I2Sx, bool enable);
/*!
* @brief Get the hardware Rx data buffer's address the I2S module.
*
* The return value of the address is most used with DMA module.
*
* @param I2Sx I2S instance.
* @return The value of the address for I2S module's hardware Rx data buffer.
*/
uint32_t I2S_GetRxDataRegAddr(I2S_Type * I2Sx);
/*!
* @brief Get the hardware Tx data buffer's address the I2S module.
*
* The return value of the address is most used with DMA module.
*
* @param I2Sx I2S instance.
* @return The value of the address for I2S module's hardware Tx data buffer.
*/
uint32_t I2S_GetTxDataRegAddr(I2S_Type * I2Sx);
/*!
* @brief Get the transmitting channel of the I2S module.
*
* @param I2Sx I2S instance.
* @return The current transmitting channel.
*/
I2S_Channel_Type I2S_GetXferChannel(I2S_Type * I2Sx);
/*!
*@}
*/
#endif /* __HAL_I2S_H__ */
/* EOF. */