OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5981|回复: 4

最近参考原子哥的SAI例子和标准库的例子用HAL库配置I2S,“目前的采样率设置为16KHz,但是主时钟和帧时钟都没有电平输出”,希....

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-4-27
在线时间
5 小时
发表于 2017-5-27 15:11:10 | 显示全部楼层 |阅读模式
1金钱
/* I2S 引脚复用初始化 */
void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s)
{

   __HAL_RCC_GPIOC_CLK_ENABLE() ;  /* GPIO Ports Clock Enable */
   __HAL_RCC_GPIOB_CLK_ENABLE();        
  __HAL_RCC_SPI2_CLK_ENABLE();
       
  GPIO_InitTypeDef  GPIO_Initure1;
  GPIO_InitTypeDef  GPIO_Initure2;
  GPIO_InitTypeDef  GPIO_Initure3;

  GPIO_Initure1.Pin = GPIO_PIN_10|GPIO_PIN_12|GPIO_PIN_15;
  GPIO_Initure1.Mode = GPIO_MODE_AF_PP;
  GPIO_Initure1.Pull=GPIO_PULLUP;            
  GPIO_Initure1.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_Initure1.Alternate = GPIO_AF5_SPI2;

  GPIO_Initure2.Pin= GPIO_PIN_2;
  GPIO_Initure2.Mode=GPIO_MODE_AF_PP;      
  GPIO_Initure2.Pull=GPIO_PULLUP;                     
  GPIO_Initure2.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_Initure2.Alternate= GPIO_AF6_I2S2ext;


  GPIO_Initure3.Pin= GPIO_PIN_6;
  GPIO_Initure3.Mode=GPIO_MODE_AF_PP;
  GPIO_Initure3.Pull=GPIO_PULLUP;
  GPIO_Initure3.Speed=GPIO_SPEED_FREQ_HIGH;
  GPIO_Initure3.Alternate= GPIO_AF5_SPI2;

  HAL_GPIO_Init(GPIOB, &GPIO_Initure1);     //PB10/12/15  复用功能输出
  HAL_GPIO_Init(GPIOC, &GPIO_Initure2);                                                      
  HAL_GPIO_Init(GPIOC, &GPIO_Initure3);     //PC2/6       复用功能输出

}



//采样率计算公式:Fs=I2SxCLK/[256*(2*I2SDIV+ODD)]
//I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR
//一般HSE=8Mhz
//pllm:在Sys_Clock_Set设置的时候确定,一般是8
//PLLI2SN:一般是192~432
//PLLI2SR:2~7
//I2SDIV:2~255
//ODD:0/1
//I2S分频系数表@pllm=25,HSE=25Mhz,即vco输入频率为1Mhz
//表格式:采样率/10,PLLI2SN,PLLI2SR,I2SDIV,ODD
const u16 I2S_PSC_TBL[][5]=
{
        {800 ,256,5,12,1},                //8Khz采样率
        {1102,429,4,19,0},                //11.025Khz采样率
        {1600,213,2,13,0},                //16Khz采样率  open MCLK
        {2205,429,4, 9,1},                //22.05Khz采样率
        {3200,213,2, 6,1},                //32Khz采样率
        {4410,271,2, 6,0},                //44.1Khz采样率
        {4800,258,3, 3,1},                //48Khz采样率
        {8820,316,2, 3,1},                //88.2Khz采样率
        {9600,344,2, 3,1},          //96Khz采样率
        {17640,361,2,2,0},          //176.4Khz采样率
        {19200,393,2,2,0},          //192Khz采样率
};  


//设置IIS的采样率(@MCKEN)
//samplerate:采样率,单位:Hz
//返回值:0,设置成功;1,无法设置.
u8 I2S2_SampleRate_Set(u32 samplerate)
{
        u8 i=0;
        u32 tempreg=0;
        samplerate/=10;//缩小10倍   
        for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//看看改采样率是否可以支持
        {
                if(samplerate==I2S_PSC_TBL[i][0])break;
        }
        __HAL_RCC_PLLI2S_DISABLE();;                                                //先关闭PLLI2S
        if(i==(sizeof(I2S_PSC_TBL)/10))return 1;//搜遍了也找不到
        tempreg|=(u32)I2S_PSC_TBL[i][1]<<6;                //设置PLLI2SN
        tempreg|=(u32)I2S_PSC_TBL[i][2]<<28;        //设置PLLI2SR
        RCC->PLLI2SCFGR=tempreg;                //设置I2SxCLK的频率(x=2)
        RCC->CR|=1<<26;                                        //开启I2S时钟
        while((RCC->CR&1<<27)==0);                //等待I2S时钟开启成功.
        tempreg=I2S_PSC_TBL[i][3]<<0;        //设置I2SDIV
        tempreg|=I2S_PSC_TBL[i][4]<<8;        //设置ODD位
        tempreg|=1<<9;                                        //使能MCKOE位,输出MCK
        SPI2->I2SPR=tempreg;                        //设置I2SPR寄存器
        return 0;
}
/*I2S 数据格式初始化 */
//std:I2S标准,00,飞利浦标准;01,MSB对齐标准(右对齐);10,LSB对齐标准(左对齐);11,PCM标准
//mode:I2S工作模式,00,从机发送;01,从机接收;10,主机发送;11,主机接收
//cpol:0,时钟低电平有效;1,时钟高电平有效
//datalen:数据长度,0,16位标准;1,16位扩展(frame=32bit);2,24位;3,32位
  static void My_I2S2_Init(void)
{
  I2S_HandleTypeDef HI2S;
       
  __HAL_I2S_DISABLE(&HI2S);
  HI2S.Instance = SPI2;
  HI2S.Init.MCLKOutput =I2S_MCLKOUTPUT_ENABLE;
  HI2S.Init.Mode = I2S_MODE_MASTER_TX;       //I2S主机发送工作模式
  HI2S.Init.Standard = I2S_STANDARD_PHILIPS;   //I2S飞利浦标准
  HI2S.Init.DataFormat = I2S_DATAFORMAT_16B;    //数据长度16位
  HI2S.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
  HI2S.Init.AudioFreq = I2S_AUDIOFREQ_16K;
  HI2S.Init.CPOL = I2S_CPOL_HIGH;
  HI2S.Init.ClockSource = I2S_CLOCK_PLL;
  HI2S.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;
  HI2S.State=HAL_I2S_STATE_RESET;
  if(HAL_I2S_GetState(&HI2S) == HAL_I2S_STATE_RESET)
  {
           HAL_I2S_MspInit(&HI2S);
  }
       HAL_I2S_Init(&HI2S);
   __HAL_I2S_ENABLE(&HI2S);     //SPI2 I2S EN 使能
}
int  main(void)
{
    Stm32_Clock_Init(384,25,2,8);   //设置时钟,192Mhz   
    delay_init(192);                //初始化延时函数
   My_I2S2_Init();
   I2S2_SampleRate_Set(16000);
        while(1)
        {

        };
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-27 19:06:47 | 显示全部楼层
我们开发板就支持16Khz啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-4-27
在线时间
5 小时
 楼主| 发表于 2017-5-31 09:49:41 | 显示全部楼层
原子哥,我用的是STM32F429的开发板,可是为什么主时钟和帧时钟都没有电平输出呢,请原子哥帮帮看看我的程序哪里出现问题。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-31 21:50:06 | 显示全部楼层
13172467542 发表于 2017-5-31 09:49
原子哥,我用的是STM32F429的开发板,可是为什么主时钟和帧时钟都没有电平输出呢,请原子哥帮帮看看我的程序 ...

你用我们429的综合实验,直接就可以支持16KHz音频才对
测试下,别改代码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2017-6-1 11:28:26 | 显示全部楼层
正点原子 发表于 2017-5-31 21:50
你用我们429的综合实验,直接就可以支持16KHz音频才对
测试下,别改代码

楼主的意思是用I2S而不是用SAI总线。这个开发板历程好像是没有。从代码上看基本也都配置对了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 02:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表