新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2021-9-18
- 在线时间
- 7 小时
|
1金钱
我现在配置i2s为从模式发送,时钟外部提供,但是发送数据示波器一直看不到数据,不知道是配置问题还是其他原因,配置为主模式发送没问题,从模式一直不行
配置代码:
void I2Sx_Mode_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2S_InitTypeDef I2S_InitStructure;
/* 打开 I2S2 APB1 时钟 */
BSP_PeriphEn(BSP_PERIPH_ID_SPI2EN);
BSP_PeriphEn(BSP_PERIPH_ID_IOPBEN);
// GPIO_PinAFConfig(I2S_PORT, GPIO_PinSource12,GPIO_AF_0);
//GPIO_PinAFConfig(I2S_PORT, GPIO_PinSource13,GPIO_AF_0);
GPIO_PinAFConfig(I2S_PORT, GPIO_PinSource14,GPIO_AF_0);
//浮空输入
GPIO_InitStructure.GPIO_Pin = I2S_CK_PIN|I2S_WS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(I2S_PORT, &GPIO_InitStructure);
//发送器,推免复用输出
GPIO_InitStructure.GPIO_Pin = I2S_SD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(I2S_PORT, &GPIO_InitStructure);
SPI_I2S_DeInit(SPI2);
/* I2S2 外设配置 */
I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveTx; //从模式发送
I2S_InitStructure.I2S_Standard = I2S_Standard_LSB ; //接口标准
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_32b; //数据格式,16bit
I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; //主时钟模式
I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq_48k; //音频采样频率
I2S_InitStructure.I2S_CPOL = I2S_CPOL_High;
I2S_Init(SPI2, &I2S_InitStructure);
//SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_TXE, ENABLE);
I2S_Cmd(SPI2, ENABLE); //使能 SPI2/I2S2 外设
SPI_I2S_SendData16(SPI2, 0XAABB);//SPI发送字节
}
//DMA配置
void DMA_Configuration_I2S(u16 bufsize)
{
//SPI2_RX--Channel4 SPI2_TX--Channel5
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)I2S_DR_Addr;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)I2S_Buffer_Tx;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//DMA传输方向为读内存写外设
DMA_InitStructure.DMA_BufferSize = bufsize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //优先权为中等
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
// DMA_ITConfig(DMA1_Channel4,DMA_CCR_HTIE, ENABLE); //使能后为中断方式
// DMA_ITConfig(DMA1_Channel5,DMA_CCR_TCIE, ENABLE); //传输完成中断,
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
BSP_IntVectSet(BSP_INT_ID_DMA_CH4_5_6_7,DMA1_Channel5_IRQn);
BSP_IntEn(BSP_INT_ID_DMA_CH4_5_6_7);
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC, ENABLE); //使能传输完成中断
DMA_Cmd(DMA1_Channel5,ENABLE); //启动传输
}
不使用dma的时候发送函数使用循环检测SPI_I2S_FLAG_TXE
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);//判断是否发送完成
SPI_I2S_SendData16(SPI2, 0XAABB);
|
|