请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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