在线时间350 小时
UID1575830
注册时间2015-1-20
NXP金币0
TA的每日心情 | 郁闷 2018-2-7 18:18 |
---|
签到天数: 5 天 连续签到: 1 天 [LV.2]偶尔看看I
金牌会员
 
- 积分
- 1628
- 最后登录
- 2021-7-13
|
lpc54114 SKD DMIC DMA examples疑问:
从DATA sheet 上看 lpc54114 DMIC FIFO数据寄存器是32位的,为什么例子中的数据Buffer定义位16位的呢?
十分不解!
*/
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "board.h"
#include "fsl_dmic.h"
#include "fsl_dma.h"
#include "fsl_dmic_dma.h"
#include <stdlib.h>
#include <string.h>
#include "pin_mux.h"
#include <stdbool.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define DMAREQ_DMIC0 16U
#define DMAREQ_DMIC1 17U
#define APP_DMAREQ_CHANNEL DMAREQ_DMIC0
#define APP_DMIC_CHANNEL kDMIC_Channel0
#define APP_DMIC_CHANNEL_ENABLE DMIC_CHANEN_EN_CH0(1)
#define FIFO_DEPTH 15U
#define BUFFER_LENGTH 32U
/*******************************************************************************
* Prototypes
******************************************************************************/
/* DMIC user callback */
void DMIC_UserCallback(DMIC_Type *base, dmic_dma_handle_t *handle, status_t status, void *userData);
/*******************************************************************************
* Variables
******************************************************************************/
uint16_t g_rxBuffer[BUFFER_LENGTH] = {0};
dmic_dma_handle_t g_dmicDmaHandle;
dma_handle_t g_dmicRxDmaHandle;
volatile bool g_Transfer_Done = false;
/*******************************************************************************
* Code
******************************************************************************/
/* DMIC user callback */
void DMIC_UserCallback(DMIC_Type *base, dmic_dma_handle_t *handle, status_t status, void *userData)
{
userData = userData;
if (status == kStatus_DMIC_Idle)
{
g_Transfer_Done = true;
}
}
//------------------------------------------------------------------------------
// main application
//------------------------------------------------------------------------------
int main(void)
{
dmic_channel_config_t dmic_channel_cfg;
dmic_transfer_t receiveXfer;
uint32_t i;
/* Board pin, clock, debug console init */
CLOCK_EnableClock(kCLOCK_InputMux);
CLOCK_EnableClock(kCLOCK_Gpio0);
CLOCK_EnableClock(kCLOCK_Gpio1);
/* USART0 clock */
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
/* DMIC uses 12MHz FRO clock */
CLOCK_AttachClk(kFRO12M_to_DMIC);
/*12MHz divided by 5 = 2.4MHz PDM clock --> gives 48kHz sample rate */
/*12MHz divided by 15 = 800 KHz PDM clock --> gives 16kHz sample rate */
CLOCK_SetClkDiv(kCLOCK_DivDmicClk, 14, false);
BOARD_InitPins();
BOARD_BootClockFROHF48M();
BOARD_InitDebugConsole();
dmic_channel_cfg.divhfclk = kDMIC_PdmDiv1;
dmic_channel_cfg.osr = 25U;
dmic_channel_cfg.gainshft = 2U;
dmic_channel_cfg.preac2coef = kDMIC_CompValueZero;
dmic_channel_cfg.preac4coef = kDMIC_CompValueZero;
dmic_channel_cfg.dc_cut_level = kDMIC_DcCut155;
dmic_channel_cfg.post_dc_gain_reduce = 1;
dmic_channel_cfg.saturate16bit = 1U;
dmic_channel_cfg.sample_rate = kDMIC_PhyFullSpeed;
DMIC_Init(DMIC0);
DMIC_ConfigIO(DMIC0, kDMIC_PdmDual);
DMIC_Use2fs(DMIC0, true);
DMIC_SetOperationMode(DMIC0, kDMIC_OperationModeDma);
DMIC_ConfigChannel(DMIC0, APP_DMIC_CHANNEL, kDMIC_Left, &dmic_channel_cfg);
DMIC_FifoChannel(DMIC0, APP_DMIC_CHANNEL, FIFO_DEPTH, true, true);
DMIC_EnableChannnel(DMIC0, APP_DMIC_CHANNEL_ENABLE);
PRINTF("Configure DMA\r\n");
DMA_Init(DMA0);
DMA_EnableChannel(DMA0, APP_DMAREQ_CHANNEL);
/* Request dma channels from DMA manager. */
DMA_CreateHandle(&g_dmicRxDmaHandle, DMA0, APP_DMAREQ_CHANNEL);
/* Create DMIC DMA handle. */
DMIC_TransferCreateHandleDMA(DMIC0, &g_dmicDmaHandle, DMIC_UserCallback, NULL, &g_dmicRxDmaHandle);
receiveXfer.dataSize = 2 * BUFFER_LENGTH;
receiveXfer.data = g_rxBuffer;
PRINTF("Buffer Data before transfer \r\n");
for (i = 0; i < BUFFER_LENGTH; i++)
{
PRINTF("%d\r\n", g_rxBuffer);
}
DMIC_TransferReceiveDMA(DMIC0, &g_dmicDmaHandle, &receiveXfer, APP_DMIC_CHANNEL);
/* Wait for DMA transfer finish */
while (g_Transfer_Done == false)
{
}
PRINTF("Transfer completed\r\n");
PRINTF("Buffer Data after transfer \r\n");
for (i = 0; i < BUFFER_LENGTH; i++)
{
PRINTF("%d\r\n", g_rxBuffer);
}
while (1)
{
}
}
最佳答案
本帖最后由 okwh 于 2017-8-9 09:55 编辑
pythonworld 发表于 2017-8-8 18:15
感谢回复我的问题!
应该不是这样,每个通道有各自的FIFO数据寄存器,而且数据寄存器是24位的。 ...
PDM--24bits-->CM--24bits, 但 ...
|
|