新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2020-4-27
- 在线时间
- 0 小时
|
1金钱
我用的STM32F429,要求很简单,就是把一段很短的音频文件(18KB)用const内置在程序里面,用软件IIC配置WM8960(配置信息都有),然后再用IIS-DMA形式往WM8960传数据就可以了。但是我编完了程序,死活放不出来。找到问题的麻烦加下我QQ315324320,解决了给1000,谢谢。
const uint16_t data[]={0}; //这里根据需要放音频文件
int main(void)
{
uint32_t wavetotal;
uint32_t i;
wavetotal=sizeof(music)/2;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
IIC_Init();
WM8960_Set_Play_Recorde_Reg();
IIS_GPIO_Init();
IIS_Init();
IIS_DMA_Init((uint16_t*)music,wavetotal);
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
DMA_Cmd(DMA1_Stream4,ENABLE);
I2S_Cmd(SPI2, ENABLE);
}
void delay_us(uint32_t us)
{
uint32_t i;
i = us * 20;
for(; i != 0; i--);
}
//3õê¼»ˉIIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ê1ÄüGPIOBê±Öó
//GPIOB8,B93õê¼»ˉéèÖÃ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ÆÕí¨êä3öÄ£ê½
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//íÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//éÏà-
GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉ
IIC_SCL=1;
IIC_SDA=1;
}
//2úéúIICÆeê¼DÅoÅ
void IIC_Start(void)
{
SDA_OUT(); //sdaÏßêä3ö
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//ÇˉסI2C×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
}
//2úéúIICí£Ö1DÅoÅ
void IIC_Stop(void)
{
SDA_OUT();//sdaÏßêä3ö
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//·¢ËíI2C×üÏß½áêøDÅoÅ
delay_us(4);
}
//μè′yó|′eDÅoÅμ½à′
//·μ»ØÖμ£o1£¬½óêÕó|′eê§°ü
// 0£¬½óêÕó|′e3é1|
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDAéèÖÃÎaêäèë
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//ê±Öóêä3ö0
return 0;
}
//2úéúACKó|′e
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//2»2úéúACKó|′e
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_WriteByte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//à-μíê±Öó¿aê¼êy¾Y′«êä
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2); //
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDAéèÖÃÎaêäèë
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();//·¢ËínACK
else
IIC_Ack(); //·¢ËíACK
return receive;
}
uint8_t WM8960_Write_Reg(uint8_t reg, uint16_t dat)
{
uint8_t tmp_H;
uint8_t tmp_L;
tmp_H =(uint8_t) (reg<<1)|((uint8_t) ((dat>>8)&0x0001)); //衸ß×Ö½ú
tmp_L =(uint8_t) (dat&0x00FF); //è¡μí8×Ö½ú
IIC_Start(); //Master·¢ËíÆeê¼DÅoÅ
IIC_WriteByte(WM8960_IIC_ADDR); //Master·¢Ëí′óé豸μØÖ·
if(IIC_Wait_Ack()==1) {return 1;}; //μè′y3¬ê±·μ»Ø1 failed
IIC_WriteByte(tmp_H); //·¢Ëíêy¾Y
if(IIC_Wait_Ack()==1) {return 1;}; //μè′y3¬ê±·μ»Ø1 failed
IIC_WriteByte(tmp_L); //·¢Ëíêy¾Y
if(IIC_Wait_Ack()==1) {return 1;}; //μè′y3¬ê±·μ»Ø1 failed
IIC_Stop(); //·¢Ëíí£Ö1DÅoÅ
return 0;
}
uint8_t WM8960_Set_Play_Recorde_Reg(void)
{
uint8_t res;
//Reset Device
res = WM8960_Write_Reg(0x0f, 0x0000);
if(res != 0)
return res;
else
//Set Power Source
res = WM8960_Write_Reg(0x19, 1<<8 | 1<<7 | 1<<6);
res += WM8960_Write_Reg(0x1A, 1<<8 | 1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<3);
res += WM8960_Write_Reg(0x2F, 1<<3 | 1<<2);
if(res != 0) {
return res;
}
//Configure clock
//MCLK->div1->SYSCLK->DAC/ADC sample Freq = 25MHz(MCLK)/2*256 = 48.8kHz
WM8960_Write_Reg(0x04, 0x0000);
//Configure ADC/DAC
WM8960_Write_Reg(0x05, 0x0000);
//Configure audio interface
//I2S format 16 bits word length
WM8960_Write_Reg(0x07, 0x0002);
//Configure HP_L and HP_R OUTPUTS
WM8960_Write_Reg(0x02, 0x00F | 0x0100); //LOUT1 Volume Set
WM8960_Write_Reg(0x03, 0x006F | 0x0100); //ROUT1 Volume Set
//Configure SPK_RP and SPK_RN
WM8960_Write_Reg(0x28, 0x0070 | 0x0100); //Left Speaker Volume
WM8960_Write_Reg(0x29, 0x0070 | 0x0100); //Right Speaker Volume
//Enable the OUTPUTS
WM8960_Write_Reg(0x31, 0x00F7); //Enable Class D Speaker Outputs
//Configure DAC volume
WM8960_Write_Reg(0x0a, 0x00FF | 0x0100);
WM8960_Write_Reg(0x0b, 0x00FF | 0x0100);
//3D
// WM8960_Write_Reg(0x10, 0x001F);
//Configure MIXER
WM8960_Write_Reg(0x22, 1<<8 | 1<<7);
WM8960_Write_Reg(0x25, 1<<8 | 1<<7);
//Jack Detect
WM8960_Write_Reg(0x18, 1<<6 | 0<<5);
WM8960_Write_Reg(0x17, 0x01C3);
WM8960_Write_Reg(0x30, 0x0009);//0x000D,0x0005
return 0;
}
void IIS_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//
GPIO_Init(GPIOB, &GPIO_InitStructure);//
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2);//PB12, I2S_LRCK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);//PB13 I2S_SCLK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);//PB15 I2S_SD
}
void IIS_Init(void)
{
I2S_InitTypeDef I2S_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
// RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //
// RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//
SPI_I2S_DeInit(SPI2);
I2S_InitStructure.I2S_Mode=I2S_Mode_MasterTx;
I2S_InitStructure.I2S_Standard=I2S_Standard_Phillips;
I2S_InitStructure.I2S_DataFormat=I2S_DataFormat_16b;
I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;
I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_8k;
I2S_InitStructure.I2S_CPOL=I2S_CPOL_Low;
I2S_Init(SPI2,&I2S_InitStructure);
}
void IIS_DMA_Init(uint16_t* address, uint32_t num)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}
DMA_InitTypeDef DMA_InitStructure;
//NVIC_InitTypeDef NVIC_InitStructure;
DMA_DeInit(DMA1_Stream4);
DMA_InitStructure.DMA_Channel = DMA_Channel_0; //
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI2->DR;//
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)address;//
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//
DMA_InitStructure.DMA_BufferSize = num;//
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//
DMA_Init(DMA1_Stream4, &DMA_InitStructure);//
//DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
/*NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//ÇàÕ¼óÅÏè¼¶0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//×óóÅÏè¼¶0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ê1Äüía2¿ÖD¶Ïí¨μà
NVIC_Init(&NVIC_InitStructure);//ÅäÖÃ */
|
|