[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
* 特别说明:
* SAI_CK_A和SAI_CK_B的时钟可以由PLLSAI或者PLLI2S提供,由于LCD的LTDC要使用PLLSAI,这里WM8978使用PLLI2S。
* --------------------------------------
* 本工程 HSE_VALUE = 8MHz,PLL_M = 8。
* 第1步: 先获取PLLI2SCLK
* PLLI2SCLK = (HSE_VALUE / PLL_M) * PLLI2S_N) / PLLI2S_Q
*
* 第2步: 经过PLLI2SDiv_Q分频获得SAI-A和SAI-B。
* SAI_CK_A和SAI_CK_B = PLLI2SCLK / PLLI2SDiv_Q
*
* 第3步:
* 如果 MCKDIV[3:0] 不等于 0000,则 MCLK_x = SAI_CK_x / (MCKDIV[3:0] * 2)
* 如果 MCKDIV[3:0] 等于 0000,则 MCLK_x = SAI_CK_x
* 此时MCLK_x的输出就是SAI接口的MCLK的输出频率,即主时钟频率。
* 另外采样率跟主时钟频率的关系是MCLK/FS = 256,采样率通过SAI接口的SCK引脚输出。
* --------------------------------------------------------------------------------
* Note:误差率 = abs(实际采样率-目标采样率)/目标采样率 * 100%
*
* 采用下面的参数配置采样率误差如下:
* 目标采样率(Hz) 实际采样率(Hz) 误差率
* 8000 8000 0.0000%
* 16000 16000.60096 0.0037%
* 32000 32001.20192 0.0037%
* 48000 47991.07142 0.0186%
* 96000 95982.14285 0.0186%
* 192000 191894.53125 0.0549%
*
* 11020 11024.8766 0.0011%
* 22050 22049.7532 0.0011%
* 44100 44099.5065 0.0011%
*
*********************************************************************************************************
*/
typedef struct
{
uint32_t Fs;
uint16_t PLLI2S_N; /* 范围可以取192--432 */
uint16_t PLLI2S_Q; /* 范围可以取2--15 */
uint8_t PLLI2S_DivQ; /* 范围可以取1--32 */
uint8_t MCKDIV; /* 范围可以取0--15 */
}PLLI2SPSC_T;
const PLLI2SPSC_T g_tPLLI2SPSC[]=
{
//参数范围192-432 2-15 1-32
/* Fs PLLI2S_N, PLLI2S_Q PLLI2S_DivQ MCKDIV */
{8000 , 256, 5, 25, 0}, /* MCLK = 2.048MHz, 实际采样率 = 8000KHz */
{16000, 213, 2, 26, 0}, /* MCLK = 4.096153MHz,实际采样率 = 16000.6KHz */
{32000, 213, 2, 13, 0}, /* MCLK = 8.192307MHz,实际采样率 = 32001KHz */
{48000, 258, 3, 7, 0}, /* MCLK = 12.28571MHz, 实际采样率 = 47991KHz */
{96000, 344, 2, 7, 0}, /* MCLK = 24.57142MHz, 实际采样率 = 95982KHz */
{192000, 393, 2, 4, 0}, /* MCLK = 49.125MHz, 实际采样率 = 191894KHz */
{11020, 429, 2, 19, 2}, /* MCLK = 2.822368MHz, 实际采样率 = 11.024KHz */
{22050, 429, 2, 19, 1}, /* MCLK = 5.644737MHz, 实际采样率 = 22.049KHz */
{44100, 429, 2, 19, 0}, /* MCLK = 11.28947MHz, 实际采样率 = 44.099KHz */
};