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