找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5768|回复: 0
打印 上一主题 下一主题
收起左侧

麦克风驱动(XF6000)

[复制链接]
跳转到指定楼层
楼主
ID:51024 发表于 2014-8-3 00:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                                                                                                

/***********************************************************
*****************This is "ycc_mike.h" File************
***********************************************************/
#ifndef __YCC_MIKE_H
#define __YCC_MIKE_H


#ifdef  YCC_MIKE_GLOBALS
#define YCC_MIKE_EXT
#else
#define YCC_MIKE_EXT  extern
#endif
#define MODULE_RC_I2C_FIRST        -2048
#define UNREFERENCED_PARAMETER(P)      {(P) = (P);}
#define MODULE_I2C_CTRL_FIRST        (0x00)
#define IV_I2C_CMD_CTRL        (0x0048)
#define IVNR_CMD_SET_NR_OUTPUT   CMD_SET(IVNR_CMD_NR_OUTPUT)


typedef enum IvnrI2CCmdTypeTag {
IV_I2C_CMD_STANDBY_CMD = MODULE_I2C_CTRL_FIRST - 1,
IV_I2C_CMD_FUNC_PASSBY = 0x00,
IV_I2C_CMD_FUNC_NR = 0x01,
IV_I2C_CMD_FUNC_AECS_PH = 0x02,
IV_I2C_CMD_FUNC_AECS_WK = 0x03,
IV_I2C_CMD_WK_INSIDE = 0x04,
IV_I2C_CMD_WK_SIGN= 0x05,
IV_I2C_CMD_GET_RET = 0x06,
IV_I2C_CMD_GET_FUNC = 0x07,
IV_I2C_CMD_WK_ID = 0x08,
IV_I2C_CMD_AEC_RIGHT_OUTPUT = 0x09,
IV_I2C_CMD_GET_VERSION = 0x0A,
IV_I2C_CMD_WORK_MODE = 0x0B,
IV_I2C_CMD_END = 0x0C
} IvnrI2CCmdType;


typedef enum IvnrI2CRetTypeTag {
IV_I2C_RET_ACK_CMD = MODULE_RC_I2C_FIRST - 4,
IV_I2C_RET_NOSUPPORT = MODULE_RC_I2C_FIRST -3,
IV_I2C_RET_UNKNOW = MODULE_RC_I2C_FIRST -2,
IV_I2C_RET_BUSY = MODULE_RC_I2C_FIRST -1,
IV_I2C_RET_SUCCESS_STANDBY = 0x00,
} IvnrI2CRetType;
typedef enum
{
OUTPUT_FORMAT_ANALOG        = 0x1,
OUTPUT_FORMAT_DIGITAL        = 0x2,
OUTPUT_FORMAT_NULL        = 0x3,
} cmd_output_format_id;
typedef enum
{
WORK_MODE_PERIPHERAL        = 0x1,
WORK_MODE_TOPLIGHT        = 0x2,
WORK_MODE_HOST        = 0x3
} cmd_work_mode_id;
typedef enum
{
FUNC_MODE_PASSBY        = 0x0,        //所有功能关闭直接录音
FUNC_MODE_NOISECLEAN        = 0x1,        //降噪功能
FUNC_MODE_PHONE        = 0x2,        //通话回声消除功能
FUNC_MODE_WAKEUP        = 0x3,        //唤醒回声消除功能
} cmd_func_id;
typedef enum
{
DAC_GAIN_N23          = 34,        //-23        dB
DAC_GAIN_N22          = 35,        //-22        dB
DAC_GAIN_N21          = 36,        //-21        dB
DAC_GAIN_N20          = 37,        //-20        dB
DAC_GAIN_N19          = 38,        //-19        dB
DAC_GAIN_N18          = 39,        //-18        dB
DAC_GAIN_N17          = 40,        //-17        dB
DAC_GAIN_N16          = 41,        //-16        dB
DAC_GAIN_N15          = 42,        //-15        dB
DAC_GAIN_N14          = 43,        //-14        dB
DAC_GAIN_N13          = 44,        //-13        dB
DAC_GAIN_N12          = 45,        //-12        dB
DAC_GAIN_N11          = 46,        //-11        dB
DAC_GAIN_N10          = 47,        //-10        dB
DAC_GAIN_N09          = 48,        //-9        dB
DAC_GAIN_N08          = 49,        //-8        dB
DAC_GAIN_N07          = 50,        //-7        dB        default
DAC_GAIN_N06          = 51,        //-6        dB
DAC_GAIN_N05          = 52,        //-5        dB
DAC_GAIN_N04          = 53,        //-4        dB
DAC_GAIN_N03          = 54,        //-3        dB
DAC_GAIN_N02          = 55,        //-2        dB
DAC_GAIN_N01          = 56,        //-1        dB
DAC_GAIN_000          = 57,        // 0        dB
DAC_GAIN_001          = 58,        //+1        dB
DAC_GAIN_002          = 59,        //+2        dB
DAC_GAIN_003          = 60,        //+3        dB
DAC_GAIN_004          = 61,        //+4        dB  麦克风模组,顶灯模式
DAC_GAIN_005          = 62,        //+5        dB
DAC_GAIN_006_MAX      = 63        //+6        dB
} cmd_dac_gain_id;
#define CMD_SET(item)   ((item) & ~0x0100)
#define CMD_GET(item)   ((item) |  0x0100)
#define CMD_MASK        (~(CMD_SET(0)|CMD_GET(0)))
#define CMD_ITEM(cmd)   ((cmd) & CMD_MASK)
#define CMD_REPLY 1
#define mkword(reg, val)        ((val >> 8) | (reg << 1) | ((val & 0xFF) << 8))
#define GET_APP_ID(app_module_id)    ((app_module_id)&~0xFF)
#define GET_MODULE_ID(app_module_id) ((app_module_id)& 0xFF)
#define APP_ID(a,b,c,d) (uint32_t)(((uint32_t)((a)-0x20)<<8)| \
                                   ((uint32_t)((b)-0x20)<<14)| \
  ((uint32_t)((c)-0x20)<<20)| \
  ((uint32_t)((d)-0x20)<<26))
#define APP_ID_SOS  APP_ID('S','O','S',' ')
#define APP_ID_CTRL APP_ID('C','T','R','L')
#define APP_ID_STRM APP_ID('S','T','R','M')
#define APP_ID_CAPT APP_ID('C','A','P','T')
#define APP_ID_GVAD APP_ID('G','V','A','D')
#define APP_ID_PLBK APP_ID('P','L','B','K')
#define APP_ID_BROADCAST     0xFFFFFF00 // to broadcast commands to all apps


// Reserved module IDs
#define MODULE_ID_APP        0    // to send commands to the app
#define MODULE_ID_BROADCAST  0xFF // to broadcast commands to all modules
#define Q8_23(v) ((v) << 23)




typedef enum {
capt_input_mic   =  1,
capt_nr          =  2,
capt_output      =  3
} CaptModuleId;


#define mic_to_capt        0
#define capt_to_host        1
#define capt_to_i2s        1
#define capt_to_i2sf        1
#define i2sf_to_plbk        2
#define plbk_to_i2s        3


typedef enum {
MODULE_APP_CMD_RESERVED        =0,
MODULE_APP_MODULE_CREATE       =1,
MODULE_APP_ROUTE_SIGNAL        =2,
MODULE_APP_EXECUTION_ORDER     =4,
MODULE_APP_STRUCT_INT16_SIZE_OF=5,
MODULE_APP_RATE                =6,
MODULE_APP_INIT_APP            =7,
MODULE_APP_SCRATCH_PARAMS      =8,
MODULE_APP_MODULES_HEADER      =9,
MODULE_APP_MODULE_CONNECTIONS  =10,
MODULE_APP_FULL_CONFIG         =11,
MODULE_APP_RESTORE_APP         =12,
MODULE_APP_SCRATCH_PTR         =13,
MODULE_APP_LOGGING_INIT        =15,
MODULE_APP_LOGGING_ENABLE      =16,
MODULE_APP_HEAP_CHECK          =17,
MODULE_APP_FRAME_CYCLES        =18
} ModuleAppCmd;


typedef enum {
MODULE_CMD_RESERVED               = 0x0000,
MODULE_CMD_STRUCT_INT16_SIZE_OF   = 0x0001,
MODULE_CMD_INIT_DATA              = 0x0002,
MODULE_CMD_EXTRA_INT16_SIZE_OF    = 0x0003,
MODULE_CMD_INITIALIZE             = 0x0004,
MODULE_CMD_CLEAR_STATE            = 0x0005,
MODULE_CMD_DEFAULT_CONFIG         = 0x0006,
MODULE_CMD_ACTIVE                 = 0x0007,
MODULE_CMD_SAMPLE_RATE            = 0x0008,
MODULE_CMD_INPUT_RATE             = 0x0009,
MODULE_CMD_FULL_CONFIG            = 0x000A,
MODULE_CMD_MODULE_TYPE            = 0x000B,
MODULE_CMD_VERSION_ID             = 0x000C,
MODULE_CMD_OUTPUT_STREAM          = 0x000F,
MODULE_CMD_INPUT_STREAM0          = 0x0010,
MODULE_CMD_INPUT_STREAM1          = 0x0011,
MODULE_CMD_INPUT_STREAM2          = 0x0012,
MODULE_CMD_INPUT_STREAM3          = 0x0013,
MODULE_CMD_INPUT_STREAM4          = 0x0014,
MODULE_CMD_INPUT_STREAM5          = 0x0015,
MODULE_CMD_INPUT_STREAM6          = 0x0016,
MODULE_CMD_INPUT_STREAM7          = 0x0017,
MODULE_CMD_SCRATCH_ALIGNMENT_OF   = 0x0026,
MODULE_CMD_SCRATCH_INT16_SIZE_OF  = 0x0027,
MODULE_CMD_LOGGING_INIT           = 0x0029,
MODULE_CMD_LOGGING_ENABLE         = 0x002A,
MODULE_CMD_FRAME_CYCLES           = 0x002C
} ControlModuleCommandCode;


typedef enum {


CONTROL_APP_CMD_RESERVED      =  0,
//  CONTROL_APP_SUSPEND         =  1,
//  CONTROL_APP_RESUME          =  2,
CONTROL_APP_VERSION           =  3,
CONTROL_APP_EXEC_FILE         =  4,
CONTROL_APP_OCLA_ENABLE       =  5,
CONTROL_APP_MEMORY            =  6,
CONTROL_APP_CLOCK               =  7,


CONTROL_APP_I2C_TUNNEL_CONFIG =  8,
CONTROL_APP_I2C_TUNNEL_DATA   =  9,
CONTROL_APP_I2C_TUNNEL_APPLY  = 10,


CONTROL_APP_LOGGING_INIT      = 20,
CONTROL_APP_LOGGING_ENABLE    = 21,


SOS_TASK_CREATE               = 35,
SOS_TASK_PRIORITY             = 36,
SOS_EXEC_DUP                  = 37,
SOS_EXEC_FREE                 = 38,
SOS_EXEC_PARM                 = 39,
SOS_JIFFIES                   = 41,
SOS_SIGNAL                    = 42,
SOS_SIGNAL_ALL                = 43,
SOS_ENABLE_IRQ_NR             = 44,
SOS_DISABLE_IRQ_NR            = 45,
SOS_RESOURCE                  = 47,
SOS_TIME                      = 50,
SOS_TASK_SLEEP_JIFFIES        = 51,


CONTROL_APP_USB_START         = 60,
CONTROL_APP_USB_STOP               = 61,


} ControlAppCommandCode;


typedef enum IvnrCmdCodeTag {
IVNR_CMD_SIN_OUTPUT = 0x0040,
IVNR_CMD_NR = 0x0041,
IVNR_CMD_WATER_MARK = 0x0042,
IVNR_CMD_BLINK = 0x0043,
IVNR_CMD_IO_CONTROL = 0x0044,
IVNR_CMD_NR_OUTPUT = 0x0045,
IVNR_CMD_SESSION_DATA = 0x0046
} IvnrCmdCode;
#define MODULE_RC_FIRST -1024
#define STREAMER_APP_RESET                      1
#define STREAMER_APP_MODULE_APP_ENABLE        22
#define STREAMER_APP_MODULE_APP_DESTROY        23
#define STREAMER_APP_MODULE_APP_HEADER        24
#define STREAMER_APP_STREAM_DESTROY        33
#define IVNR_CMD_WATCHDOG        0x0047
#define MODULE_RC_STREAM_ID_NOT_CREATED        (MODULE_RC_FIRST-12)
#define MODULE_RC_BAD_APP_ID        (MODULE_RC_FIRST- 7)
#define STREAMER_APP_GET_MODULE_APP_HEADER        CMD_GET(STREAMER_APP_MODULE_APP_HEADER)
#define IVNR_CMD_SET_WATCHDOG        CMD_SET(IVNR_CMD_WATCHDOG)
#define IVNR_CMD_GET_WATCHDOG        CMD_GET(IVNR_CMD_WATCHDOG)
#define OUTPUT_DIGIT_X24        2048




void Mike_Init(void);
void Mike_main(void);


#endif  


/******************** (C) COPYRIGHT 2010 YongChen Co., Ltd *************
* File Name         : ycc_mike.c
* Author            : tangeping
* Version           : V1.0.0
* Date              : 07/15/2014
* Description       : XF6000YE
************************************************************************/
#define YCC_MIKE_GLOBALS
#include "stm32f10x.h"
#include "main.h"
#include <string.h>
#include <stdio.h>


#define XF_RST        GPIOA->BRR = GPIO_Pin_4
#define XF_FREE        GPIOA->BSRR = GPIO_Pin_4
#define XF_WK        (GPIOA->BRR = GPIO_Pin_5)       
#define XF_SP        (GPIOA->BSRR = GPIO_Pin_5)


#define WORK_MODE_MAX 4
const char g_work_mode_gain[WORK_MODE_MAX][8] = {
/* DA_P, NO_USE, NR_L, NR_R, AEC_L, AEC_R, WK_L, WK_R */
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
/*  4dB, --, 28.50dB, 28.50dB, 27.75dB, 10.50dB, 27.75dB, 10.50dB */ /* Mic in 0.05v, Output 0.5 */
{0x3D, 0x00, 0x36, 0x36, 0x35, 0x1E, 0x35, 0x1E},
/*  4dB, --, -3.75dB, -3.75dB, -3.75dB, 10.50dB, -3.75dB, 10.50dB */ /* Mic in  0.5v, Output 0.5 */
{0x3D, 0x00, 0x0B, 0x0B, 0x0B, 0x1E, 0x0B, 0x1E},
/*  4dB, --, 32.25dB, 32.25dB, 31.50dB, 10.50dB, 31.50dB, 10.50dB */ /* Mic in 0.05v, Output 0.5 */
{0x3D, 0x00, 0x3B, 0x3B, 0x3A, 0x1E, 0x3A, 0x1E}
};
#define MAX_COMMAND_SIZE 13
typedef struct {                     
int16_t   num_16b_words;  
uint16_t  command_id;   
uint32_t  app_module_id;
uint32_t  data[MAX_COMMAND_SIZE] ;   
}Command_t;
#define REPLY_POLL_INTERVAL_MSEC     1
#define REPLY_POLL_TIMEOUT_MSEC   200
static int m_time_out_ms;


void reset_time_out(void)
{
m_time_out_ms = 0;
}


int get_time_wait(void)
{
return m_time_out_ms;
}


int VCI2CWrite(int register_address, u8*buffer, int size)
{
if(I2C_Probe(I2C_DEV_XF6000)==1)
{
//        return Write_XF6000( register_address, buffer,size);
return I2C_Bus_XF6000(I2C_DEV_XF6000,I2CMD_IOTODEV,register_address,buffer,size);
}
else return 0;
}
int VCI2CRead(int register_address, u8*buffer, int size)
{
if(I2C_Probe(I2C_DEV_XF6000)==1)
{
//        return Read_XF6000( register_address,buffer,size);
return I2C_Bus_XF6000(I2C_DEV_XF6000,I2CMD_DEVTOIO,register_address,buffer,size);
}
else return 0;
}


int send_cmd (Command_t *cmd, uint32_t  app_module_id, uint32_t  command_id, uint32_t num_16b_words)
{
unsigned int *i2c_data = (unsigned int *)cmd;
int size = (num_16b_words + 2) * 4;
int elapsed_ms = 0;
int ret = 0;
if (num_16b_words > MAX_COMMAND_SIZE)
{
return(-1);
}
cmd->num_16b_words = (uint16_t)((command_id&CMD_GET(0)) ? MAX_COMMAND_SIZE : num_16b_words);
cmd->command_id = (uint16_t)command_id & 0x7FFF;
cmd->app_module_id = app_module_id;
ret = VCI2CWrite(0x4, (unsigned char *)(&i2c_data[1]), (size - 4));
ret = VCI2CWrite(0x0, (unsigned char *)(&i2c_data[0]), 4);
while (elapsed_ms < REPLY_POLL_TIMEOUT_MSEC)
{
ret = VCI2CRead(0x0, (unsigned char *)&i2c_data[0], 4);


if (ret != 0 && (cmd->command_id & 0x8000) == 0x8000)
break;
SysTick_Delayms(REPLY_POLL_INTERVAL_MSEC);
elapsed_ms += REPLY_POLL_INTERVAL_MSEC;
}
m_time_out_ms += elapsed_ms;


if ((cmd->command_id & 0x8000) == 0x8000)


{
if (cmd->num_16b_words > 0)
{
ret = VCI2CRead(0x8, (unsigned char *)&i2c_data[2], (cmd->num_16b_words)*4);
}
SysTick_Delayms(REPLY_POLL_INTERVAL_MSEC);
return(cmd->num_16b_words);
}
return(-1);
}


int test_ret(Command_t *command)
{
int ret_val;
SysTick_Delayms(20);
command->data[0] = IV_I2C_CMD_GET_RET;
ret_val = send_cmd(command, APP_ID_CAPT | capt_nr, (IV_I2C_CMD_CTRL | 0x0100), 3);
if(ret_val < 0)
{
return ret_val;
}
return(command->data[0]);
}
int wait_ret(Command_t *command)
{
int ret_val;
int time_out;


time_out = 200;
while(1)
{
ret_val = test_ret(command);
if( ret_val == IV_I2C_RET_SUCCESS_STANDBY)
break;
time_out--;
if(time_out == 0)
break;
}
return ret_val;
}
int VCGetVersion(Command_t * command)
{
command->data[0] = IV_I2C_CMD_GET_VERSION;
send_cmd(command, APP_ID_CAPT | capt_nr, (IV_I2C_CMD_CTRL | 0x0100), 1);
return command->data[0];
}


void VCChangeOutputFormat(Command_t *command, cmd_output_format_id format_id)
{
cmd_output_format_id current_format=OUTPUT_FORMAT_NULL;
command->data[0] = 1;
    send_cmd(command, APP_ID_STRM, STREAMER_APP_GET_MODULE_APP_HEADER , 1);


if(command->data[0] == 1)
{
current_format = OUTPUT_FORMAT_DIGITAL;
}
else if((command->data[0] == 0))
{
current_format = OUTPUT_FORMAT_ANALOG;
}


// 先把模块逆初使化
if(current_format == OUTPUT_FORMAT_DIGITAL)
{
command->data[0] = APP_ID_CAPT;
command->data[1] = 0;
send_cmd(command, APP_ID_STRM, STREAMER_APP_MODULE_APP_ENABLE, 2);


command->data[0] = APP_ID_PLBK;
command->data[1] = 0;
send_cmd(command, APP_ID_STRM, STREAMER_APP_MODULE_APP_ENABLE, 2);


command->data[0] = mic_to_capt;
send_cmd(command, APP_ID_STRM, STREAMER_APP_STREAM_DESTROY, 1);




command->data[0] = capt_to_i2sf;
send_cmd(command, APP_ID_STRM, STREAMER_APP_STREAM_DESTROY, 1);


command->data[0] = i2sf_to_plbk;
send_cmd(command, APP_ID_STRM, STREAMER_APP_STREAM_DESTROY, 1);




command->data[0] = plbk_to_i2s;
send_cmd(command, APP_ID_STRM, STREAMER_APP_STREAM_DESTROY, 1);


}
else if(current_format == OUTPUT_FORMAT_ANALOG)
{
command->data[0] = 0;
send_cmd(command, APP_ID_CAPT | capt_nr, IVNR_CMD_SET_WATCHDOG, 1);


command->data[0] = APP_ID_CAPT;
command->data[1] = 0;
send_cmd(command, APP_ID_STRM, STREAMER_APP_MODULE_APP_ENABLE, 2);


command->data[0] = mic_to_capt;
send_cmd(command, APP_ID_STRM, STREAMER_APP_STREAM_DESTROY, 1);


command->data[0] = capt_to_i2s;
send_cmd(command, APP_ID_STRM, STREAMER_APP_STREAM_DESTROY, 1);


}
command->data[0] = Q8_23(16);
send_cmd(command, APP_ID_STRM, STREAMER_APP_RESET, 1);


if (format_id == OUTPUT_FORMAT_ANALOG)
{
command->data[0] = APP_ID('N','R','A','O');
}
else if (format_id == OUTPUT_FORMAT_DIGITAL)
{
command->data[0] = APP_ID('N','R','D','O');
}
else
{
command->data[0] = APP_ID('C','O','N','F');
}
send_cmd(command, APP_ID_CTRL, CONTROL_APP_EXEC_FILE, 1);


}


int VCChangeWorkMode(Command_t *command, cmd_work_mode_id work_mode_id)
{


uint32_t *pdata32;


pdata32 = (uint32_t *)&g_work_mode_gain[work_mode_id];
command->data[0] = IV_I2C_CMD_WORK_MODE;
command->data[1] = work_mode_id;
command->data[2] = *pdata32;
command->data[3] = *(pdata32 + 1);


send_cmd(command, APP_ID_CAPT | capt_nr, (IV_I2C_CMD_CTRL & ~0x0100), 4);
return (0);
}


void VCChangeFunc(Command_t * command, cmd_func_id func_id)
{
command->data[0] = func_id;
send_cmd(command, APP_ID_CAPT | capt_nr, (IV_I2C_CMD_CTRL & ~0x0100), 1);
wait_ret(command);       
}




void VCConfigWakeupGpio(Command_t * command, u8 key_level, int msecond)
{
command->data[0] = IV_I2C_CMD_WK_SIGN;
command->data[1] = key_level;
command->data[2] = msecond;
send_cmd(command, APP_ID_CAPT | capt_nr, (IV_I2C_CMD_CTRL & ~0x0100), 3);
}


void VCConfigWakeupID(Command_t * command, int wakeup_id)
{
command->data[0] = IV_I2C_CMD_WK_ID;
command->data[1] = wakeup_id;
send_cmd(command, APP_ID_CAPT | capt_nr, (IV_I2C_CMD_CTRL & ~0x0100), 2);
wait_ret(command);
}


void VCSetDACVolume(Command_t * command, cmd_dac_gain_id dac_gain_id)
{
int mem_info;
reset_time_out();
mem_info = dac_gain_id;
command->data[0] = 0;
command->data[1] = 0;
command->data[2] = 1;
command->data[3] = mkword(0x34, mem_info);
send_cmd(command, APP_ID_CTRL, CMD_SET(CONTROL_APP_I2C_TUNNEL_DATA), 4);
command->data[0] = 0;
send_cmd(command, APP_ID_CTRL, CONTROL_APP_I2C_TUNNEL_APPLY, 1);


mem_info |= 0x100;
command->data[0] = 0;
command->data[1] = 0;
command->data[2] = 1;
command->data[3] = mkword(0x35, mem_info);
send_cmd(command, APP_ID_CTRL, CMD_SET(CONTROL_APP_I2C_TUNNEL_DATA), 4);
command->data[0] = 0;
send_cmd(command, APP_ID_CTRL, CONTROL_APP_I2C_TUNNEL_APPLY, 1);
}


/*************************************************************************************/
/*   VCEnableNR 仅用于版本二,于版本三中调用会造成异常   */
/*************************************************************************************/
void VCEnableNR(Command_t * command, u8 enable_nr)
{
reset_time_out();
command->data[0] = 0;
command->data[1] = 0x1A;
command->data[2] = 0x0;
command->data[3] = 1;
command->data[4] = 2;
command->data[5] = 0;
send_cmd(command, APP_ID_CTRL, CONTROL_APP_I2C_TUNNEL_CONFIG, 6);
if(enable_nr)
{
command->data[0] = 0;
command->data[1] = 0;
command->data[2] = 1;
command->data[3] = mkword(0x32, 0x15);
send_cmd(command, APP_ID_CTRL, CMD_SET(CONTROL_APP_I2C_TUNNEL_DATA), 4);
command->data[0] = 0;
send_cmd(command, APP_ID_CTRL, CONTROL_APP_I2C_TUNNEL_APPLY, 1);
command->data[0] = 0;
command->data[1] = 0;
command->data[2] = 1;
command->data[3] = mkword(0x33, 0x15);
send_cmd(command, APP_ID_CTRL, CMD_SET(CONTROL_APP_I2C_TUNNEL_DATA), 4);
command->data[0] = 0;
send_cmd(command, APP_ID_CTRL, CONTROL_APP_I2C_TUNNEL_APPLY, 1);
command->data[0] = 1;
send_cmd(command, APP_ID_CAPT | capt_nr, IVNR_CMD_SET_NR_OUTPUT, 1);
}
else
{
command->data[0] = 0;
send_cmd(command, APP_ID_CAPT | capt_nr, IVNR_CMD_SET_NR_OUTPUT, 1);
command->data[0] = 0;
command->data[1] = 0;
command->data[2] = 1;
command->data[3] = mkword(0x32, 0x16);
send_cmd(command, APP_ID_CTRL, CMD_SET(CONTROL_APP_I2C_TUNNEL_DATA), 4);


command->data[0] = 0;
send_cmd(command, APP_ID_CTRL, CONTROL_APP_I2C_TUNNEL_APPLY, 1);


command->data[0] = 0;
command->data[1] = 0;
command->data[2] = 1;
command->data[3] = mkword(0x33, 0x16);
send_cmd(command, APP_ID_CTRL, CMD_SET(CONTROL_APP_I2C_TUNNEL_DATA), 4);
command->data[0] = 0;
send_cmd(command, APP_ID_CTRL, CONTROL_APP_I2C_TUNNEL_APPLY, 1);


}
}


void Mike_Init (void)
{       
int version;
Command_t cmd;// = {0};
memset(&cmd,0,sizeof(cmd));
XF_RST;
SysTick_Delayms(10);
XF_FREE;       
//        VCWaitReady(&cmd, 0);


SysTick_Delayms(280);//注意等待模块稳定,才能正确读写数据
version = VCGetVersion(&cmd);


if(version == 2)
{
VCEnableNR(&cmd, 0); // 关闭降噪


VCEnableNR(&cmd, 1); // 打开降噪
}
else if(version == 3 || version == 4)
{
//第一步,初始化配置,上电启动1s后可以进行配置
//1.先配置模拟输出还是数字输出
VCChangeOutputFormat(&cmd, OUTPUT_FORMAT_ANALOG);//切换为模拟输出。如果只使用模拟输出,可以不用切换,因为上电默认的状态为模拟输出


// VCChangeOutputFormat(&cmd, OUTPUT_FORMAT_DIGITAL);//切换为数字输出,使用数字输出需要保持I2S Clock打开


//2.其次配置输入输出增益
//        VCChangeWorkMode(&cmd, WORK_MODE_TOPLIGHT); // 设置顶灯模式,XF6000YE输入有效值0.5v,输出有效值0.5v
VCChangeWorkMode(&cmd, WORK_MODE_HOST); //车机模式
//        VCChangeWorkMode(&cmd, WORK_MODE_PERIPHERAL);// 设置外挂模式,XF6000YE输入有效值0.05v,输出有效值0.5v
//第二步,使用需要的功能


//1.使用到电话回声消除功能
VCChangeFunc(&cmd, FUNC_MODE_PHONE);       
//2.使用到降噪功能
VCChangeFunc(&cmd, FUNC_MODE_NOISECLEAN);


//3.使用到原始录音功能
VCChangeFunc(&cmd, FUNC_MODE_PASSBY);       




//4.使用到唤醒功能
VCConfigWakeupID(&cmd, 0);        // 设置本地唤醒词“你好语音助理”


VCConfigWakeupGpio(&cmd, 0, 480);        // 配置本地唤醒的唤醒信号为高电平有效,信号长480ms


VCChangeFunc(&cmd, FUNC_MODE_WAKEUP);        // 切换到唤醒功能       
}


}
void Mike_main()
{


}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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