工具/软件:TI-RTOS
您好!
我具有以下 SPI 配置。 当我在示波器上启动一个传输时、我得到一个5字节传输的3个时钟脉冲。 我所使用的代码是经过验证的代码、工作正常。 直到我从较旧 的 BIOS 版本升级以使用新的 TI 驱动程序。 如果我单步执行 SPI 传输、一切看起来都正常、直到代码应该在信标上挂起并等待传输完成。 此时、信号量以超时终止。 因此、传输似乎开始、由于超时、传输在完成前被取消。 为了开始传输(我在示波器上看到)、我假设为了启动传输 、DMA 已将数据传输到 SPI 控制器、因此必须正确配置。 这让我相信信标有问题、由于某种原因未在处理?
/*
*========================================= SPI ========================================================
*
/*放入子段以允许 TI 链接器正确删除项目*/
#if defined (__TI_Compiler_version__)
#pragma DATA_SECTION (SPI_CONFIG、".CONST:SPI_CONFIG")
#pragma DATA_SECTION (spiTivaDMAHWAttrs、".const:spiTivaDMAHWAttrs")
#endif
#include
#include
SPITivaDMA_Object spiTivaDMAObjects[platform_SPICOUNT];
#if defined (__TI_Compiler_version__)
#pragma DATA_ALIGN (spiTivaDMAscratchBuf、32)
#Elif defined (_IAR_systems_icc_)
#pragma DATA_alignment=32
#Elif defined (_GNU_)
__attribute__((对齐(32)))
#endif
uint32_t spiTivaDMAscratchBuf[platform_SPICOUNT];
CONST SPITivaDMA_HWAttrs spiTivaDMAHWAttrs[platform_SPICOUNT]={
{
baseAddr = SSI0_BASE、
.intNum = INT_SSI0、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[0]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_CHANGE_SSI0RX、
txChannelIndex = UDMA_CHANGE_SSI0TX、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH10_SSI0RX、
txChannelMappingFxnArg = UDMA_CH11_SSI0TX
}、
{
baseAddr = SSI1_base、
.intNum = INT_SSI1、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[1]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_CHANGE_SSI1RX、
txChannelIndex = UDMA_CHANGE_SSI1TX、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH24_SSI1RX、
txChannelMappingFxnArg = UDMA_CH25_SSI1TX
}、
{
baseAddr = SSI2_base、
.intNum = INT_SSI2、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[2]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_SEC_CHANGE_UART2RX_12、
txChannelIndex = UDMA_SEC_CHANGE_UART2TX_13、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH12_SSI2RX、
txChannelMappingFxnArg = UDMA_CH13_SSI2TX
}
};
CONST SPI_Config SPI_CONFIG[]={
{
fxnTablePtr =&SPITIvaDMA_fxnTable、
.object =&spiTivaDMAObjects[0]、
hwAttrs =&spiTivaDMAHWAttrs[0]
}、
{
fxnTablePtr =&SPITIvaDMA_fxnTable、
.object =&spiTivaDMAObjects[1]、
hwAttrs =&spiTivaDMAHWAttrs[1]
}、
{
fxnTablePtr =&SPITIvaDMA_fxnTable、
.object =&spiTivaDMAObjects[2]、
hwAttrs =&spiTivaDMAHWAttrs[2]
}、
{NULL、NULL、NULL}
};
/*
*==== platform_initSPI ====
*
void platform_initSPI (void)
{
/*SSI0电机控制器*/
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5);
GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5、
GPIO_Strength _4mA、
GPIO_PIN_TYPE_STD);
/*SSI1相移器*/
SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
GPIOPinConfigure (GPIO_PB5_SSI1CLK);
GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);
GPIOPinConfigure (GPIO_PB4_SSI1FSS);
GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_5|GPIO_PIN_4);
GPIOPinTypeSSI (GPIO_Porte _BASE、GPIO_PIN_5|GPIO_PIN_4);
GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_5、
GPIO_Strength _4mA、
GPIO_PIN_TYPE_STD);
GPIOPadConfigSet (GPIO_Porte _BASE、GPIO_PIN_4、
GPIO_Strength _4mA、
GPIO_PIN_TYPE_STD);
/* SSI2外部闪存*/
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
GPIOPinConfigure (GPIO_PD3_SSI2CLK);
GPIOPinConfigure (GPIO_PD2_SSI2FSS);
GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_2 | GPIO_PIN_3);
platform_initdma();
spi_init();
}