搜索
bottom↓
回复: 25

stm32f4 的I2S 全双工

[复制链接]

出0入0汤圆

发表于 2014-7-14 16:32:52 | 显示全部楼层 |阅读模式
本帖最后由 dreamc 于 2014-7-14 23:25 编辑

GPIO Init
  1.           GPIO_InitTypeDef GPIO_InitStructure;
  2.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  3.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  4.           RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  5.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14  | GPIO_Pin_15;//WS CK SD
  6.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  7.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.           GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  9.           GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;
  10.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  11.           GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2);  
  12.           GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
  13.           GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
  14.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_I2S2ext);
  15.        
  16.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //MCLK
  17.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  18.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.           GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  20.           GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;
  21.           GPIO_Init(GPIOC, &GPIO_InitStructure);   
  22.           GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_SPI2);
复制代码


I2S Init
  1.           I2S_InitTypeDef I2S_InitStructure;
  2.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  3.           SPI_I2S_DeInit(SPI2);
  4.        
  5.           I2S_StructInit(&I2S_InitStructure);
  6.           I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_8k;;
  7.           I2S_InitStructure.I2S_Standard = I2S_Standard_MSB;
  8.           I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;
  9.           I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
  10.           I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx;
  11.           I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Enable;
  12.           I2S_Init(SPI2, &I2S_InitStructure);

  13.           I2S_FullDuplexConfig(I2S2ext, &I2S_InitStructure);
  14.                 I2S_Cmd(SPI2, DISABLE);
  15.        
  16.           I2S_Cmd(I2S2ext, ENABLE);
复制代码
  1.                                        
  2.         for(i=0;i<200;i++)
  3.         {
  4.            while (SPI_I2S_GetFlagStatus(I2S2ext, SPI_FLAG_RXNE) == RESET);
  5.             soundbuf1[i] = SPI_I2S_ReceiveData(I2S2ext);
  6.                                         }
复制代码


阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-7-14 16:33:48 | 显示全部楼层
是正的,已经测试过,已经用在产品上面了。

出0入0汤圆

 楼主| 发表于 2014-7-14 16:36:13 | 显示全部楼层
jxcylxh 发表于 2014-7-14 16:33
是正的,已经测试过,已经用在产品上面了。

哎,那看来还是要再看看什么问题啊,我的配置对的么

出0入0汤圆

 楼主| 发表于 2014-7-14 16:53:34 | 显示全部楼层
可以了,原来自己一个引脚配置错了,大家要是遇到的话可以参考一下,代码我编辑改正过来了。

出0入0汤圆

发表于 2014-7-15 12:43:08 | 显示全部楼层
恩,还没用过IIS,学习一下,以后会用到。。。。。。,正在做stm32f429,之后会加上音频

出0入0汤圆

发表于 2014-7-16 10:39:39 | 显示全部楼层
IIS官方例程应该是有的

出0入0汤圆

 楼主| 发表于 2014-7-16 15:38:27 | 显示全部楼层
Cavsle 发表于 2014-7-16 10:39
IIS官方例程应该是有的

你可以找下啊,应该是没有的

出0入0汤圆

发表于 2014-9-25 11:38:33 | 显示全部楼层
dreamc 发表于 2014-7-16 15:38
你可以找下啊,应该是没有的

多谢楼主。
我按您的方法试了,IS2发送好像正常,接收EXT_SD没有输出(输出全0,中断中看的),调试2天了。拜托您指导一下。
1. 我的硬件配置是用SPI2,  PI0=WS; PI1=SCK, PI3=SD, PC2=EXT_SD; 软件配置和您的差不多,仅仅端口改了,SD与EXT_SD模式都为I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx;。
2. I2S_Cmd(SPI2, DISABLE)好像不能工作,必须I2S_Cmd(SPI2, ENABLE);I2S_Cmd(I2S2ext, ENABLE);都用I2S才能进TX中断
3. 另外发现PC2的EXT_SD AF功能居然在stm32f4xx_gpio.h没有定义,但是DATASHEET标明是AF6,我就用其试了,也试了AF5,接收EXT_SD输出任然全0。
   数据是在中断中看的,如下,目的是将接收的数据发往发送,正常的话,应该可以在耳机中听到LINE IN的音乐。
                temp=SPI_I2S_ReceiveData(I2S2ext);
                SPI_I2S_SendData(SPI2, temp);

能否指点一下?多谢!

出0入0汤圆

 楼主| 发表于 2014-9-25 13:51:59 | 显示全部楼层
szszjdb 发表于 2014-9-25 11:38
多谢楼主。
我按您的方法试了,IS2发送好像正常,接收EXT_SD没有输出(输出全0,中断中看的),调试2天了 ...

#define GPIO_AF_I2S2ext       ((uint8_t)0x06) 添加这个定义啊,应该有数据才对啊

出0入0汤圆

 楼主| 发表于 2014-9-25 13:54:30 | 显示全部楼层
本帖最后由 dreamc 于 2014-9-25 14:01 编辑
szszjdb 发表于 2014-9-25 11:38
多谢楼主。
我按您的方法试了,IS2发送好像正常,接收EXT_SD没有输出(输出全0,中断中看的),调试2天了 ...


跟我上面一样去配置 还有I2S2ext_SD 只能用做接收,而原来的只能做发送
你必须加上这句while (SPI_I2S_GetFlagStatus(I2S2ext, SPI_FLAG_RXNE) == RESET);完成一个word接收
发送一样也要才行

出0入0汤圆

发表于 2014-9-26 00:10:23 | 显示全部楼层
兄弟,多谢!
按照您的提示试过了,还是不行。现象还是I2S2ext_SD收不到任何数据,RXNE标志没有发现=1的时候。
开始时怀疑硬件连线有误,但在以下条件下检查,是可以在CODEC的MCK以及I2S2ext_SD,I2S2_SD等STM32F4 的I2S2管脚看到正常波形,
        I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx;
        I2S_FullDuplexConfig(I2S2ext, &I2S_InitStructure);
且留意到参考手册上有这么一段话,我理解是I2S2ext_SD必须在从机模式
I2Sx can operate in master mode. As a result:
• Only I2Sx can output SCK and WS in half duplex mode
• Only I2Sx can deliver SCK and WS to I2S2_ext and I2S3_ext in full duplex mode.
The extended I2Ss (I2Sx_ext) can be used only in full duplex mode. The I2Sx_ext operate
always in slave mode.
但是一旦I2S_InitStructure.I2S_Mode 设为不等于I2S_Mode_MasterTx的任何模式,如I2S_Mode_SlaveRx,I2S2ext_SD管脚测得的峰峰值马上降到1V左右,正常3.3V。不知何故。

总之,以上实验都发现I2S2ext_SD收不到任何数据,RXNE标志没有发现=1的时候。

后来怀疑I2S2ext_SD端口是否有BUG,于是从PC2,PB14,直到PI2, 3种可能的I2S2ext_SD选择都试了,现象不变。
实在是快累趴下了。服了ST了,这么重要的功能连个例子都没有。

最后将我的代码贴出,不含库文件,不知楼主能否帮我看看问题在哪里? 先谢过了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-9-26 11:17:55 | 显示全部楼层
dreamc 发表于 2014-9-25 13:54
跟我上面一样去配置 还有I2S2ext_SD 只能用做接收,而原来的只能做发送
你必须加上这句while (SPI_I2S_Get ...

抱歉,请看我上面的问题,多谢!

出0入0汤圆

 楼主| 发表于 2014-9-26 22:12:33 | 显示全部楼层
szszjdb 发表于 2014-9-26 11:17
抱歉,请看我上面的问题,多谢!

嗯 我明早帮你看下。

出0入0汤圆

发表于 2014-9-27 00:39:28 | 显示全部楼层
dreamc 发表于 2014-9-26 22:12
嗯 我明早帮你看下。

麻烦您了,多谢!

出0入0汤圆

 楼主| 发表于 2014-9-27 14:11:53 | 显示全部楼层
szszjdb 发表于 2014-9-27 00:39
麻烦您了,多谢!

QQ联系吧

出0入0汤圆

发表于 2014-9-27 14:32:37 | 显示全部楼层

我的qq: 302861256 ,多谢!

出0入0汤圆

发表于 2014-9-28 17:14:46 | 显示全部楼层

兄弟,抱歉,我输错QQ号码啦,更正如下:
302861265 ,
实在抱歉,多谢!

出0入0汤圆

发表于 2014-9-28 17:38:41 | 显示全部楼层
好好好好好

出0入0汤圆

发表于 2014-10-1 16:13:15 | 显示全部楼层

多谢DREAMC兄弟帮忙查。原来是PI0/1不能用于全双工。代码没有问题。再次感谢

出0入0汤圆

发表于 2014-11-7 18:53:03 | 显示全部楼层
大侠们的I2S玩的怎样了,我的怎么出现了很诡异的事情,DMA轮流发送两个数组的内容给I2S,但是每次在切换数组的时候,就会自动先发送一个0x00,然后所有的数据都会延后一个字节,然后就会丢掉最后一个字节,搞半天都是这样,郁闷
我用的是主机模式,I2S3,DMA1 数据流5 通道0,不知道有没有人遇到过

出0入0汤圆

 楼主| 发表于 2014-11-8 14:13:42 | 显示全部楼层
dudududu 发表于 2014-11-7 18:53
大侠们的I2S玩的怎样了,我的怎么出现了很诡异的事情,DMA轮流发送两个数组的内容给I2S,但是每次在切换数 ...

DMA的buffer 你会不会开得太小啊。

出0入0汤圆

发表于 2014-11-8 16:44:07 | 显示全部楼层
dreamc 发表于 2014-11-8 14:13
DMA的buffer 你会不会开得太小啊。

不会,我都开到十几kb了还是有问题,现在放歌的时候有声音了,但是有很大的间歇性噪声,噪声主要是就在两个buf切换时产生,如果buf开的很大,那么噪声间隔就长一点,buf开小了,噪声间隔就很密,有可能还是在切换buf的时候出现的错位神马的,郁闷

出0入0汤圆

 楼主| 发表于 2014-11-8 17:41:53 | 显示全部楼层
那你在DMA中断哪里加个LED翻转 示波器看下是不是DMA定时中断,不知道你代码 所以只能提供方法你参考下,有可能是dma的问题

出0入0汤圆

发表于 2014-11-15 18:43:42 | 显示全部楼层
看了一些I2S的实现方案,觉得单片机(STM32等)负责SD卡音频文件的读取,由FPGA等类似硬件电路实现WAV音频信号toI2S信号的转换,这样可以减少单片机工作量,尝试达到24bit/192KHz的处理能力。因此想试试Cypress的PSOC。

出0入0汤圆

 楼主| 发表于 2014-11-15 23:39:26 | 显示全部楼层
flywwind12 发表于 2014-11-15 18:43
看了一些I2S的实现方案,觉得单片机(STM32等)负责SD卡音频文件的读取,由FPGA等类似硬件电路实现WAV音频 ...

你试下SDIO DMA ->  I2S 可能能实现192K  24bit

出0入0汤圆

发表于 2019-7-3 19:28:38 | 显示全部楼层
老师你好,我刚注册花了80多支付宝,就是为了找您请教全双工的问题,请加我QQ12887536,13156899588微信同步,帮我解决问题,以现金酬谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 19:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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