我不隐瞒地说我从来就没有跑过I2S的程序。一个是因为工作接触不到这个,再一个因为以前开发板根本就没有这个例程。
但是和泰的这款板子就不一样了。板子上有一个语音芯片,还有一个I2S的例程。等了这么久机会终于来了。
首先,分析一下原理图:
可见,这个原理是可以音频和语音输入的。而S1为两者的切换。再有板子上有一处为显示屏与I2S的跳线。
再分析一下例程:
int main(void)
{
NVIC_Configuration();
CKCU_Configuration();
GPIO_Configuration();
RETARGET_Configuration();
I2CM_Init();
WM8978_Init();
printf("\r\n\r\nHT32 I2S and WM8978 Loopback ...\r\n");
/* Config I2S */
I2S_Configuration();
/* I2S TX */
/* I2S RX */
PDMA_Configuration();
while (1)
{
int i;
while (IsRxTrigLevelReach == FALSE);
IsRxTrigLevelReach = FALSE;
for (i = 0; i < HALF_BUF_SIZE; i++)
{
u32 tmp = RxBuf[AltBuf];
TxBuf[AltBuf] = (tmp & 0xFFFF0000) | (tmp >> 16);
}
}
}
可见只是把收到的内容,输出,而这都只是不经过CPU处理的:
void PDMA_Configuration(void)
{
PDMACH_InitTypeDef PDMACH_InitStructure;
/* I2S TX */
PDMACH_InitStructure.PDMACH_SrcAddr = (u32)&TxBuf[0][0];
PDMACH_InitStructure.PDMACH_DstAddr = (u32)&HT_I2S->TXDR;
PDMACH_InitStructure.PDMACH_AdrMod = (SRC_ADR_LIN_INC | DST_ADR_FIX | AUTO_RELOAD);
PDMACH_InitStructure.PDMACH_BlkCnt = BUF_SIZE/5;
PDMACH_InitStructure.PDMACH_BlkLen = 5;
PDMACH_InitStructure.PDMACH_DataSize = WIDTH_32BIT;
PDMACH_InitStructure.PDMACH_Priority = M_PRIO;
PDMA_Config(PDMA_CH3, &PDMACH_InitStructure);
PDMA_EnaCmd(PDMA_CH3, ENABLE);
I2S_FIFOTrigLevelConfig(I2S_TX_FIFO, 3); // Tx FIFO data '<' or '=' 3
I2S_IntConfig(I2S_INT_TXFIFO_UDF, ENABLE);
I2S_PDMACmd(I2S_PDMAREQ_TX, ENABLE);
/* I2S RX */
PDMACH_InitStructure.PDMACH_SrcAddr = (u32)&HT_I2S->RXDR;
PDMACH_InitStructure.PDMACH_DstAddr = (u32)&RxBuf[0][0];
PDMACH_InitStructure.PDMACH_AdrMod = (SRC_ADR_FIX | DST_ADR_LIN_INC | AUTO_RELOAD);
PDMACH_InitStructure.PDMACH_BlkCnt = BUF_SIZE/5;
PDMACH_InitStructure.PDMACH_BlkLen = 5;
PDMACH_InitStructure.PDMACH_DataSize = WIDTH_32BIT;
PDMACH_InitStructure.PDMACH_Priority = H_PRIO;
PDMA_Config(PDMA_CH2, &PDMACH_InitStructure);
PDMA_IntConfig(PDMA_CH2, (PDMA_INT_GE | PDMA_INT_TC | PDMA_INT_HT), ENABLE);
PDMA_EnaCmd(PDMA_CH2, ENABLE);
I2S_FIFOTrigLevelConfig(I2S_RX_FIFO, 5); // Rx FIFO data '>' or '=' 5
I2S_PDMACmd(I2S_PDMAREQ_RX, ENABLE);
I2S_IntConfig(I2S_INT_RXFIFO_OVF, ENABLE);
I2S_Cmd(ENABLE);
}
那么,好办了,我就用MIC做为输入以耳机做为输出问一下你好吧?
有的看官会问怎么知道是程序的输出的,也许模块就是这样吧?,这很简单就可以证明,我下个不是I2S的程序,从耳机里听不到我手摸迷头的声音。
以下是我用手机,靠近耳机录的音。内容是:“喂!喂!你好你好”,不愿听叫唤的可以绕过。
(下载次数: 3, 2020-8-19 19:49 上传)
用手机播放的截图:
总结一下:和泰的这款开发板,真的不错,和别的总是有点不一样的感觉。给我留了老好的印象,我想将来有机会我得考量一下和泰的芯片。
本帖最后由 ddllxxrr 于 2020-8-20 10:45 编辑
引用: ddllxxrr 发表于 2020-8-20 10:40 在板子上有上跳线,我觉得是
这就有点不香了,这个demo板的MCU是48pin的嘛