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/TM4C1294NCPDT:TM4C1294XL SSI DMA DMA_TX 不会启动

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/744892/ccs-tm4c1294ncpdt-tm4c1294xl-ssi-dma-dma_tx-does-not-initiate

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

大家好、

TM4C 是 SSI 从设备、而其他外设是主设备。 根据从器件就绪、一个 GPIO 信号被初始化至主器件以进行 SPI 通信。

使用下面添加的 DMA 配置、在初始化 ROM_uDMAChannelTransferSet 后、来自 MISO 线路上的数据传输不会启动、并且模式不会更改为 UDMA_MODE_STOP 模式。

ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_SSI0TX | UDMA_PRI_SELECT); 
if (ui32Mode = uDMA_MODE_STOP)

       slave_ready();

以下是 SPI 和 DMA 配置的片段初始化、 MasterReadyIntHandler 处理程序配置为 SPI 主 MCU 的 GPIO 线路。

//
//
//数据就绪的主控中断处理程序
//
//*********
void
MasterReadyIntHandler (void)
{
uint32_t ui32Status;
ui32Status = ROM_GPIOIntStatus (GPIO_PORTN_BASE、1);
IF (GPIO_PIN_5和 ui32Status)
{
ROM_GPIOIntClear (GPIO_PORTN_BASE、GPIO_PIN_5);
ROM_SSIDisable (BLE_SSI_base);
ROM_uDMAChannelTransferSet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、
(void *)(SSI0_BASE + SSI_O_DR)、
G_ui8SSIRxBuf、
8);
ROM_uDMAChannelTransferSet (UDMA_CHANGE_SSI0TX | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、
FFT_OUT、
(void *)(SSI0_BASE + SSI_O_DR)、
8);// sizeof (FFT_OUT)
uDMAChannelAssign (UDMA_CH11_SSI0TX);
uDMAChannelEnable (UDMA_CH11_SSI0TX);
uDMAChannelAssign (UDMA_CH10_SSI0RX);
uDMAChannelEnable (UDMA_CH10_SSI0RX);
ROM_SSIEnable (BLE_SSI_base);

}
}

void SSI0_DMA_Init (void)
{
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

ROM_SysCtlPeripheralDisable (SYSCTL_Periph_UDMA);
SYSCTL_SysCtlPeripalReset (SYSCTL_OPTL_OPTM_);SYSCTMA_SysCtlPeripheralDisable (SYSCTL_UPTM_外设
);SYSCTL_OPTM_
ROM_SysCtlDelay (10);

ROM_IntEnable (INT_UDMAERR);

//
////指向控制表以用于通道控制结构体。
//
ROM_uDMAControlBaseSet (pui8ControlTable);

GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);

ROM_GPIOPinTypeSSI (GPIO_PORta_base、GPIO_PIN_2);
ROM_GPIOPinTypeSSI (GPIO_PORta_base、GPIO_PIN_3);
ROM_GPIOPinTypeSSI (GPIO_PORta_base、 GPIO_PIN_4);
ROM_GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5);

MAP_GPIOConfigPadSet (GPIO_Porta_base、GPIO_PIN_2、
GPIO_Strength _4mA、GPIO_PIN_TYPE_STD_WPU);
MAP_GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_3、
GPIO_Strength _4mA、 GPIO_PIN_TYPE_STD);
MAP_GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_4、
GPIO_Strength _4mA、GPIO_PIN_TYPE_STD);
MAP_GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_5、
GPIO_Strength _4mA、GPIO_PIN_TYPE_STD);

//配置 SSI0端口*/
ROM_SSIConfigSetExpClk (BLE_SSI_base、g_ui32SysClock、
SSI_FRF_MOTO_MODE_0、SSI_MODE_0、8SPI_SLAVE、SSI_MODE、8000000 8);
//ROM_SSIAdvModeSet (BLE_SSI_base、SSI_ADV_MODE_READ_WRITE);
ROM_SSIAdvModeSet (BLE_SSI_base、SSI_ADV_MODE_LEGACLE);

ROM_SSIEnable (BLE_SSI_base);

//从器件就绪引脚初始化
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_GPIOH))
{
}
ROM_GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、GPIO_PIN_2);
MAP_GPIOPadConfigSet (GPIO_Porth_BASE、GPIO_PIN_2、
GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);

//
//uDMA Init
//

SSIDMAEnable (SSI0_BASE、SSI_DMA_RX | SSI_DMA_TX);

//
//uDMA SSI0 RX
//

//
//将 UDMA SSI0RX 通道的属性置于已知状态。 这些
默认情况下、//应已禁用。
//
ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_SSI0RX、
UDMA_PRI_SELECT |
(UDMA_ATTR_HIGH_PRIOR|
uDMA_attr_REQMASK);

//
//为配置主控制结构体的控制参数
// SSIORX 通道。
//
ROM_uDMAChannelControlSet (UDMA_CHANGE_SSI0RX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);


//
//uDMA SSI0_BASE TX
//

//
//将 UDMA SSI0TX 通道的属性置于已知状态。 这些
默认情况下、//应已禁用。
//
ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_SSI0TX、
UDMA_PRI_SELECT |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);

//
//设置 UDMA SSI0TX 通道的 USEBURST 属性。 这将会
//强制控制器在传输数据时始终使用突发
//将 TX 缓冲器连接到 SSI0。 这是比较有效的总线使用
//不是允许单次或突发传输的默认值。
//
ROM_uDMAChannelAttributeEnable (UDMA_CHANGE_SSI0TX、UDMA_ATTR_USEBURST);

//
//配置 SSI0 TX 的控制参数。
//
ROM_uDMAChannelControlSet (UDMA_CHANGE_SSI0TX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
UDMA_ARB_4);

}

如果我对 DMA 的使用有正确的理解、请告诉我。

此致、

Kiran

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Kiran、

    明显缺失的一个功能是:

    ROM_uDMAEnable(); 

    此外、如果您希望 SSI 模块脱离中断运行、则会丢失启用 SSI 中断的代码。