This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好、
´m 我对 spma042b.pdf 文件中描述的 I2S 接口进行仿真、所以我希望两个 SSI 模块(SSI0和 SSI3)在乒乓模式下使用2个具有2 μ µDMA 的 SSI 模块。 SSI0从左通道开始、SSI3从右通道开始。 但 SSI0只能传输数据、SSI3不能n´t 进入中断状态。 您有什么提示吗?
// main.c #pragma DATA_SECTION (inbuffera1、".data") 外部的缓冲区定义 static uint16_t inbuffera1[a1_size]; #pragma DATA_SECTION (inbuffera2、".data") static uint16_t inbuffera2[buffersum_size]; #pragma outbufferbufferbufferbuffersize"(inbufferbufferbufferbufferbufferbufferbufferbufferbuint1 、ines2 ) 、inature_outuint2、inature_outuint2、inbufferbuffersize) inbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbufferbuffer #ucma data_section (outbufferb2、".data") static uint16_t outbufferb2[buff_size]; // uDMA 控制表与 main.c 外部的1024字节边界对齐 #pragma DATA_ALIGN (ucControlTable、1024) uint16_t ControlTable[1024]; //在 main.c 内调用的函数 {upragma i_SS0_void (void) uint32_t ui32Status; uint32_t ui32模式; ui32Status = SSIIntStatus (SSI0_BASE、1); SSIIntClear (SSI0_BASE、ui32Status); ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT); if (ui32Mode = uDMA_MODE_STOP) { //wssus (inbuffera1、outbuffera1); G_ui32SSIRxPingCount++; uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、inbuffera1、sizeof (inbuffera1)); } ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_SSI0RX | UDMA_ALT_SELECT); if (ui32Mode = uDMA_MODE_STOP) { //wssus (inbuffera2、outbuffera2); G_ui32SSIRxPongCount++; uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、inbuffera2、sizeof (inbuffera2)); } ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_SSI0TX | UDMA_PRI_SELECT); if (ui32Mode = UDMA_MODE_STOP) { g_ui32SSITxCount+; uDMAT_PbufferTransferSet (UALT_CHANGE_SSI0+ )、USSO_TS_OUTAM_SIMP_FO+(USSIP_OUTAG_OUTAG_OUTAG_OUTAG_OUTAG_OUTAG_OUTMP_OUTMP_OUTMP_OUT+)(UTS_OUTDA_OUTMP_OUTAG_OUTAG_OUTMP_OUTAG_OUTAG_OUTMP_OUTAG_OUTDA_OUTMP_OUTMP_OUTMP_OUTMP_OUTMP_OUTK_MODE_OUTK_MODE_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTDA_OUTK_ uint32_t ui32Status; uint32_t ui32模式; ui32Status = SSIIntStatus (SSI3_base、1); SSIIntClear (SSI3_base、ui32Status); ui32Mode = uDMAChannelModeGet (UDMA_CH14_SSI3RX | UDMA_PRI_SELECT); if (ui32Mode = uDMA_MODE_STOP) { //wssus (inbufferb1、outbufferb1); G_ui32SSIRxPingCount++; uDMAChannelTransferSet (UDMA_CH14_SSI3RX | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(SSI3_base + SSI_O_DR)、inbuerberb1、sizeof (inbufferb1)); } ui32Mode = uDMAChannelModeGet (UDMA_CH14_SSI3RX | UDMA_ALT_SELECT); if (ui32Mode = uDMA_MODE_STOP) { //wssus (inbufferb2、outbufferb2); G_ui32SSIRxPongCount++; uDMAChannelTransferSet (UDMA_CH14_SSI3RX | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(SSI3_base + SSI_O_DR)、inbuerberb2、sizeof (inbufferb2)); } ui32Mode = uDMAChannelModeGet (UDMA_CH15_SSI3TX | UDMA_PRI_SELECT); if (ui32Mode = UDMA_MODE_STOP) { g_ui32SSITxerbCount++; uDMAChannelTransferSet (UDMA_CH15_SSI1+ )、USSI3+ UDMA_bout1 (UDMA_bout1)= uSDA_ud_uTS_ud_uTS_uSDK_DPSIMP_EP_EP_USS+(uSDK_0、U300_DPSIMP_EP_USSIP_EP_USS_EP_EP_EP_USSIP_EP_USS_EP_EP_EP_EP_EP_USSIP_EP_USS_USS_UCC_EP_EP_EP_EP_EP_EP_0 (uSDK_0);u32_USSIP_EP_EP_EP_EP_USSIP_EP_USS_USS_USS_UCC_USS_U300_EP_ } //初始化 SSI UDMA 传输 空 Init_SSI0_UDMA_Transfer (空) { //启用 UDMA SysCtlPeripheralEnable (SYSCTL_Periph_UDMA); SysCtlPeripheralSleep Enable (SYSCTL_Periph_UDMA); while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA));//等待 UDMA 就绪 IntEnable (INT_UDMAERR);UDBCTL PeripheralReady (UDMAERR );uMAUDMAERR (UDBCTL PeripheralEnable) SSIDMAEnable (SSI0_BASE、SSI_DMA_RX | SSI_DMA_TX);//启用 TX 和 RX 通道。 //HWREG (SSI0_BASE + SSI_O_CR1)|= SSI_CR1_LBM;//回送模式(数据发送到 TX (输出)到 RX (输入))) uDMAChannelAttributeDisable (UDMA_CHANGE_SSI0RX、UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |(UDMA_ATTR_HIGH_PRIORY | UDMA_ATTR_REQMASK));//确保 RX 通道的起点 // //uDMA SSI0 RX Ping // uDMAChannelControlSet (UDMA_CHANNEL_SSI0RX | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_16);//传输元素大小 RX Ping uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、inbuffera1、sizeof (inbuffera1));// RX Ping 的源和目标 // //uDMA SSI0 RX 信号 // uDMAChannelControlSet (UDMA_CHANNEL_SSI0RX | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_16);//传输元素大小 RX Pong uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(SSI0_BASE + SSI_O_DR)、inbuffera2、sizeof (inbuffera2));// RX Poong 的源和目的 uDMAChannelAttributeDisable (UDMA_CHANGE_SSI0TX、UDMA_ATTR_ALTSELECT | UDMA_ATTR_HIGH_PRIORY | UDMA_ATTR_REQMASK);//将属性置于已知状态 uDMAChannelAttributeEnable (UDMA_CHANGE_SSI0TX、UDMA_ATTR_USEBURST);//使用突发模式(传输、当 RX FIFO 中有4个或更多项目时) // //uDMA SSI0 TX Ping // uDMAChannelControlSet (UDMA_CHANNEL_SSI0TX | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_16 | UDMA_DST_INC_NONE | UDMA_ARB_16);//传输元素大小 uDMAChannelTransferSet (UDMA_CHANGE_SSI0TX | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、outbuffera1、(void *)(SSI0_BASE + SSI_O_DR)、sizeof (outbuffera1); // //uDMA SSI0 TX 信号 // uDMAChannelControlSet (UDMA_CHANNEL_SSI0TX | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_16 | UDMA_DST_INC_NONE | UDMA_ARC_16); uDMAChannelTransferSet (UDMA_CHANGE_SSI0TX | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、outbuffera2、(void *)(SSI0_BASE + SSI_O_DR)、sizeof (outbuffera2)); uDMAChannelEnable (UDMA_CHANGE_SSI0RX); uDMAChannelEnable (UDMA_CHANGE_SSI0TX); SSIIntEnable (SSI0_BASE、SSI_DMATX | SSI_DMARX);//启用 SSI0 DMA TX/RX 中断。 IntEnable (INT_SSI0);//启用 SSI0外设中断 。} void Init_SSI3_UDMA_Transfer (void) { //uDMAChannelSelectSecondary (); SSIDMAEnable (SSI3_base、SSI_DMA_RX | SSI_DMA_TX);//启用 TX 和 RX 通道。 uDMAChannelAttributeDisable (UDMA_CH14_SSI3RX、UDMA_ATTR_USEBURST | UDMA_ATTR_ALTSELECT |(UDMA_ATTR_HIGH_PRIORY | UDMA_ATTR_REQMASK));//确保 RX 通道的起点 //********* //uDMA SSI3 RX Ping //********* uDMAChannelControlSet (UDMA_CH14_SSI3RX | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_16);//传输元素大小 RX Ping uDMAChannelTransferSet (UPRI_CH14_INC) *、UDMA_INDBIN3 (UDS_EP_EP_EP_0);//缓冲区1 (UDMA_INDS_INDS_INDC_IN_EP_EP_EP_0)* //uDMA SSI3 RX Poong //********* uDMAChannelControlSet (UDMA_CH14_SSI3RX | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_16);//传输元素大小 RX uDMA_SDK_ENABLE_USTR_USTR_ENABLE_TR_USTR_INTS_TR_TR_ENTR_USTR_TR_ENTR_ENTR_USTR_TR_ENTR_ENTR_USTR_TR_ENTR_TR_ENTR_USTR_INTS_TRIP_TR_TRIP_TR_TR_TR_TR_TR_ENDAM_TRIP_TR_TR_TR_TR_TR_TRIP_TR_ENDAM_TR_TR_TR_TRIP_TR_TR_TRIP_TR_TR_TRIP_TR_ENDAM_TRIP_EN/ UDMA_INTS_TRIP_TRIP_TRIP_TRIP_TR_TR_TRIP_TR_TR_TR_TRIP_TR_EN //使用突发模式(当4个或更多项目处于 RX FIFO 中时进行传输) //********* //uDMA SSI3 TX Ping //********* uDMAChannelControlSet (UDMA_CH15_SSI3TX | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_16 | UDMA_DST_INC_NONE | UDMA_ARB_16);//传输元素大小 uDMAChannelTransferSet (UPRI_CH15_ISDK_INC_NONE | UDMA_SDK_3);// bufferbout1 (UDMA_dma_dma_dma_dma_out1)+输出模式(Udma_dma_dma_out1)* //uDMA SSI3 TX Poong //********* uDMAChannelControlSet (UDMA_CH15_SSI3TX | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_16 | UDMA_DST_INC_NONE | UDMA_ARB_16); uDMAChannelTransferSet (UDMA_CH15_SSI3TX | UDMA_ENABLE_UST_USSI2_ENABLE_DP_16);uDMA_ENABLE_DPSIMP_AM_IN_INT_USSINTCANTE_14 (USSINT_USSI3 (USSINT_USSINT_USSINT_USSINT_USSINT_UDP_3);uSDK_ENABLE_DP_ENABLE_DP_3 (USSINT_USSINT_USSINT_USSINT_USSIN_INT_USSIN_3 (USSINT_USS SSI_DMATX | SSI_DMARX);//启用 SSI3 DMA TX/RX 中断。 IntEnable (INT_SSI3);//启用 SSI0外设中断 。} void Init_SSI (void) { SSI0的// GPIO 设置 SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); SysCtlPeripheralSlepEnable (SYSCTL_Periph_SSI0); GPIOPinConfigure (GPIO_PA2_SSI0CLK); GPIOPinConfigure (GPIO_PA3_SSI0FSS); GPIOPinConfigure (GPIO_PA4_SSI0RX); GPIOPinConfigure (GPIO_PA5_SSI0TX); GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2); SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_SLAVE、10000、 16); SSIEnable (SSI0_BASE); //针对 SSI3 SysCtlPeripheralEnable (SYSCTL_Periph_SSI3)的 GPIO 设置; SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); SysCtlPeripheralSlepEnable (SYSCTL_Periph_SSI3); GPIOPinConfigure (GPIO_PD0_SSI3CLK);SysCtlPeripheralSleep ( GPIO1);GPIOPinP3CLK (GPIO1);GPIO 配置 GPIO1 GPIOPinConfigure (GPIO_PD2_SSI3RX); GPIOPinConfigure (GPIO_PD3_SSI3TX); GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3); SSIConfigExpClk (SSI3_base、SysSetClk) SSI_FRF_MOTO_MODE_0、SSI_MODE_SLAVE、10000、16); SSIEnable (SSI3_base); } //在 main.c 内调用 FPULazyStackingEnable(); //将 CPU 时钟设置为80MHz。 400MHz PLL/2 = 200 DIV 2.5 = 80MHz SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN); SysCtlPeripheralClockGating (真); init_AIC3104(); init_ssi(); init_SSI0_UDMA_Transfer(); init_SSI3_uDMA_Transfer(); BIOS_start();
[´m 用户="Spadullah Zeyrek"]我对 I2S-interface 进行仿真[/quot]
也许-考虑到您的明确努力(所呈现的大量代码)、提出以下问题证明是有用的:
您应该知道、(偶数) Cortex M0级 MCU 包含(适当的) I2S 接口-当"将(功能丧失)器件弯曲/弯曲(某些)合规性"时、"较低(仿真)的性能"和额外的工作能否充分/正确地理解? 您是否应该首先寻求(部分)您的"最低功能要求"的"规范"、以便证明这种努力是合理的?
请注意、您参考了一个"tech-doc"-希望(部分)中包含"预期性能数据"的列表。 (如果不是-这不是"告诉?")
通过使用包含"本机 I2S"的 MCU、然后(有意)降低其性能、您可以"精益"最小性能 I2S 规格、从而发现应用可能需要的"规格级别..."。
仿真(任何仿真)通常不能接近"原始"来表示"速度、功能完整性、使用清晰度和稳健性"、因此在"启动此类工作"之前"应执行分析"。 (尤其是当"要仿真的候选函数为"活而好、原生形式!"时)
您好 CB1_MOBILE、
我将 TM4C123GH6PM 与 AIC3104音频编解码器搭配使用。 n´t 此微控制器没有 I2S 接口、我需要使用 TOW SPI 模块来模拟 I2S。
我已经有了解决方案。
uDMAChannelAssign (UDMA_CH14_SSI3RX); uDMAChannelAssign (UDMA_CH15_SSI3TX);
有了此功能、它就可以工作了!