OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 525|回复: 2

参考原子哥的SAI例子用HAL库配置I2S,主时钟无输出。

[复制链接]

  离线 

36

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
834
金钱
834
注册时间
2016-4-20
在线时间
152 小时
发表于 2017-6-1 12:03:05 | 显示全部楼层 |阅读模式
正点原子公众号
       首先描述一下这个问题的来龙去脉, 端午节前,我同事也发帖子问了一下,但感觉大家感觉没有get到点子上。我再把问题重新描述一下。
       目前我们公司用stm32F429做一个音频的扩展应用要用2个音频总线。已经用了一个SAI接口模拟PCM总线,目前还要用一个I2S总线。我们模拟SAI的初始化模式用HAL库进行初始化。不过用逻辑分析仪进行测量,主时钟和帧时钟都没有时钟输出,所以绑定DMA的后续工作也没有继续进行。
       我们I2S初始化主要是2个部分
      1.GPIO引脚复用。
      2.I2S的格式,主从模式、采样位数、采样率等等。
      DMA的初始化暂时屏蔽了。以下是部分初始化代码:


/* 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       复用功能输出

}


//设置IIS的采样率(@MCKEN)
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[0])break;
        }
......
......
}
/*I2S 数据格式初始化 */
static void My_I2S2_Init(void)
{
  I2S_HandleTypeDef HI2S;

  __HAL_I2S_DISABLE(&HI2S);
  HI2S.Instance = SPI2;
  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_ENABLE;
  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_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);
   //I2S2_TX_DMA_Init(&buf0[0],&buf1[0],32);
        while(1)
        {

        };
}

回复

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-9-12
在线时间
0 小时
发表于 2017-9-12 14:55:17 | 显示全部楼层
回复 支持 反对

使用道具 举报

  离线 

36

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
834
金钱
834
注册时间
2016-4-20
在线时间
152 小时
 楼主| 发表于 2017-10-25 15:19:15 | 显示全部楼层
adong 发表于 2017-9-12 14:55
我遇到了同样的问题,无法解决

这个我后来直接进行寄存器的配置解决了,没有用库函数
回复 支持 反对

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-4-20 10:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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