/***********************************************************
*****************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, //所有功能關(guān)閉直接錄音
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 僅用于版本二,于版本三中調(diào)用會造成異常 */
/*************************************************************************************/
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);//注意等待模塊穩(wěn)定,才能正確讀寫數(shù)據(jù)
version = VCGetVersion(&cmd);
if(version == 2)
{
VCEnableNR(&cmd, 0); // 關(guān)閉降噪
VCEnableNR(&cmd, 1); // 打開降噪
}
else if(version == 3 || version == 4)
{
//第一步,初始化配置,上電啟動1s后可以進行配置
//1.先配置模擬輸出還是數(shù)字輸出
VCChangeOutputFormat(&cmd, OUTPUT_FORMAT_ANALOG);//切換為模擬輸出。如果只使用模擬輸出,可以不用切換,因為上電默認的狀態(tài)為模擬輸出
// VCChangeOutputFormat(&cmd, OUTPUT_FORMAT_DIGITAL);//切換為數(shù)字輸出,使用數(shù)字輸出需要保持I2S Clock打開
//2.其次配置輸入輸出增益
// VCChangeWorkMode(&cmd, WORK_MODE_TOPLIGHT); // 設(shè)置頂燈模式,XF6000YE輸入有效值0.5v,輸出有效值0.5v
VCChangeWorkMode(&cmd, WORK_MODE_HOST); //車機模式
// VCChangeWorkMode(&cmd, WORK_MODE_PERIPHERAL);// 設(shè)置外掛模式,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); // 設(shè)置本地喚醒詞“你好語音助理”
VCConfigWakeupGpio(&cmd, 0, 480); // 配置本地喚醒的喚醒信號為高電平有效,信號長480ms
VCChangeFunc(&cmd, FUNC_MODE_WAKEUP); // 切換到喚醒功能
}
}
void Mike_main()
{
}
|