打印
[STM32]

STM32F767 I2S2 接收回来的数据不对

[复制链接]
2712|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一笔带过00|  楼主 | 2017-9-1 14:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用SPI2改成I2S2协议,ARM做从机,而且ws和sclk都是外部AD(24bit)提供,采样频率为48k,采回来的数据是个乱的,是不是我配置不对啊。求各位大神看一下
void I2S2_Init(void)
{               
        __HAL_RCC_SPI2_CLK_ENABLE();                        //³õʼ»¯SPI2ʱÖÓ
        __HAL_I2S_DISABLE(&HI2S_Handler);
        HI2S_Handler.Instance=SPI2;
       //HI2S_Handler.Init.MCLKOutput=I2S_MCLKOUTPUT_DISABLE;   
       HI2S_Handler.Init.Mode=I2S_MODE_SLAVE_RX;             //´Ó»ú½ÓÊÕ¹¤×÷ģʽ
       HI2S_Handler.Init.Standard=I2S_STANDARD_PHILIPS;      //I2S·ÉÀûÆÖ±ê×¼
       HI2S_Handler.Init.DataFormat=I2S_DATAFORMAT_24B;      //Êý¾Ý³¤¶È24λ
       HI2S_Handler.Init.MCLKOutput=I2S_MCLKOUTPUT_DISABLE;          //´Ó»ú¹Ø±ÕMCLKʱÖÓ
       HI2S_Handler.Init.AudioFreq=I2S_AUDIOFREQ_48K;        //ÒôƵ²ÉÑùƵÂÊ  48k
       HI2S_Handler.Init.CPOL=I2S_CPOL_LOW;                  //¼«ÐÔ  Ï½µÑØ
       HI2S_Handler.Init.ClockSource=I2S_CLOCK_EXTERNAL;       //ʱÖÓÓÉÍⲿÌṩ
       HI2S_Handler.State=HAL_I2S_STATE_RESET;                 //״̬±ê־λ
        if(HAL_I2S_GetState(&HI2S_Handler)==HAL_I2S_STATE_RESET)
        {
                HAL_I2S_MspInit(&HI2S_Handler);
        }
        HAL_I2S_Init(&HI2S_Handler);                            //³õʼ»¯IIS
       //I2S2_DMA_Enable();                                    //ʹÄÜSPIµÄDMA¹¦ÄÜ       
        __HAL_I2S_ENABLE(&HI2S_Handler);                        //ʹÄÜI2S2       
}

//I2S2Òý½Å¸´Óóõʼ»¯
void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s)
{
        GPIO_InitTypeDef GPIO_Initure1;
       
        __HAL_RCC_GPIOB_CLK_ENABLE(); //³õʼ»¯GPIOBʱÖÓ

       
        GPIO_Initure1.Pin=GPIO_PIN_9|GPIO_PIN_13|GPIO_PIN_15;   //PB9,PB13,PB15
        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;                  //¸´ÓÃΪSPI2

        HAL_GPIO_Init(GPIOB,&GPIO_Initure1);                          //³õʼ»¯PB9/PB13/PB15
}

相关帖子

沙发
一笔带过00|  楼主 | 2017-9-1 14:15 | 只看该作者
补充一下,我是在STM32F767开发板上外挂的一个AD芯片,然后ARM的i2s2是从机接收模式,我看了一下,两个引脚的时钟都是对的。

使用特权

评论回复
板凳
feelhyq| | 2017-9-5 22:56 | 只看该作者
一笔带过00 发表于 2017-9-1 14:15
补充一下,我是在STM32F767开发板上外挂的一个AD芯片,然后ARM的i2s2是从机接收模式,我看了一下,两个引脚 ...

有什么进展了吗?

使用特权

评论回复
地板
一笔带过00|  楼主 | 2017-9-6 08:49 | 只看该作者
feelhyq 发表于 2017-9-5 22:56
有什么进展了吗?

用DMA接数据的,然后I2S是只能16位,而我的AD是24位的,书上说要接两次,那这个是说低16位也会触发DMA来接数据吗?

使用特权

评论回复
5
feelhyq| | 2017-9-6 08:56 | 只看该作者
一笔带过00 发表于 2017-9-6 08:49
用DMA接数据的,然后I2S是只能16位,而我的AD是24位的,书上说要接两次,那这个是说低16位也会触发DMA来 ...

你可以这样,DMA设置成8位, 开启DMA传输后,24bit分3次传输就可以了,也就是你的DMA缓存 = 3 * 缓存大小

使用特权

评论回复
6
一笔带过00|  楼主 | 2017-9-6 09:03 | 只看该作者
feelhyq 发表于 2017-9-6 08:56
你可以这样,DMA设置成8位, 开启DMA传输后,24bit分3次传输就可以了,也就是你的DMA缓存 = 3 * 缓存大小 ...

那也就是说I2S也要分成8位?我是想问一下,第一个8位过来的时候会触发RX置1,那么第二个8位过来会不会也置1。

使用特权

评论回复
7
feelhyq| | 2017-9-6 09:06 | 只看该作者
一笔带过00 发表于 2017-9-6 09:03
那也就是说I2S也要分成8位?我是想问一下,第一个8位过来的时候会触发RX置1,那么第二个8位过来会不会也 ...

RX是什么,是I2S的寄存器吗?这个你都不用担心,DMA在传输的时候I2S的任何寄存器都不用care

使用特权

评论回复
8
一笔带过00|  楼主 | 2017-9-6 09:17 | 只看该作者
feelhyq 发表于 2017-9-6 09:06
RX是什么,是I2S的寄存器吗?这个你都不用担心,DMA在传输的时候I2S的任何寄存器都不用care ...

不是这么个意思,我用的是SPI接口配置成的I2S,所以他里面手册就是写的,数据格式是16位开始,其实我用16位接也没关系,I2S定义会把24位配置成32位,后面低8位补任何数据,然后我再对数据进行移位处理就好啦,但是问题就是I2S的数据寄存器是16位的。

使用特权

评论回复
9
CHLDZKJ| | 2017-9-6 11:50 | 只看该作者
I2S的数据寄存器

使用特权

评论回复
10
monty·feng| | 2018-8-21 09:39 | 只看该作者
楼主,在I2S收发中,请问你是怎么同步主机与从机两边的时序的呢?

使用特权

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

本版积分规则

9

主题

35

帖子

0

粉丝