TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] CCS/TM4C123GH6PM:两个支持乒乓模式下 UDMA 的 SSI 模块

Guru**** 2046970 points
Other Parts Discussed in Thread: TM4C123GH6PM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/629155/ccs-tm4c123gh6pm-two-ssi-modules-with-udma-in-ping-pong-mode

器件型号:TM4C123GH6PM

工具/软件: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]

    也许-考虑到您的明确努力(所呈现的大量代码)、提出以下问题证明是有用的:

    • "仿真"会使您的工作降低多少
    • RTOS 也是如此

    您应该知道、(偶数) 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); 

    有了此功能、它就可以工作了!