3120|0

9798

帖子

24

TA的资源

版主

楼主
 

为SensorTile添加一颗外部麦克风实现双通道输入 [复制链接]

 
使用STSW-STLKT01_V1.3.1AudioLoop例程
SensorTile上有一颗数字麦克风数字引脚通过PB6->DATA,PC2->CLK连接
L/R接在GND上,数据在CLK上升沿读取
PB6SensorTile内部连接,没有外接引脚所以不能把新增麦克风挂在这个引脚通过一条数据线读取
main.cAUDIO_CHANNELS决定了麦克风的数量,默认为1
AUDIO_CHANNELS1DFSDM模块通过PB6读取板子上的麦克风数据
AUDIO_CHANNELS2时通过PB6读取外部2个麦克风数据,
AUDIO_CHANNELS34时除了通过PB6读取外部2个麦克风数据还通过PC0读取另外2个外部麦克风数据,实现4通道输入
DFSDM 数据线CLKDATA同时挂2颗麦克风
一个麦克风L/RGNDDFSDM模块在CLK上升沿读取DATA数据
另一个L/RVDDDFSDM模块在CLK下降沿读取数据
我手头上只有一颗数字麦克风评估板想实现双通道就要同时使用板子上的麦克风和外接麦克风

AUDIO_CHANNELS2时,代码没有对板子上的MP34DT04连接的引脚初始化,需要对代码做些修改
让板子上的MP34DT04和外接的数字麦克风共用PC2做为时钟,PB6做为MP34DT04DATA数据线,PB8做为外接麦克风的DATA数据线
修改后的代码如下:
因为我的麦克风开发板L/R是接在VDD的,所以要个性haudio_in_dfsdmchannel[1].Init.SerialInterface.Type DFSDM_CHANNEL_SPI_FALLING;

  1.   uint16_t shift_amount = 0;
  2.   uint32_t SincOrder = 0;
  3.   if(OverSampling(AudioFreq) == 32)
  4.   {
  5.     shift_amount = 5;
  6.     SincOrder = DFSDM_FILTER_SINC5_ORDER;
  7.   }
  8.   else if(OverSampling(AudioFreq) == 128)
  9.   {
  10.     shift_amount = 8;
  11.     SincOrder = DFSDM_FILTER_SINC4_ORDER;
  12.   }
  13.   else if(OverSampling(AudioFreq) == 64)
  14.   {
  15.     shift_amount = 10;
  16.     SincOrder = DFSDM_FILTER_SINC5_ORDER;
  17.   }
  18.   else if(OverSampling(AudioFreq) == 256)
  19.   {
  20.     shift_amount = 4;
  21.     SincOrder = DFSDM_FILTER_SINC3_ORDER;
  22.   }

  23.   if (ChnlNbr >= 1)
  24.   {
  25.     /*####AUDIO CH 1: DFSDM CHANNEL 2####*/
  26.     haudio_in_dfsdmchannel[0].Init.OutputClock.Activation   = ENABLE;
  27.     haudio_in_dfsdmchannel[0].Init.OutputClock.Selection    = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
  28.     /* Set the DFSDM clock OUT audio frequency configuration */
  29.     haudio_in_dfsdmchannel[0].Init.OutputClock.Divider      = ClockDivider(AudioFreq);
  30.     haudio_in_dfsdmchannel[0].Init.Input.Multiplexer        = DFSDM_CHANNEL_EXTERNAL_INPUTS;
  31.     haudio_in_dfsdmchannel[0].Init.Input.DataPacking        = DFSDM_CHANNEL_STANDARD_MODE;
  32.     haudio_in_dfsdmchannel[0].Init.Input.Pins               = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
  33.     haudio_in_dfsdmchannel[0].Init.SerialInterface.Type     = DFSDM_CHANNEL_SPI_RISING;
  34.     haudio_in_dfsdmchannel[0].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
  35.     haudio_in_dfsdmchannel[0].Init.Awd.FilterOrder          = DFSDM_CHANNEL_SINC1_ORDER;
  36.     haudio_in_dfsdmchannel[0].Init.Awd.Oversampling         = 10;
  37.     haudio_in_dfsdmchannel[0].Init.Offset                   = 0;
  38.     haudio_in_dfsdmchannel[0].Init.RightBitShift            = shift_amount;
  39.     haudio_in_dfsdmchannel[0].Instance                      = DFSDM_Channel5;
  40.    
  41.     if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[0]) == HAL_DFSDM_CHANNEL_STATE_RESET)
  42.     {
  43.       /* Init the DFSDM Channel */
  44.       GPIO_InitTypeDef GPIO_InitStruct;
  45.      
  46.       /* Enable DFSDM clock */
  47.       AUDIO_IN_DFSDM_CLK_ENABLE();
  48.       /* Enable GPIO clock */
  49.       AUDIO_IN_DFSDM_CKOUT_GPIO_CLK_ENABLE();
  50.       AUDIO_IN_DFSDM_CH12_DATAIN_GPIO_CLK_ENABLE();
  51.      
  52.       /* DFSDM pins configuration: DFSDM_CKOUT, DMIC_DATIN pins ------------------*/
  53.       GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CKOUT_PIN;
  54.       GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  55.       GPIO_InitStruct.Pull = GPIO_NOPULL;
  56.       GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  57.       GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
  58.       HAL_GPIO_Init(AUDIO_IN_DFSDM_CKOUT_GPIO_PORT, &GPIO_InitStruct);
  59.      
  60.       GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CH12_DATIN_PIN;
  61.       GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  62.       GPIO_InitStruct.Pull = GPIO_NOPULL;
  63.       GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  64.       GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
  65.       HAL_GPIO_Init(AUDIO_IN_DFSDM_CH12_DATIN_GPIO_PORT, &GPIO_InitStruct);
  66.     }
  67.    
  68.     if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[0]))
  69.     {
  70.       return AUDIO_ERROR;
  71.     }
  72.    
  73.     /*####AUDIO CH 1: FILTER 0####*/
  74.     haudio_in_dfsdmfilter[0].Init.RegularParam.Trigger         = DFSDM_FILTER_SW_TRIGGER;
  75.     haudio_in_dfsdmfilter[0].Init.RegularParam.FastMode        = ENABLE;
  76.     haudio_in_dfsdmfilter[0].Init.RegularParam.DmaMode         = ENABLE;
  77.     haudio_in_dfsdmfilter[0].Init.InjectedParam.Trigger        = DFSDM_FILTER_SW_TRIGGER;
  78.     haudio_in_dfsdmfilter[0].Init.InjectedParam.ScanMode       = DISABLE;
  79.     haudio_in_dfsdmfilter[0].Init.InjectedParam.DmaMode        = DISABLE;
  80.     haudio_in_dfsdmfilter[0].Init.InjectedParam.ExtTrigger     = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
  81.     haudio_in_dfsdmfilter[0].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
  82.     haudio_in_dfsdmfilter[0].Init.FilterParam.SincOrder        = SincOrder;
  83.     /* Set the DFSDM Filters Oversampling to have correct sample rate */
  84.     haudio_in_dfsdmfilter[0].Init.FilterParam.Oversampling     = OverSampling(AudioFreq);
  85.     haudio_in_dfsdmfilter[0].Init.FilterParam.IntOversampling  = 1;
  86.     haudio_in_dfsdmfilter[0].Instance                          = AUDIO_IN_DFSDM_1st_FILTER;
  87.    
  88.     if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[0]) == HAL_DFSDM_FILTER_STATE_RESET)
  89.     {
  90.       /* Init the DFSDM Filter */
  91.       DFSDMx_FilterMspInit(&haudio_in_dfsdmfilter[0]);
  92.     }
  93.    
  94.     if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[0]))
  95.     {
  96.       return AUDIO_ERROR;
  97.     }
  98.    
  99.     /* Configure injected channel */
  100.     if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[0], DFSDM_CHANNEL_5, DFSDM_CONTINUOUS_CONV_ON))
  101.     {
  102.       return AUDIO_ERROR;
  103.     }
  104.   }
  105.     if (ChnlNbr >= 2)
  106.     {
  107.      
  108.       /*####AUDIO CH 1: DFSDM CHANNEL 2####*/
  109.       haudio_in_dfsdmchannel[1].Init.OutputClock.Activation   = ENABLE;
  110.       haudio_in_dfsdmchannel[1].Init.OutputClock.Selection    = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
  111.       /* Set the DFSDM clock OUT audio frequency configuration */
  112.       haudio_in_dfsdmchannel[1].Init.OutputClock.Divider      = ClockDivider(AudioFreq);
  113.       haudio_in_dfsdmchannel[1].Init.Input.Multiplexer        = DFSDM_CHANNEL_EXTERNAL_INPUTS;
  114.       haudio_in_dfsdmchannel[1].Init.Input.DataPacking        = DFSDM_CHANNEL_STANDARD_MODE;
  115.       haudio_in_dfsdmchannel[1].Init.Input.Pins               = DFSDM_CHANNEL_SAME_CHANNEL_PINS;
  116.       haudio_in_dfsdmchannel[1].Init.SerialInterface.Type     = DFSDM_CHANNEL_SPI_FALLING;
  117.       haudio_in_dfsdmchannel[1].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
  118.       haudio_in_dfsdmchannel[1].Init.Awd.FilterOrder          = DFSDM_CHANNEL_SINC1_ORDER;
  119.       haudio_in_dfsdmchannel[1].Init.Awd.Oversampling         = 10;
  120.       haudio_in_dfsdmchannel[1].Init.Offset                   = 0;
  121.       haudio_in_dfsdmchannel[1].Init.RightBitShift            = shift_amount;
  122.       haudio_in_dfsdmchannel[1].Instance                      = DFSDM_Channel6;
  123.      
  124.       if(HAL_DFSDM_ChannelGetState(&haudio_in_dfsdmchannel[1]) == HAL_DFSDM_CHANNEL_STATE_RESET)
  125.       {
  126.         /* Init the DFSDM Channel msp */  
  127.         GPIO_InitTypeDef GPIO_InitStruct;
  128.       
  129.         AUDIO_IN_DFSDM_CH12_EXT_DATAIN_GPIO_CLK_ENABLE();
  130.         GPIO_InitStruct.Pin = AUDIO_IN_DFSDM_CH12_EXT_DATIN_PIN;
  131.         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  132.         GPIO_InitStruct.Pull = GPIO_NOPULL;
  133.         GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  134.         GPIO_InitStruct.Alternate = AUDIO_IN_DFSDM_CKOUT_DATIN_AF;
  135.         HAL_GPIO_Init(AUDIO_IN_DFSDM_CH12_EXT_DATIN_GPIO_PORT, &GPIO_InitStruct);
  136.       }
  137.      
  138.       if(HAL_OK != HAL_DFSDM_ChannelInit(&haudio_in_dfsdmchannel[1]))
  139.       {
  140.         return AUDIO_ERROR;
  141.       }
  142.      
  143.       /*####AUDIO CH 1: FILTER 0####*/
  144.       haudio_in_dfsdmfilter[1].Init.RegularParam.Trigger         = DFSDM_FILTER_SYNC_TRIGGER;;
  145.       haudio_in_dfsdmfilter[1].Init.RegularParam.FastMode        = ENABLE;
  146.       haudio_in_dfsdmfilter[1].Init.RegularParam.DmaMode         = ENABLE;
  147.       haudio_in_dfsdmfilter[1].Init.InjectedParam.Trigger        = DFSDM_FILTER_SW_TRIGGER;
  148.       haudio_in_dfsdmfilter[1].Init.InjectedParam.ScanMode       = DISABLE;
  149.       haudio_in_dfsdmfilter[1].Init.InjectedParam.DmaMode        = DISABLE;
  150.       haudio_in_dfsdmfilter[1].Init.InjectedParam.ExtTrigger     = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
  151.       haudio_in_dfsdmfilter[1].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
  152.       haudio_in_dfsdmfilter[1].Init.FilterParam.SincOrder        = SincOrder;
  153.       /* Set the DFSDM Filters Oversampling to have correct sample rate */
  154.       haudio_in_dfsdmfilter[1].Init.FilterParam.Oversampling     = OverSampling(AudioFreq);
  155.       haudio_in_dfsdmfilter[1].Init.FilterParam.IntOversampling  = 1;
  156.       haudio_in_dfsdmfilter[1].Instance                          = AUDIO_IN_DFSDM_3rd_FILTER;
  157.      
  158.       if(HAL_DFSDM_FilterGetState(&haudio_in_dfsdmfilter[1]) == HAL_DFSDM_FILTER_STATE_RESET)
  159.       {
  160.         /* Init the DFSDM Filter */
  161.         DFSDMx_FilterMspInit(&haudio_in_dfsdmfilter[1]);
  162.       }
  163.      
  164.       if(HAL_OK != HAL_DFSDM_FilterInit(&haudio_in_dfsdmfilter[1]))
  165.       {
  166.         return AUDIO_ERROR;
  167.       }
  168.      
  169.       /* Configure injected channel */
  170.       if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&haudio_in_dfsdmfilter[1], DFSDM_CHANNEL_6, DFSDM_CONTINUOUS_CONV_ON))
  171.       {
  172.         return AUDIO_ERROR;
  173.       }
  174.     }
复制代码
main.c中除了将AUDIO_CHANNELS修改为2还需要修改AudioProcess函数
因为1麦克风时PCM_Buffer保存的数据都是通道1的数据
2个麦克风时PCM_Buffer为麦克风1和麦克风2的数据交替存储
修改为下边代码才能实现板载麦克风通过左声道播放,外接麦克风通道右声道播放
  1.   for(indexIn=0;indexIn<AUDIO_IN_BUF_LEN;indexIn+=2)
  2.   {
  3.     audio_out_buffer[IndexOut++] = PCM_Buffer[indexIn];
  4.     audio_out_buffer[IndexOut++] = PCM_Buffer[indexIn+1];
  5.   }
复制代码

点赞 关注(1)
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表