您好!
在我的设计中、我需要以500kSPS 的速率从 ADS8900读取数据并将其传输到 Tiva MCU。
我想使用 uDMA 在没有中断的情况下实现它、因为在采集期间 MCU 应处理数据。
任务是:每次我生成一个 CONVST 脉冲时、I neet 开始查询下一个样本、总共4100个样本、然后触发数据处理。
因此、我需要我的计时器通过 UDMA 触发3字节 SSI 传输、并使用另一个通道传输由 SSI 触发的4100 * 3字节。
首先、我在 uDMAChannelEnable 例程中看到一个错误-它可以像看起来一样清洗其他通道使能
HWREG(UDMA_ENASET) = 1 << ui8ChannelNum;
但接下来我看不到任何到 SSI 的传输。 以下是我的代码:
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
GPIOPinConfigure(GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure(GPIO_PE5_SSI1XDAT1);
GPIOPinConfigure(GPIO_PB5_SSI1CLK);
GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_5);
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_4);
GPIOPinTypeSSI(GPIO_PORTE_BASE, GPIO_PIN_5);
SSIConfigSetExpClk(SSI1_BASE, g_ui32SysClock, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 22000000, 8);
SSIAdvModeSet(SSI1_BASE, SSI_ADV_MODE_READ_WRITE);
SSIAdvFrameHoldEnable(SSI1_BASE);
SSIEnable(SSI1_BASE);
SSIDMAEnable(SSI1_BASE, SSI_DMA_RX);
uDMAEnable();
uDMAControlBaseSet(pui8ControlTable);
uDMAChannelAssign(UDMA_CH10_SSI1RX);
uDMAChannelAssign(UDMA_CH0_TIMER4A);
#define UDMA_CHANNEL_TMR4A UDMA_CHANNEL_USBEP1RX
uDMAChannelAttributeDisable(UDMA_CHANNEL_TMR4A, UDMA_ATTR_ALTSELECT | UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
uDMAChannelControlSet(UDMA_CHANNEL_TMR4A | UDMA_PRI_SELECT, UDMA_SIZE_32 | UDMA_SRC_INC_32 | UDMA_DST_INC_NONE | UDMA_ARB_1);
uDMAChannelTransferSet(UDMA_CHANNEL_TMR4A | UDMA_PRI_SELECT, UDMA_MODE_AUTO,
(void *)ADCReq, (void *)(SSI1_BASE + SSI_O_DR), 3);
uDMAChannelAttributeEnable(UDMA_CHANNEL_TMR4A, UDMA_ATTR_USEBURST);
uDMAChannelAttributeDisable(UDMA_CHANNEL_SSI1RX, UDMA_ATTR_ALTSELECT | UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
uDMAChannelControlSet(UDMA_CHANNEL_SSI1RX | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1);
uDMAChannelTransferSet(UDMA_CHANNEL_SSI1RX | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG,
(void *)(SSI1_BASE + SSI_O_DR), (void *)ADCData1, 4100 * 3);
uDMAChannelControlSet(UDMA_CHANNEL_SSI1RX | UDMA_ALT_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1);
uDMAChannelTransferSet(UDMA_CHANNEL_SSI1RX | UDMA_ALT_SELECT, UDMA_MODE_PINGPONG,
(void *)(SSI1_BASE + SSI_O_DR), (void *)ADCData2, 4100 * 3);
HWREG(UDMA_ENASET) = (1 << UDMA_CHANNEL_TMR4A) + (1 << UDMA_CHANNEL_SSI1RX);
GPIOPinTypeTimer(GPIO_PORTL_BASE, GPIO_PIN_4 | GPIO_PIN_5);
GPIOPinConfigure(GPIO_PL4_T0CCP0);
GPIOPinConfigure(GPIO_PL5_T0CCP1);
TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM);
TimerLoadSet(TIMER0_BASE, TIMER_A, g_ui32SysClock / 500000);
TimerMatchSet(TIMER0_BASE, TIMER_A, TimerLoadGet(TIMER0_BASE, TIMER_A) - 10);
//TimerDMAEventSet(TIMER0_BASE, TIMER_DMA_TIMEOUT_A);
TimerLoadSet(TIMER0_BASE, TIMER_B, g_ui32SysClock / 500000);
TimerMatchSet(TIMER0_BASE, TIMER_B, 100);
TimerControlLevel(TIMER0_BASE, TIMER_B, true);
TimerEnable(TIMER0_BASE, TIMER_BOTH);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER4);
TimerConfigure(TIMER4_BASE, TIMER_CFG_PERIODIC);
TimerLoadSet(TIMER4_BASE, TIMER_A, g_ui32SysClock / 500000);
TimerDMAEventSet(TIMER4_BASE, TIMER_DMA_TIMEOUT_A);
TimerEnable(TIMER4_BASE, TIMER_A);
Timer 0A 用于 CONVST 生成、Timer 0B 用于 CS 生成、而 Timer 4应触发 UDMA 传输到 SSI、但不会。
出什么问题了?

