9.4. PDM LINK
概述
本说明介绍了PLNK数字麦的配置和使用说明
9.4.1. 应用实例
示例演示:
进入
demo_DevKitBoard/include/demo_config.h
,开启宏USE_AUDIO_DEMO
按键切换使用录音模式,在app_config.h中选择录音输入源为PLNK,如: #define CONFIG_AUDIO_ENC_SAMPLE_SOURCE AUDIO_ENC_SAMPLE_SOURCE_PLNK0 //录音输入源选择
9.4.2. 配置说明
硬件连接:将数字麦引出的MIC_VDD(电源3.3V)、GND(地)、DAT(数据通道)和CLK(时钟线)进行连接。两个数字麦可共用DAT数据线和CLK时钟线
PLNK使用配置 board.c:
//hw_channel 输入通道选择
#define PLNK_MIC_MASK (BIT(0) | BIT(1)) //掩码通道
#define PLNK_CH_MIC_L BIT(0) //通道0 两个MIC共用DAT0也使用该宏
#define PLNK_CH_MIC_R BIT(1) //通道1 两个MIC共用DAT1也使用该宏
#define PLNK_CH_MIC_DOUBLE (BIT(0) | BIT(1)) //通道0和通道1
//plnk参数结构体
struct plnk_platform_data {
void (*port_remap_cb)(void); //设置IO重映射
void (*port_unremap_cb)(void); //解除IO重映射
u8 hw_channel; //数字麦克风的通道选择(见hw_channel 输入通道选择)
u8 clk_out; //是否输出时钟信号 1:是 0:否
u8 high_gain; //0db增益输出 1:使用 0:-6db输出
u8 sample_edge; //采样边沿 1:上升沿 0:下降沿
u16 sr_points; //采样点,不建议修改
u8 share_data_io; //两个数字麦共用一个DAT脚 1:是 0:否
u8 dc_cancelling_filter; //去直流滤波器,0-15
u32 dump_points_num; //丢弃硬件刚打开是的数据点数
};
//board.c板级文件配置
//设置重映射
static void plnk0_port_remap_cb(void)
{
//重映射PDM DAT-PH2 PDM CLK-PH3 重映射的DAT脚和CLK时钟脚可根据原理图所有引脚选择
extern int gpio_plnk_rx_input(u32 gpio, u8 index, u8 data_sel);
gpio_plnk_rx_input(IO_PORTH_02, 0, 0); //plnk数字DAT0输入 ,当第三个参数为1时gpio_plnk_rx_input(IO_PORTH_02, 0, 0);plnk数字DAT1输入
gpio_output_channle(IO_PORTH_03, CH0_PLNK0_SCLK_OUT); //SCLK0使用outputchannel0
JL_IOMAP->CON3 |= BIT(18); //PLNK0 SCLK0 输出使能,若使用PLNK1数字麦1,JL_IOMAP->CON3 |= BIT(19)
}
//解除重映射
static void plnk0_port_unremap_cb(void)
{
JL_IOMAP->CON3 &= ~BIT(18); //PLNK0 SCLK0 输出失能 若使用PLNK1数字麦1,JL_IOMAP->CON3 &= ~BIT(19);
gpio_clear_output_channle(IO_PORTH_03, CH0_PLNK0_SCLK_OUT); //释放outputchannel0
gpio_set_die(IO_PORTH_02, 0); //数字/模拟输入切换
}
//plnk的时钟和数据引脚都采用重映射的使用例子
static const struct plnk_platform_data plnk0_data = {
.hw_channel = PLNK_CH_MIC_L, //使用DAT0输入
.clk_out = 1, //使能时钟输出
.port_remap_cb = plnk0_port_remap_cb, //重映射
.port_unremap_cb = plnk0_port_unremap_cb, //解除重映射
.sample_edge = 0, //在CLK的下降沿采样左MIC,上升沿采样右MIC
.share_data_io = 1, //两个数字MIC共用一个DAT脚
.high_gain = 1, //强增益输出
.dc_cancelling_filter = 14, //去直流滤波器
.dump_points_num = 640, //丢弃刚打开硬件时的数据点数
};
9.4.3. 常见问题
Note
检查设置的采样边沿是否和接入的数字麦的datasheet说明是否一致
设置的IO重映射是否正确
不共用DAT脚时,可使用DAT0和DAT1两个通道,设置hw_channel = PLNK_CH_MIC_L | PLNK_CH_MIC_R
9.4.4. API参考
可使用PDMLINK模块数量
-
MAX_PLNK_NUM
可使用PDMLINK的模块数量
输入通道选择
-
PLNK_MIC_MASK
-
PLNK_CH_MIC_L
两个MIC共用DAT0也使用该宏
-
PLNK_CH_MIC_R
两个MIC共用DAT1也使用该宏
-
PLNK_CH_MIC_DOUBLE
-
int plnk_open(const struct plnk_platform_data *pd, u8 index)
初始化PLNK
- Parameters
pd – plnk配置参数结构体参数指针
index – 0:plnk0 1:plnk1
- Returns
0: 成功
- Returns
-1: 失败
-
int plnk_start(u8 index)
启动PLNK
- Parameters
index – 0:plnk0 1:plnk1
- Returns
0: 成功
- Returns
-1: 失败
-
int plnk_stop(u8 index)
停止PLNK
- Parameters
index – 0:plnk0 1:plnk1
- Returns
0: 成功
- Returns
-1: 失败
-
int plnk_close(u8 index)
关闭PLNK
- Parameters
index – 0:plnk0 1:plnk1
- Returns
0: 成功
- Returns
-1: 失败
-
int plnk_set_sample_rate(int sample_rate, u8 index)
设置PLNK采样率
- Parameters
sample_rate – 采样率
index – 0:plnk0 1:plnk1
- Returns
0: 成功
- Returns
-1: 失败
-
void plnk_set_handler_cb(void *priv, void (*cb)(void*, u8 *data, int len), u8 index)
设置PLNK中断处理函数中的回调函数,用于处理采集到的数据
- Parameters
priv – 回调函数的私有指针
cb – 回调函数
index – 0:plnk0 1:plnk1
-
void plnk_irq_handler(u8 index)
PLNK中断处理函数
- Parameters
index – 0:plnk0 1:plnk1