查看: 200|回复: 8
收起左侧

[STM32] STM32F767 I2S2 接收回来的数据不对

[复制链接]
     

5

主题

29

帖子

81

积分

初级技术员

 楼主| 发表于 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
}

     

5

主题

29

帖子

81

积分

初级技术员

 楼主| 发表于 2017-9-1 14:15 | 显示全部楼层 |返回版面
补充一下,我是在STM32F767开发板上外挂的一个AD芯片,然后ARM的i2s2是从机接收模式,我看了一下,两个引脚的时钟都是对的。
      

4

主题

799

帖子

2440

积分

初级工程师

发表于 2017-9-5 22:56 | 显示全部楼层 |返回版面
一笔带过00 发表于 2017-9-1 14:15
补充一下,我是在STM32F767开发板上外挂的一个AD芯片,然后ARM的i2s2是从机接收模式,我看了一下,两个引脚 ...

有什么进展了吗?
     

5

主题

29

帖子

81

积分

初级技术员

 楼主| 发表于 2017-9-6 08:49 | 显示全部楼层 |返回版面
feelhyq 发表于 2017-9-5 22:56
有什么进展了吗?

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

4

主题

799

帖子

2440

积分

初级工程师

发表于 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 * 缓存大小
     

5

主题

29

帖子

81

积分

初级技术员

 楼主| 发表于 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。
      

4

主题

799

帖子

2440

积分

初级工程师

发表于 2017-9-6 09:06 | 显示全部楼层 |返回版面
一笔带过00 发表于 2017-9-6 09:03
那也就是说I2S也要分成8位?我是想问一下,第一个8位过来的时候会触发RX置1,那么第二个8位过来会不会也 ...

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

5

主题

29

帖子

81

积分

初级技术员

 楼主| 发表于 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位的。
      

0

主题

40

帖子

107

积分

中级技术员

发表于 2017-9-6 11:50 | 显示全部楼层 |返回版面
I2S的数据寄存器
亿配芯城YIBEIIC.COM一家专业做电子元器件配单的商城
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

关闭

热门推荐上一条 /2 下一条

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