137 lines
3.2 KiB
C
137 lines
3.2 KiB
C
#include "stm32h743i_eval_audio.h"
|
||
#include "usbd_audio_if.h"
|
||
#include "usbd_audio.h"
|
||
#include "sai.h"
|
||
#include "es8388.h"
|
||
#include "sai.h"
|
||
#include "usart.h"
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
|
||
//ALIENTEK STM32H7开发板
|
||
//USB声卡底层接口函数 驱动代码
|
||
//正点原子@ALIENTEK
|
||
//技术论坛:www.openedv.com
|
||
//创建日期:2019/5/17
|
||
//版本:V1.0
|
||
//版权所有,盗版必究。
|
||
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
|
||
//All rights reserved
|
||
//*******************************************************************************
|
||
//修改信息
|
||
//无
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
|
||
u8 volume=0; //当前音量
|
||
extern u8 usbd_audio_dataout_en; //USB数据输出状态,在usbd_audio.c里面定义
|
||
|
||
//音频数据SAI DMA传输回调函数
|
||
void audio_sai_dma_callback(void)
|
||
{
|
||
BSP_AUDIO_OUT_TransferComplete_CallBack(); //执行回调函数,更新数据
|
||
}
|
||
|
||
//配置音频接口
|
||
//OutputDevice:输出设备选择,未用到.
|
||
//Volume:音量大小,0~100
|
||
//AudioFreq:音频采样率
|
||
uint8_t BSP_AUDIO_OUT_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq)
|
||
{
|
||
ES8388_I2S_Cfg(0,3); //飞利浦标准,16位数据长度
|
||
SAIA_Init(0,1,4); //设置SAI,主发送,16位数据
|
||
SAIA_SampleRate_Set(AudioFreq); //设置采样率
|
||
BSP_AUDIO_OUT_SetVolume(Volume);//设置音量
|
||
sai_tx_callback=audio_sai_dma_callback; //回调函数指向audio_sai_dma_callback
|
||
printf("EVAL_AUDIO_Init:%d,%d\r\n",Volume,AudioFreq);
|
||
return 0;
|
||
}
|
||
|
||
//开始播放音频数据
|
||
//pBuffer:音频数据流首地址指针
|
||
//Size:数据流大小(单位:字节)
|
||
uint8_t BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint32_t Size)
|
||
{
|
||
SAIA_TX_DMA_Init((u8*)pBuffer,0,Size/2,1); //配置TX DMA,16位
|
||
DMA2_Stream3->CR&=~(1<<8); //单次模式
|
||
DMA2_Stream3->CR&=~(1<<18); //改成单缓冲模式
|
||
SAI_Play_Start(); //开启DMA
|
||
printf("EVAL_AUDIO_Play:%x,%d\r\n",pBuffer,Size);
|
||
return 0;
|
||
}
|
||
|
||
//切换音频数据流buffer,每次DMA中断完成会调用该函数
|
||
//Addr:音频数据流缓存首地址
|
||
//Size:音频数据流大小(单位:harf word,也就是2个字节)
|
||
void BSP_AUDIO_OUT_ChangeBuffer(uint16_t *pData, uint16_t Size)
|
||
{
|
||
if(usbd_audio_dataout_en==1) //USB有音频数据输出
|
||
{
|
||
usbd_audio_dataout_en=0; //清除标记位
|
||
}else if(usbd_audio_dataout_en==0) //没有收到任何数据,全部填充0
|
||
{
|
||
mymemset(pData,0,AUDIO_TOTAL_BUF_SIZE);
|
||
usbd_audio_dataout_en=2; //标记已经清零了buffer,停止数据输出
|
||
}
|
||
if(Size!=AUDIO_TOTAL_BUF_SIZE)
|
||
{
|
||
//printf("chgbuf:%x,%d\r\n",pData,Size);//想观察数据,可以printf,但是会有轻微的音箱音质
|
||
}
|
||
DMA2_Stream3->CR&=~(1<<0); //关闭DMA传输
|
||
while(DMA2_Stream3->CR&0X1); //确保DMA可以被设置
|
||
DMA2_Stream3->NDTR=Size/2; //DMA 存储器0地址
|
||
DMA2_Stream3->CR|=1<<0; //开启DMA传输
|
||
}
|
||
|
||
//停止播放
|
||
//Option:控制参数,1/2,详见:CODEC_PDWN_HW定义
|
||
//返回值:0,成功
|
||
// 其他,设置失败
|
||
uint8_t BSP_AUDIO_OUT_Stop(uint32_t Option)
|
||
{
|
||
printf("EVAL_AUDIO_Stop:%d\r\n",Option);
|
||
return 0;
|
||
}
|
||
|
||
//音量设置
|
||
//Volume:0~100
|
||
//返回值:0,成功
|
||
// 其他,设置失败
|
||
uint8_t BSP_AUDIO_OUT_SetVolume(uint8_t Volume)
|
||
{
|
||
volume=Volume;
|
||
ES8388_HPvol_Set(volume*0.3);
|
||
ES8388_SPKvol_Set(volume*0.3);
|
||
return 0;
|
||
}
|
||
|
||
//静音设置
|
||
//cmd:0,不静音; 1,静音
|
||
//返回值:0,成功
|
||
// 其他,设置失败
|
||
uint8_t BSP_AUDIO_OUT_SetMute(uint32_t Cmd)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|