如何配置蓝牙音频bk3231蓝牙模块的配置I2S

【蓝牙音频模块】_电子元器件_蓝牙音频模块图片_价格 - 淘宝网
淘宝全球购为您提供最新最全面的包括美国、日本、澳洲等海外蓝牙音频模块代购,蓝牙音频模块洋货直邮,蓝牙音频模块海外品牌等全球购商品
您是不是想找:4839人阅读
android linux bluetooth(5)
蓝牙语音功能的实现
要实现蓝牙能够打skype电话,或蓝牙录音等功能,从下到上,需要做如下的修改:
audio部分:
驱动层,需要实现audio pcm的驱动。
hal层,需要添加蓝牙sco音频的通路支持。
蓝牙部分:
使用的蓝牙芯片的pcm接口连接到ap的pcm接口(用于传送音频数据),不是走的uart口传送音频数据。
使用的handfree/handset的profile,而不是a2dp profile
pcm部分,ap的pcm controller做主,蓝牙芯片做从。参数是:采样率8Khz,16bit,长/短同步,单声道
系统约束:
audioflinger目前是将系统所有声源的采样率都统一到48Khz,而我们蓝牙语音只需要8khz,所以需要有个resample的过程。
audioflinger下来的声音都是双通道的,而蓝牙芯片却只需要单声道,所以需要去掉一个通道。
先resample然后再去掉一个通道的数据,顺序不能搞反。
pcm驱动部分:
pcm驱动是属于音频驱动,遵循linux alsa驱动架构。
而linux alsa的驱动架构,粗略的讲,是有如下几个部分构成:
codec------------&snd_soc_codec-----&snd_soc_codec_driver
platform---------&snd_soc_platform--&snd_soc_platform_driver--&snd_pcm_ops
cpu dai驱动----&snd_soc_dai---------&snd_soc_dai_driver----&snd_soc_dai_ops
codec dai驱动-&snd_soc_dai---------&snd_soc_dai_drive-----&snd_soc_dai_ops
而以上部分的驱动,则是通过如下Audio machine driver来关联起来的。
machine---------&struct snd_soc_card------------&snd_soc_dai_link
即是通过snd_soc_dai_link结构来关联codec,platform,dai等之间的关系的。详情见snd_soc_dai_link结构内容:
struct snd_soc_dai_link {
/* config - must be set by machine driver */
const char *
/* Codec name */
const char *stream_
/* Stream name */
const char *codec_
/* for multi-codec */
const struct device_node *codec_of_
const char *platform_ /* for multi-platform */
const struct device_node *platform_of_
const char *cpu_dai_
const struct device_node *cpu_dai_of_
const char *codec_dai_
unsigned int dai_
/* format to set on init */
/* Keep DAI active over suspend */
unsigned int ignore_suspend:1;
/* Symmetry requirements */
unsigned int symmetric_rates:1;
/* pmdown_time is ignored at stop */
unsigned int ignore_pmdown_time:1;
/* codec/machine specific init - e.g. add machine controls */
int (*init)(struct snd_soc_pcm_runtime *rtd);
/* machine stream operations */
struct snd_soc_ops *
};通过如下的结构体定义,可以看出snd_soc_dai_link通过名字来指定了当前声卡使用的codec,platform,cpu dai,codec dai等结构。
提供该结构体的一个实例:
/* Digital audio interface glue - connects codec &--& CPU */
static struct snd_soc_dai_link wmt_dai[] = {
.name = &HiFi&,
.stream_name = &HiFi&,
.platform_name = &wmt-audio-pcm.0&,
.init = wmt_soc_dai_init,
.ops = &wmt_soc_primary_ops,
.name = &Voice&,
.stream_name = &Voice&,
.platform_name = &wmt-pcm-dma.0&,
.cpu_dai_name = &wmt-pcm-controller.0&,
.codec_dai_name = &HWDAC&,
.codec_name = &wmt-i2s-hwdac.0&,
.ops = &wmt_soc_second_ops,
};我们蓝牙pcm语音,是使用的第二组snd_soc_dai_link描述。该描述指定了我们是使用名为:wmt-pcm-dma.0的平台驱动;还有名为wmt-pcm-controller.0的cpu dai驱动;还有名为HWDAC的codec dai驱动;还有名为wmt-i2s-hwdac.0的codec驱动。
而以上驱动分别通过如下函数来注册到系统中去的:
snd_soc_codec_driver-------------&snd_soc_register_codec-----------&:codec_list
snd_soc_platform_driver----------&snd_soc_register_platform--------&:platform_list
snd_soc_dai_driver----------------&snd_soc_register_dais--------------&:dai_list
而以上驱动又是在什么时候注册到系统中去的呢?
概略的将,他们都是在系统初始化阶段,通过平台设备跟平台驱动匹配时,在平台驱动的probe函数中注册进去的。由于这些不是我们要讲的重点,所以略过去。
在这里再稍微描述下,这里指的platform一般就是指的dma,而dai字面意思就是数字音频接口,目前主要是i2s和pcm接口,而对应的cpu dai drvier一般就是指的ap端的i2s和pcm控制器驱动。在当前实例中,就是pcm接口;由于蓝牙的pcm和cpu的pcm是直接相连的,中间没经过codec,所以更本就不需要codec的参与,所以这里做了一个功能是dummy的虚拟codec driver及codec dai。
音频系统的初始化过程
音频模块的初始化始于如下函数:snd_soc_register_card(struct snd_soc_card *card)
而该函数的主要初始化工作都是在
snd_soc_instantiate_cards();该函数主要完成如下的工作:
a:soc_bind_dai_link
通过card-&dai_link[num];即struct snd_soc_dai_link *dai_link 中指定的platform,codec,cpu dai,codec dai的名字,来找到对应的平台驱动,codec驱动,cpu dai驱动和codec dai驱动。并将他们分别赋值给(snd_soc_pcm_runtime*)rtd-&cpu_dai,rtd-&codec,rtd-&codec_dai,rtd-&platform
b:&snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
card-&owner, 0, &card-&snd_card);
注意struct snd_soc_card与struct snd_card之间的关系,snd_soc_card-&snd_card 即为struct snd_card结构。
并且用于存放snd_card_create函数创建和初始化的声卡结构。snd_soc_card用于描述Audio machine driver,而snd_card用于描述一个声卡对象,一个声卡对象包含多个声卡设备(struct snd_device),其中必须包含了一个控制设备,在本例中还包含一个pcm设备。
声卡的控制设备创建api为:snd_ctl_create;pcm设备创建api为:snd_pcm_new,其实他们最终都是调用的snd_device_new函数,该函数的作用就是分配snd_device所需的内存,并初始化他,最后将该snd_device添加到声卡对象snd_card所包含的设备列表中(-&devices).
而以上创建的声卡设备,在系统的声卡对象注册时:snd_card_register会遍历该声卡对象(snd_card)所属的所有声卡设备(snd_device),对每个声卡设备,调用snd_register_device_for_dev函数实现声卡设备的注册。
c:snd_soc_dapm_new_controls
创建机器struct&snd_soc_card所包含的所有dapm控件:struct
snd_soc_card*card-&dapm_widgets,该函数主要作用是:为控件dapm_widget分配所需内存并初始化它,设置控件的callback函数,一般为power_check,设置控件为连接状态(-&connected = 1),并将该dapm_widget添加到snd_soc_card的控件列表中.控件是一个很重要的概念,在这里做下展开描述,先上结构体:
struct snd_soc_dapm_widget {
enum snd_soc_dapm_
const char *
/* widget name */
const char * /* stream name */
struct snd_soc_codec *
struct snd_soc_platform *
struct list_
struct snd_soc_dapm_context *
/* widget specific data */
/* dapm control */
/* negative reg = no direct dapm */
/* bits to shift */
unsigned int saved_
/* widget saved value */
/* widget current value */
/* non-shifted mask */
unsigned int on_
/* on state value */
unsigned int off_
/* off state value */
unsigned char power:1;
/* block power status */
unsigned char invert:1;
/* invert the power bit */
unsigned char active:1;
/* active stream on DAC, ADC's */
unsigned char connected:1;
/* connected codec pin */
unsigned char new:1;
/* cnew complete */
unsigned char ext:1;
/* has external widgets */
unsigned char force:1;
/* force state */
unsigned char ignore_suspend:1;
/* kept enabled over suspend */
unsigned char new_power:1;
/* power from this run */
unsigned char power_checked:1;
/* power checked this run */
/* sort within widget type */
int (*power_check)(struct snd_soc_dapm_widget *w);
/* external events */
unsigned short event_
/* flags to specify event types */
int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);
/* kcontrols that relate to this widget */
const struct snd_kcontrol_new *kcontrol_
struct snd_kcontrol **
/* widget input and outputs */
struct list_
struct list_
/* used during DAPM updates */
struct list_head power_
struct list_
我们看到,该结构有几个很重要的成员:一个是控件对应的kcontrols,目前在这个函数中,还未被创建,并且w-&power字段也未设置,不急,后面会讲到。需要强调的是:定义一个 widget ,我们需要指定两个很重要的内容:
1: 一个是用于控制widget本身的电源状态的reg/shift等寄存器信息,
2: 另一个是用于控制音频路径切换的dapm kcontrol信息,这些dapm kcontrol有它们自己的reg/shift寄存器信息用于切换widget的路径连接方式
上面的item 1提到的reg/shift等寄存器信息就是struct&snd_soc_dapm_widget控件中的reg/shift等成员;而item 2提到的reg/shift则是kcontrols中的(struct&soc_mixer_control*)private_data中的reg/shift值。
值得说明的是,除了机器驱动snd_soc_card可以有自己的dapm widget,普通kcontrol和dapms routes外,codec driver(snd_soc_codec_driver),platform driver(snd_soc_platform_driver)都会有自己的dapm widget,普通kcontrol和dapms
routes,并且他们的控件和路由信息的注册分别在soc_probe_dai_link中的soc_probe_codec,soc_probe_platform函数中进行。
d:soc_probe_dai_link
由于之前的soc_bind_dai_link函数中,已经找到了对应的平台驱动,codec驱动,cpu dai驱动和codec dai驱动,在这里,是分别调用这些驱动的probe函数。顺序是:&probe
the cpu_dai ,probe the CODEC(soc_probe_codec),probe the platform(soc_probe_platform),probe
the CODEC DAI ,最后调用soc_new_pcm创建pcm声卡设备(即/dev/snd目录下的pcm设备节点),该实例中的pcm驱动对应的设备节点为:/dev/snd/pcmC0D1c,/dev/snd/pcmC0D1p,前者为录音(capture),后者为放音(play)。
e:snd_soc_dapm_link_dai_widgets(card);
在soc_probe_codec函数中调用snd_soc_dapm_new_dai_widgets函数创建特殊的dai类型的widgets控件。而在这里通过snd_soc_dapm_link_dai_widgets则是连接这些dai widget
f:snd_soc_add_card_controls
创建(struct snd_soc_card *)card-&controls所包含的普通控件,并添加到struct snd_card *card-&controls控件列表中
g:snd_soc_dapm_add_routes(struct snd_soc_dapm_context *dapm,const struct snd_soc_dapm_route *route)
创建并添加(struct snd_soc_card *)card-&dapm_routes所包含的路由信息。该函数根据&struct snd_soc_dapm_route参数:
* DAPM audio route definition.
* Defines an audio route originating at source via control and finishing
* at sink.
struct snd_soc_dapm_route {
const char *
const char *
const char *
/* Note: currently only supported for links where source is a supply */
int (*connected)(struct snd_soc_dapm_widget *source,
struct snd_soc_dapm_widget *sink);
};提供的sink,source,control等名字信息,在(struct snd_soc_card *)card-&widgets的控件列表中,分别找到源控件,目的控件,和path所对应的kcontrol控件。分配并初始化struct snd_soc_dapm_path *path结构所需的内存空间,并根据控件id的不同,调用如下函数之一:
source&dapm_connect_mux
dapm_connect_mixer
来将dapm控件和path进行关联起来,并设置path的connect状态。
dapm mux控件和dapm mixer控件为什么要分开来处理,因为dapm&mixer控件会有多个Kcontrol,而dapm&mux控件只会有一个控件。
下面展开dapm_connect_mixer函数:
/* connect mixer widget to its interconnecting audio paths */
static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
struct snd_soc_dapm_path *path, const char *control_name)//control_name是path对应的kcontrol的名称
//不同的kcontrol对应不同的path
/* search for mixer kcontrol */
for (i = 0; i & dest-&num_ i++) {//在path对应的目的控件中搜索所有的kcontrol,找到name指定的那个kcontrol
if (!strcmp(control_name, dest-&kcontrol_news[i].name)) {
list_add(&path-&list, &dapm-&card-&paths);//将path添加到(struct snd_soc_card *)card-&path列表中
list_add(&path-&list_sink, &dest-&sources);//将path添加到目的控件的sources列表中
list_add(&path-&list_source, &src-&sinks);//将patch添加到源控件sinks列表中
path-&name = dest-&kcontrol_news[i].//将找到的那个控件的名字赋值给path-&name,但并未给path-&kcontrol赋值,因为kcontrol 可能还未创建
dapm_set_path_status(dest, path, i);//更新 path-&connect 的链接状态
return -ENODEV;
下面展开dapm_connect_mux函数:
/* connect mux widget to its interconnecting audio paths */
static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
struct snd_soc_dapm_path *path, const char *control_name,//注意此处control_name并不是kcontrol的名字,而是mux控件中的枚举值
const struct snd_kcontrol_new *kcontrol)//该kcontrol即为该mux控件唯一的kcontrol
struct soc_enum *e = (struct soc_enum *)kcontrol-&private_//不同的枚举值对应不同的path
for (i = 0; i & e-& i++) {
if (!(strcmp(control_name, e-&texts[i]))) {
list_add(&path-&list, &dapm-&card-&paths);
list_add(&path-&list_sink, &dest-&sources);
list_add(&path-&list_source, &src-&sinks);
path-&name = (char*)e-&texts[i];//
dapm_set_path_status(dest, path, 0);
return -ENODEV;
h:snd_soc_dapm_new_widgets
遍历(struct snd_soc_card *)card-&widgets列表中所有dapm控件,为每个控件做如下的事情:
1:struct snd_soc_dapm_widget *w;为widget中的所有kcntrols分配内存空间(w-&kcontrols),并做如下事情:
初始化path-&long_name
path-&kcontrol = snd_soc_cnew(...)//创建kcontrol,并返回该kcontrol
snd_ctl_add(card, path-&kcontrol);//添加该控件到系统中
w-&kcontrols[i] = path-&//用新创建的kcontrol设置widget和path对应的kcontrol
2:更新dapm的电源状态:w-&power,并标记已经创建了该dapm widget
/* Read the initial power state from the device */
if (w-&reg &= 0) {
val = soc_widget_read(w, w-&reg);
val &= 1 && w-&
if (w-&invert)
w-&power = 1;//更新dapm的电源状态
w-&new = 1;//标记已经创建了该dapm widget
3:将该dapm widget标记为dirty,将他添加到dirty list中,然后通过dapm_power_widgets函数作随后的顺序上下电操作
dapm_mark_dirty(w, &new widget&);
dapm_debugfs_add_widget(w);
dapm_power_widgets(dapm, SND_SOC_DAPM_STREAM_NOP);
mutex_unlock(&dapm-&card-&dapm_mutex);
i:snd_card_register(struct snd_card *card)
该函数做如下事情:
1:通过snd_device_register_all函数,注册所有属于该声卡对象struct snd_card的所有声卡设备:(struct snd_card*)card-&devices,在本列中该注册过程,包含了两个设备,即pcm设备和控制设备的注册。
* register all the devices on the card.
* called from init.c
int snd_device_register_all(struct snd_card *card)
struct snd_device *
if (snd_BUG_ON(!card))
return -ENXIO;
list_for_each_entry(dev, &card-&devices, list) {
if (dev-&state == SNDRV_DEV_BUILD && dev-&ops-&dev_register) {
if ((err = dev-&ops-&dev_register(dev)) & 0)//遍历该声卡对象所属的所有音频设备,并执行对应音频设备的 dev_register 函数
dev-&state = SNDRV_DEV_REGISTERED;
而以上的dev_register函数是在pcm设备和控制设备创建的时候,就已经初始化好的。他们的创建函数分别为:snd_pcm_new,snd_ctl_create函数。
在执行dev-&ops-&dev_register时,在本列中,分如下两种情况:
for pcm 设备:
::snd_pcm_dev_register(struct snd_device *device)//for pcm 设备
snd_register_device_for_dev(devtype, pcm-&card,pcm-&device,&snd_pcm_f_ops[cidx],pcm, str, dev);
snd_minors[minor] =
device_create //在/dev/snd目录下,创建设备节点
以上snd_pcm_f_ops结构体展开如下:
&* &Register section
const struct file_operations snd_pcm_f_ops[2] = {
THIS_MODULE,
snd_pcm_write,
.aio_write =
snd_pcm_aio_write,
snd_pcm_playback_open,
.release =
snd_pcm_release,
no_llseek,
snd_pcm_playback_poll,
.unlocked_ioctl =
snd_pcm_playback_ioctl,
.compat_ioctl =
snd_pcm_ioctl_compat,
snd_pcm_mmap,
snd_pcm_fasync,
.get_unmapped_area =
snd_pcm_get_unmapped_area,
THIS_MODULE,
snd_pcm_read,
.aio_read =
snd_pcm_aio_read,
snd_pcm_capture_open,
.release =
snd_pcm_release,
no_llseek,
snd_pcm_capture_poll,
.unlocked_ioctl =
snd_pcm_capture_ioctl,
.compat_ioctl =
snd_pcm_ioctl_compat,
snd_pcm_mmap,
snd_pcm_fasync,
.get_unmapped_area =
snd_pcm_get_unmapped_area,
for 控制设备:
::snd_ctl_dev_register(struct snd_device *device)//for 控制设备
sprintf(name, &controlC%i&, card-&number);
static const struct file_operations snd_ctl_f_ops =
.owner =THIS_MODULE,
.read =snd_ctl_read,
.open =snd_ctl_open,
.release =snd_ctl_release,
.llseek =no_llseek,
.poll =snd_ctl_poll,
.unlocked_ioctl =snd_ctl_ioctl,
.compat_ioctl =snd_ctl_ioctl_compat,
.fasync =snd_ctl_fasync,
snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,&snd_ctl_f_ops, card, name)
snd_register_device_for_dev(type, card, dev, f_ops,private_data, name,snd_card_get_device_link(card)
以上snd_pcm_f_ops[2]和snd_ctl_f_ops即为设备节点文件/dev/snd/pcmC0D1c,/dev/snd/pcmC0D1p和/dev/snd/controlC0访问的内核入口点。
2: 将创建的struct snd_card *card设备,存储在全局数组snd_cards[]中。
snd_cards[card-&number] =
j: snd_soc_dapm_sync(&card-&dapm);
以上函数,后续章节再详细讲解
至此linux alsa音频驱动的初始化基本完成。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:155543次
积分:1923
积分:1923
排名:第17598名
原创:36篇
评论:63条
(2)(2)(3)(1)(1)(1)(1)(5)(2)(5)(1)(7)(2)(5)2016年最新低成本音质好蓝牙芯片音响音箱模块方案 - chinarf的专栏 - 52RD博客_
chinarf的专栏
2016年最新低成本音质好蓝牙芯片音响音箱模块方案(&14:19)
标签:2016年最新低成本音质好蓝牙芯片音响音箱模块方案
2016年最新低成本音质好蓝牙芯片音响音箱模块方案
& & & (蓝牙音频模块+新唐DSP+WAVES MAXX算法,音质好低成本蓝牙音频方案)
一.炬力ATS2823蓝牙音响音箱模块方案
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&
基本功能:
1屏幕选择:88:88 &7pin数码管;
2按键支持:6键(Play, MODE, NEXT, PREV, VOL+, VOl-);
3音频接口:AUX In输入, FM输入,MIC in; U盘,SD/MMC card。
4充电接口:USB(mini A)
5存储:SPI Nor flash作为程序存储器,程序可升级;
6支持立体声蓝牙音箱功能即手机等设备可通过蓝牙发送音乐到音箱(A2DP),支持SBC和AAC格式;&
7支持蓝牙电话免提功能(HFP),具有回声消除和噪声处理等功能;
8支持音箱端通过蓝牙控制手机等设备切换上下曲,调节音量,接/挂电话(AVRCP);
9支持播放SD/MMC Card 和 U盘上的音乐,音乐格式有: MP3,WMA,APE,FLAC,WAV;
10支持AUX输入即外部音源可通过AUX接入音箱并可在音箱上调节音量;&
11支持USB 声卡:当通过USB线连接音箱和PC后,PC上的声音可通过USB线从音箱上播放出来;USB&
device和USB host(U盘)不能同时使用。
12支持闹钟功能;
13支持读卡器功能 ;
14支持音箱状态播报,可播放各种音箱状态并可根据用户需求修改播报语言;
15支持功能切换热键(一键在蓝牙播放,Card,u盘、AUX IN,FM, USB声卡)(MODE按键即功能切换
16支持固件加密;
17支持USB连接到电脑进行固件升级/量产;
18FAT16、FAT32、ExFAT/Fat64文件系统支持
19支持目录级数:8级子目录
20支持文件数:单目录下不限制文件个数,音乐文件总数2000以内可支持。
21支持SD/MMC/SDHC
22支持USB2.0,完全兼容USB1.1;
2332级音量(音量等级可配置)
24支持后台蓝牙,可以在蓝牙连接的情况下播放卡或者u盘音乐,也可以播放FM
25支持AVRCP1.6,控制歌曲切换及播放、暂停状态转换,保持手机与音箱同步
26支持SPP遥控器功能,能够以andriod 手机APK操控音箱
27支持BLE遥控器功能,能够以支持蓝牙BLE的IOS 平台以APP操控音箱
&二.炬力ATS2825蓝牙音响音箱模块方案
基本功能:
1. 屏幕选择:88:88 &7pin数码管;
2. 按键支持:6键(Play, MODE, NEXT, PREV, VOL+, VOl-);
3. 音频接口:AUX In输入, FM输入,MIC in; U盘,SD/MMC card。
3. 充电接口:USB(mini A)
4. 存储:SPI Nor flash作为程序存储器,程序可升级;
5. 支持立体声蓝牙音箱功能即手机等设备可通过蓝牙发送音乐到音箱(A2DP),支持SBC和AAC格式
6. 支持蓝牙电话免提功能(HFP),具有回声消除和噪声处理等功能;
7. 支持音箱端通过蓝牙控制手机等设备切换上下曲,调节音量,接/挂电话(AVRCP);
8. 支持播放SD/MMC Card 和 U盘上的音乐,音乐格式有: MP3,WMA,APE,FLAC,WAV;
9. 支持AUX输入即外部音源可通过AUX接入音箱并可在音箱上调节音量;&
10. 支持USB 声卡:当通过USB线连接音箱和PC后,PC上的声音可通过USB线从音箱上播放出来;USB&
device和USB host(U盘)不能同时使用。
11. 支持闹钟功能;
12. 支持读卡器功能 ;
13. 支持音箱状态播报,可播放各种音箱状态并可根据用户需求修改播报语言;
14. 支持功能切换热键(一键在蓝牙播放,Card,u盘、AUX IN,FM, USB声卡)(MODE按键即功能切
15.支持固件加密;
16. 支持USB连接到电脑进行固件升级/量产;
17. FAT16、FAT32、ExFAT/Fat64文件系统支持
18. 支持目录级数:8级子目录
19. 支持文件数:单目录下不限制文件个数,音乐文件总数2000以内可支持。
20. 支持SD/MMC/SDHC
21. 支持USB2.0,完全兼容USB1.1;
22. 32级音量(音量等级可配置)
23. 支持后台蓝牙,可以在蓝牙连接的情况下播放卡或者u盘音乐,也可以播放FM
24. 支持AVRCP1.6,控制歌曲切换及播放、暂停状态转换,保持手机与音箱同步
25. 支持SPP遥控器功能,能够以andriod 手机APK操控音箱
26. 支持BLE遥控器功能,能够以支持蓝牙BLE的IOS 平台以APP操控音箱
三.CSR64215蓝牙音响音箱模块方案开发
(支持TWS、I2S、APTX低成本蓝牙模块CSR64215方案)
1. 产品描述:
蓝牙V4.0+EDR标准规范&
射频功率级别II级
支持A2DP1.3,AVRCP 1.5,HFP1.6(包含支持WBS和mSBC),HSP1.2等协议
采用CSR 最新的第六代CVC语音增强技术实行降噪及回音消除
支持multipoint connection (连接两个手机应用语音和音乐连接)
支持CSR Secure simple pairing ,Proximity pairing 和 CSR Proximity connection
支持用户可定义的多语言的 Voice promote 功能
支持语音接听/拒接电话
支持SBC,MP3,AAC,APTX &APTX-LL 音频格式
多种引出接口:PIO/UART/SPI/AIO/SPK/MIC/USB
内置16位立体声编解码器,数模转换信噪比高达95dB
支持TWS(左右声道分离)
支持I2S输出
内置直流转换电源管理
集成锂电池充电功能,最大充电电流达400mA
较小的表面贴片封装:20*13*2.2mm
RoHS无铅生产工艺
2. 应用领域
高品质无线立体声耳机
高保真音箱、音响
具有回音消除的无线免提
蓝牙汽车影音
3. 主要参数
工作频段 2.402GHz -2.480GHz,ISM频段
蓝牙版本 蓝牙V4.0+EDR
主芯片 CSR64215
功率等级 2级 (Class II)
有效距离(空旷区域) 10米(典型)
发射功率 +4dBm (典型)
接收灵敏度 -85dB at 0.1% BER (典型)
频率偏差 ±10KHz
天线 无内置,需外置
电源电压 锂电池电压(3.0V-4.5V)
尺寸 20mm(长) * 13mm(宽) * 2.2 mm(高)
四.waves Maxx DSP音效处理(基于台湾Nuvoton新唐DSP芯片NPCA110系列)
引入 &waves Maxx音效处理
1.Maxxbass低音力度增强技术
2.Maxxtreble高音修饰技术
3.Maxx 3D 声场扩展技术4.Maxx EQ 曲线修补技术
强烈推荐蓝牙音响音箱模块方案 + 新唐芯片 + MAXX Audio算法。我们可以为低成本性价比最高的
蓝牙音响音箱解决方案。
更多定制方案、智能音响整体方案和音效处理软件等,请联系或亲临我司体验。
评 论1楼&kgeneral&发表于& 22:10&谢谢分享,很受用。
博客名称:蓝牙模块方案开发
日志总数:245
评论数量:43
访问次数:194295
建立时间: 16:52
52RD网友:(12-24)
52RD网友:(9-5)
kgeneral:(8-26)
kgeneral:(8-26)
chinarf:(1-21)
Rockyxie001:(6-26)
52RD网友:(10-9)
h_sml:(4-4)

我要回帖

更多关于 蓝牙音频发射模块 的文章

 

随机推荐