打印

STM32的I2S slave模式问题

[复制链接]
13150|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chineser|  楼主 | 2009-7-16 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们在使用STM32的I2S slave模式发送时,发现一下现象,请帮忙分析:

下图1为STM32 I2S Slave TX的波形,master为WM8753(一款音频codec),采样率为8kHz,16bit。波形从上到下分别为IIS_CK、IIS_WS和IIS_SD。测试的方法是STM32轮询SPI_I2S_FLAG_TXE状态,如其置位则发送0x5555(或0xAAAA),具体配置和测试程序请参见附件中的源代码。目前的问题是STM32似乎不受WS信号的约束,随着CK信号不停的发送数据。而我们采用Samsung的44B0X作为Slave,master采用同样配置,其波形如图2所示,工作正常。请陈工帮忙分析原因,并给出解决方法,谢谢!
沙发
chineser|  楼主 | 2009-7-16 15:10 | 只看该作者

图1 STM32 I2S Slave Tx波形

使用特权

评论回复
板凳
chineser|  楼主 | 2009-7-16 15:10 | 只看该作者

图2 Samsung 44B0X I2S Slave Tx波形

使用特权

评论回复
地板
chineser|  楼主 | 2009-7-16 15:12 | 只看该作者

程序

 /* I2S peripheral configuration */
  I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips;
  I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b/*extended*/;
  I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;
  I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_8k;
  I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;

  /* I2S2 Master Transmitter to I2S3 Slave Receiver communication -----------*/
  /* I2S2 configuration */
  I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveTx;//I2S_Mode_SlaveTx;
  I2S_Init(SPI3, &I2S_InitStructure);

  //I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveRx;
  //I2S_Init(SPI2, &I2S_InitStructure);

  /* Enable the I2S3 */
  I2S_Cmd(SPI3, ENABLE);
  //I2S_Cmd(SPI2, ENABLE);

  wm8753_config(MIC_1, 24, SIDETONE_DISABLE, 8000, DAC_MUSIC_ONLY);

  while (1) {
    int len = 36494/2, i = 0, cflag;
    unsigned short *p = (unsigned short *)&testdata[0];
    while (i < len) {
        /* Wait the Tx buffer to be empty */        
        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)
        {}
        
        /* Send a data from I2S3 */        
        SPI_I2S_SendData(SPI3, 0xAAAA/*p[i++]*/);
        
        while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)
        {}
        
        /* Send a data from I2S3 */        
        SPI_I2S_SendData(SPI3, 0x5555/*p[i++]*/);
        
        //i += 2;        
    }
    //i = 0;
    while (1);
  }
  I2S_Cmd(SPI3, DISABLE);
  //I2S_Cmd(SPI2, DISABLE);

  while (1)
  {
  }
}

使用特权

评论回复
5
chineser|  楼主 | 2009-7-17 11:23 | 只看该作者

使用特权

评论回复
6
rocket432| | 2011-5-28 20:46 | 只看该作者
我初始化的wm978,跟楼主一样的代码,就不见波形呢,一直高电平

使用特权

评论回复
7
e21| | 2014-7-8 14:21 | 只看该作者
遇到同样问题,楼主解决了吗?

使用特权

评论回复
8
xiao王| | 2016-12-31 21:40 | 只看该作者
chineser 发表于 2009-7-16 15:12
&nbsp;/*&nbsp;I2S&nbsp;peripheral&nbsp;configuration&nbsp;*/&nbsp;&nbsp;I2S_InitStructure.I2S_Standa ...

后来问题怎么解决的呢?

使用特权

评论回复
9
hzwit| | 2019-12-3 20:36 | 只看该作者
我也碰到同样问题,不管ws是高电平还是低电平,I2S 只要sck有信号,马上发送数据,和勘误手册处理的情况不一致呀

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

93

主题

261

帖子

0

粉丝