OpenEdv-开源电子网

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

音频DAC cs4344 驱动不起来,求助

[复制链接]

39

主题

137

帖子

3

精华

高级会员

Rank: 4

积分
802
金钱
802
注册时间
2012-9-21
在线时间
31 小时
发表于 2014-7-31 22:05:58 | 显示全部楼层 |阅读模式
5金钱
自己弄了个cs4344的DAC 模块,用f4的I2S dma,发现连中断都进不了,不知道哪里出问题,请各位高手帮忙看看。

这个是cs4344的原理图,我测了一下,I2S的管脚和F4的都是通的,电源也没问题。



这个是驱动程序:
#include "CS4344.h"
DMA_InitTypeDef DMA_InitStructure;
u32 AudioTotalSize=0xFFFF; 
u32 AudioRemSize  =0; 
u16 *CurrentPos;           

extern void AUDIO_TransferComplete(u32 pBuffer, uint32_t Size);
void AUDIO_Init(u32 AudioFreq)
{
I2S_GPIO_Init();
Audio_I2S_Init(AudioFreq);
Audio_DMA_Init();
}

void I2S_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13 | GPIO_Pin_15 ;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); 
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOC, &GPIO_InitStructure);   
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_SPI2); 


}

void Audio_I2S_Init(uint32_t AudioFreq)
{
  I2S_InitTypeDef I2S_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  SPI_I2S_DeInit(SPI2);
  /* I2S peripheral configuration */
  I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips;
  I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;
  I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Enable;
  I2S_InitStructure.I2S_AudioFreq = AudioFreq;
  I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
  I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx;
  I2S_Init(SPI2, &I2S_InitStructure);
  //I2S_Cmd(SPI2, ENABLE);

}

void Audio_DMA_Init(void)  

  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); 
  DMA_Cmd(DMA1_Stream4, DISABLE);
  DMA_DeInit(DMA1_Stream4);
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4000380C;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = (uint32_t)0xFFFE;
  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_Normal; 
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  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 = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);   
  SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
}



uint32_t AUDIO_Play(u16* pBuffer, u32 Size)
{
  AudioTotalSize=Size; 
  Audio_MAL_Play((u32)pBuffer,(u32)(DMA_MAX(Size/4)));
  AudioRemSize=(Size/2)-DMA_MAX(AudioTotalSize);
  CurrentPos=pBuffer+DMA_MAX(AudioTotalSize);
  return 0;
}


void Audio_MAL_Play(u32 Addr, u32 Size)
{     
  
  DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)Addr;
  DMA_InitStructure.DMA_BufferSize=(uint32_t)Size/2;
  DMA_Init(DMA1_Stream4,&DMA_InitStructure);
  DMA_Cmd(DMA1_Stream4,ENABLE);  
  if ((SPI2->I2SCFGR & I2S_ENABLE_MASK)==0)I2S_Cmd(SPI2,ENABLE);
}


void SPI2_IRQHandler(void)
{


  if (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)!=RESET)
  {    
    SPI_I2S_SendData(SPI2, 0);
  }
}


void DMA1_Stream4_IRQHandler(void)
{    

  if (DMA_GetFlagStatus(DMA1_Stream4, DMA_FLAG_TCIF4)!=RESET)
  {         
    if (AudioRemSize>0)
    {   
      while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE);
      DMA_ClearFlag(DMA1_Stream4, DMA_FLAG_TCIF4); 
      DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) CurrentPos;
      DMA_InitStructure.DMA_BufferSize = (uint32_t) (DMA_MAX(AudioRemSize));            
      DMA_Init(DMA1_Stream4, &DMA_InitStructure);
      DMA_Cmd(DMA1_Stream4, ENABLE);    
      CurrentPos += DMA_MAX(AudioRemSize);
      AudioRemSize -= DMA_MAX(AudioRemSize);
      DMA_Cmd(DMA1_Stream4, ENABLE); 
    }
    else
    {
      DMA_Cmd(DMA1_Stream4, DISABLE);   
      DMA_ClearFlag(DMA1_Stream4, DMA_FLAG_TCIF4);       
      AUDIO_TransferComplete((uint32_t)CurrentPos, 0);       
    }
  }
}









最佳答案

查看完整内容[请看2#楼]

参考龙源的代码:http://www.openedv.com/posts/list/5143.htm 有CS4334的.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-31 22:05:59 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 16:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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