137 lines
3.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}