STM32F767 I2S2 接收回来的数据不对
用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
}
补充一下,我是在STM32F767开发板上外挂的一个AD芯片,然后ARM的i2s2是从机接收模式,我看了一下,两个引脚的时钟都是对的。 一笔带过00 发表于 2017-9-1 14:15
补充一下,我是在STM32F767开发板上外挂的一个AD芯片,然后ARM的i2s2是从机接收模式,我看了一下,两个引脚 ...
有什么进展了吗? feelhyq 发表于 2017-9-5 22:56
有什么进展了吗?
用DMA接数据的,然后I2S是只能16位,而我的AD是24位的,书上说要接两次,那这个是说低16位也会触发DMA来接数据吗?
一笔带过00 发表于 2017-9-6 08:49
用DMA接数据的,然后I2S是只能16位,而我的AD是24位的,书上说要接两次,那这个是说低16位也会触发DMA来 ...
你可以这样,DMA设置成8位, 开启DMA传输后,24bit分3次传输就可以了,也就是你的DMA缓存 = 3 * 缓存大小 feelhyq 发表于 2017-9-6 08:56
你可以这样,DMA设置成8位, 开启DMA传输后,24bit分3次传输就可以了,也就是你的DMA缓存 = 3 * 缓存大小 ...
那也就是说I2S也要分成8位?我是想问一下,第一个8位过来的时候会触发RX置1,那么第二个8位过来会不会也置1。 一笔带过00 发表于 2017-9-6 09:03
那也就是说I2S也要分成8位?我是想问一下,第一个8位过来的时候会触发RX置1,那么第二个8位过来会不会也 ...
RX是什么,是I2S的寄存器吗?这个你都不用担心,DMA在传输的时候I2S的任何寄存器都不用care feelhyq 发表于 2017-9-6 09:06
RX是什么,是I2S的寄存器吗?这个你都不用担心,DMA在传输的时候I2S的任何寄存器都不用care ...
不是这么个意思,我用的是SPI接口配置成的I2S,所以他里面手册就是写的,数据格式是16位开始,其实我用16位接也没关系,I2S定义会把24位配置成32位,后面低8位补任何数据,然后我再对数据进行移位处理就好啦,但是问题就是I2S的数据寄存器是16位的。 I2S的数据寄存器 楼主,在I2S收发中,请问你是怎么同步主机与从机两边的时序的呢?
页:
[1]