OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3447|回复: 4

WM8960问题(有偿,1000元以下)

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-4-27
在线时间
0 小时
发表于 2020-4-27 11:15:36 | 显示全部楼层 |阅读模式
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éè&#214;&#195;&#206;aê&#228;è&#235;
    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();//·¢&#203;ínACK
    else
        IIC_Ack(); //·¢&#203;í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)); //è&#161;&#184;&#223;×&#214;&#189;ú
    tmp_L =(uint8_t) (dat&0x00FF); //è&#161;μí8×&#214;&#189;ú
   
   IIC_Start();                                                    //Master·¢&#203;í&#198;eê&#188;D&#197;o&#197;
    IIC_WriteByte(WM8960_IIC_ADDR);                                //Master·¢&#203;í′óéè±&#184;μ&#216;&#214;·
    if(IIC_Wait_Ack()==1) {return 1;}; //μè′y3&#172;ê±·μ&#187;&#216;1 failed
    IIC_WriteByte(tmp_H);                        //·¢&#203;íêy&#190;Y
    if(IIC_Wait_Ack()==1) {return 1;}; //μè′y3&#172;ê±·μ&#187;&#216;1 failed
    IIC_WriteByte(tmp_L);                        //·¢&#203;íêy&#190;Y
    if(IIC_Wait_Ack()==1) {return 1;}; //μè′y3&#172;ê±·μ&#187;&#216;1 failed
    IIC_Stop();    //·¢&#203;íí£&#214;1D&#197;o&#197;
    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;//&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//×óó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ê1&#196;üía2&#191;&#214;D&#182;&#207;í¨μà
  NVIC_Init(&NVIC_InitStructure);//&#197;&#228;&#214;&#195; */


       

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-4-28 01:28:11 | 显示全部楼层
想要 外快的可以联系楼主哦
回复

使用道具 举报

0

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
金钱
376
注册时间
2019-5-8
在线时间
46 小时
发表于 2020-4-28 08:06:40 | 显示全部楼层
main没有死循环,执行完main后就跑飞了
回复

使用道具 举报

0

主题

130

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1868
金钱
1868
注册时间
2016-10-23
在线时间
261 小时
发表于 2020-4-28 10:33:16 | 显示全部楼层
楼主是用DMA iis送一段数据 到 wm8960 测试 dma方式,不用主循环,,,可惜我手头上没有硬件,要不然可以调下
6年嵌入式老玩家 深圳
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2017-12-3
在线时间
32 小时
发表于 2020-4-29 09:18:25 | 显示全部楼层
main没有死循环,导致程序跑飞,DMA也遭殃了,所以没有声音
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-2 02:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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