最近想通过F429的SAI通过CS5381来读取信号,不过调试时候出现了下图的问题,然后DR也一直为0。我测试那四个引脚也都有波形输出(MCLK,SCK,LRCK,SD.A)
希望原子哥帮忙看看,是不是SAI的配置出现了问题。
这是主函数
[mw_shl_code=applescript,true]
#include "main.h"
#include "sai.h"
#include "stdio.h"
#include "74HC595.h"
int main (void)
{
uint32_t sai_value1[64]= {0};
// uint32_t sai_va1;
Config_595(); //595控制CS5381相关引脚
sai.config();
for(u8 i=0;i<65;i++) //数组填充0xff
{
sai_value1
=0xff;
}
for(u8 i=0;i<65;i++)
{
sai_value1=SAI1_Block_A->DR; //将SAI_DR存入数组,方便调试
for(u8 b=0;b<100;b++); //延时
}
while (1)
{
}
}
[/mw_shl_code]
然后下面是sai配置:
[mw_shl_code=applescript,true]# include "sai.h"
# include "stdio.h"
# include "stm32f4xx_sai.h"
# define DMA_SAI_Buffer_size 64
static void SAI_GPIO_Config(void);
static void SAI_Mode_Config(void);
static void SAI_Config(void);
SYS_SAI_T sai = {
.config = SAI_Config,
.gpio_config = SAI_GPIO_Config,
.mode_config = SAI_Mode_Config,
};
/*SAI配置*/
void SAI_Config(void)
{
sai.gpio_config();
sai.mode_config();
// sai.dma_config(DMA_SAI_Buffer1[0],DMA_SAI_Buffer2[0]);
//
}
/*ÅäÖÃSAI_GPIO*/
void SAI_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SAI1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
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_High_Speed;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource2, GPIO_AF_SAI1);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource3, GPIO_AF_SAI1);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_SAI1);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_SAI1);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_SAI1);
}
/*ÅäÖÃSAI_Mode*/
void SAI_Mode_Config(void)
{
SAI_InitTypeDef SAI_InitStructure;
SAI_FrameInitTypeDef SAI_FrameInitStructure;
SAI_SlotInitTypeDef SAI_SlotInitStructure;
RCC_AHB2PeriphClockCmd(RCC_APB2Periph_SAI1,ENABLE);
RCC_PLLSAIConfig(128,5,3);
//SAI1_Block_A设置
SAI_DeInit(SAI1);
SAI_InitStructure.SAI_AudioMode = SAI_Mode_MasterRx ; //主接收模式
SAI_InitStructure.SAI_Synchro = SAI_Asynchronous ; //异步
SAI_InitStructure.SAI_OUTDRIV = SAI_OutputDrive_Enabled; //使能输出
SAI_InitStructure.SAI_NoDivider = SAI_MasterDivider_Enabled; //使能分频
SAI_InitStructure.SAI_FIFOThreshold = SAI_FIFOThreshold_Full; //FIFO阈值
SAI_InitStructure.SAI_MasterDivider = 1; //MCLK_x = SAI_CK_x/(MCKDIV[3:0]*2)
SAI_InitStructure.SAI_Protocol = SAI_Free_Protocol ; //自由模式
SAI_InitStructure.SAI_DataSize = SAI_DataSize_24b ; //24位
SAI_InitStructure.SAI_FirstBit = SAI_FirstBit_MSB ; //第一位为:MSB
SAI_InitStructure.SAI_ClockStrobing = SAI_ClockStrobing_RisingEdge ; //数据时钟在上升沿选通
SAI_Init(SAI1_Block_A,&SAI_InitStructure);
//帧设置
SAI_FrameInitStructure.SAI_FrameLength = 64; //帧长度:64
SAI_FrameInitStructure.SAI_ActiveFrameLength = 32; //帧同步有效长度:32
SAI_FrameInitStructure.SAI_FSDefinition = I2S_FS_ChannelIdentification; //I2S
SAI_FrameInitStructure.SAI_FSPolarity = SAI_FS_ActiveLow; //低电平有效
SAI_FrameInitStructure.SAI_FSOffset = SAI_FS_BeforeFirstBit; //在slot0的第一位的前一位使能FS,匹配飞利浦标准
SAI_FrameInit(SAI1_Block_A,&SAI_FrameInitStructure);
//SLOT设置
SAI_SlotInitStructure.SAI_FirstBitOffset = 0; //偏移 : 0
SAI_SlotInitStructure.SAI_SlotSize = SAI_SlotSize_32b; //slot 大小:32位
SAI_SlotInitStructure.SAI_SlotNumber = 2; //2个
SAI_SlotInitStructure.SAI_SlotActive = SAI_SlotActive_0|SAI_SlotActive_1;//使能slot0 和slot1
SAI_SlotInit(SAI1_Block_A,&SAI_SlotInitStructure);
SAI_Cmd(SAI1_Block_A,ENABLE); //开启sai
RCC_PLLSAICmd(ENABLE);
}
[/mw_shl_code]
一周热门 更多>