工具/软件:TI-RTOS
尊敬的先生,
我正在使用所有 SSI 模块。 SSI 0、2、3运行正常、但 SSI1在 SPI_TRANSI()时崩溃。 调试后、我在 SPITivaDMA.c 文件中的以下语句中发现了问题。
如果(!semaphore_pend (semaphore_handle (&(object->transferComplete))))、
object->transferTimeout))
我已经尝试从论坛寻求解决方案
1.在“属性”->“常规”->“设备”中选择正确的设备。 2.我已经使用 ROV 进行堆栈级别检查、但所有堆栈看起来都可以。 3.我增加了 HWI 的堆栈大小。
但以上都不起作用。 我已连接 ROV 和 SSI 模块配置代码的快照。
void spiFxn (UArg arg0、UArg arg1)
{
// SPI_Handle masterSpi;
// SPI_Transaction masterTransaction;
// bool transferOK;
//******** 用于 DAC 的 SPI
/*将 SPI 句柄初始化为默认主控*/
SPI_Params spiParamsdac;
SPI_PARAMS_INIT (&spiParamsdac);
spiParamsdac.transferMode = SPI_MODE_BLOCKING;
spiParamsdac.transferTimeout = SPI_WAIT_FOREVER;
spiParamsdac.transferCallbackFxn =空;
spiParamsdac.mode = SPI_MASTER;
spiParamsdac.bitrate = 1000000;
spiParamsdac.dataSize =8;
spiParamsdac.frameFormat =SPI_POL1_PHA1;
spiparparamsdac.custom=(uintptr_t) NULL;
masterSpi = SPI_open (Board_SPI1、&spiramsdac);//将 cs 引脚更改为 GPIO???????????
if (masterSpi == NULL){
System_abort ("初始化 DAC_SPI\n"时出错);
}
否则{
// System_printf ("DAC_SPI 已初始化\n");
// system_flush();
}
/*初始化主 SPI 事务结构*/
masterTransaction.count = SPI_MSG_length;
masterTransaction.txBuf =(ptr) masterTxBuffer;
masterTransaction.rxBuf =(ptr) masterRxBuffer;
GPIO_WRITE (Board_LDAC、0);// DAC 的 LDAC 引脚始终保持低电平
//********* ADC SPI
SPI_Params spiParams;
SPI_Params_init (&spiParams);
spiParams.transferMode = SPI_MODE_BLOCKING;
spiParams.transferTimeout = SPI_WAIT_FOREVER;
spiParams.transferCallbackFxn =空;
spiParams.mode = SPI_MASTER;
spiParams.bitrate = 1000000;
spiParams.dataSize =16;
spiParams.frameFormat =SPI_POL1_PHA0;
spiParams.custom=(uintptr_t) NULL;
adcSpi = SPI_open (Board_SPI0、&spiParams);
if (adcSpi == NULL){
System_abort ("初始化 ADC_SPI\n"\n 时出错);
}
否则{
// System_printf ("ADC_SPI 已初始化\n");
// system_flush();
}
/*初始化主 SPI 事务结构*/
adcTransaction.count = ADC_SPI_MSG_length;
adcTransaction.txBuf =(ptr) adcTxBuffer;
adcTransaction.rxBuf =(ptr) adcRxBuffer;
// GPIO_write (Board_ADC_CONVST、Board_LED_ON);
//用户特定代码,启用中断:
Xint1Count = 0;//计数 XINT1中断
TimerCount = 0;//计数 Timer0中断
LOOPCount = 0;//通过空闲循环的计数时间
标志= 0;
ReG_Word = 0;
//初始化
(n=0;n <BUF_SIZE; n++) { 的缓冲表
ADS833x_buf[n]= n;
}
表示(n=0;n "\n="" select\n");="" system_flush();="" channel_number="0;" should="" be="" 0~7,channel="" number="" for="" ads833x_channel_select(channel_number);="" adc="" timerflag="1;" **************************************************end="" adc******************************************************="" **************************************************absolute="" encoder*************************************="" **************************************************channel="" 0*************************************="" spi_params="" spiparamsabsa;="" spi_params_init(&spiparamsabsa);="" spiparamsabsa.transfermode="SPI_MODE_BLOCKING;" spiparamsabsa.transfertimeout="SPI_WAIT_FOREVER;" spiparamsabsa.transfercallbackfxn="NULL;" spiparamsabsa.mode="SPI_MASTER;" spiparamsabsa.bitrate="295000;" 295k="" spiparamsabsa.datasize="16;" spiparamsabsa.frameformat="SPI_POL1_PHA1;" spiparamsabsa.custom="(uintptr_t)" null;="" absaspi="SPI_open(Board_SPI2," &spiparamsabsa);="" (absaspi="=" null)="" system_abort("error="" initializing="" absa_spi\n");="" else="" system_printf("absa_spi="" initialized\n");="" *="" initialize="" master="" spi="" transaction="" structure="" absatransaction.count="ABSA_SPI_MSG_LENGTH;" absatransaction.txbuf="(Ptr)absaTxBuffer;" absatransaction.rxbuf="(Ptr)absaRxBuffer;" 1*************************************="" spiparamsabsb;="" spi_params_init(&spiparamsabsb);="" spiparamsabsb.transfermode="SPI_MODE_BLOCKING;" spiparamsabsb.transfertimeout="SPI_WAIT_FOREVER;" spiparamsabsb.transfercallbackfxn="NULL;" spiparamsabsb.mode="SPI_MASTER;" spiparamsabsb.bitrate="250000;" spiparamsabsb.datasize="16;" spiparamsabsb.frameformat="SPI_POL1_PHA0;" spiparamsabsb.custom="(uintptr_t)" absbspi="SPI_open(Board_SPI3," &spiparamsabsb);="" (absbspi="=" absb_spi\n");="" system_printf("absb_spi="" absbtransaction.count="ABSB_SPI_MSG_LENGTH;" absbtransaction.txbuf="(Ptr)absbTxBuffer;" absbtransaction.rxbuf="(Ptr)absbRxBuffer;" absolute="" place="" into="" subsections="" to="" allow="" the="" ti="" linker="" remove="" items="" properly="" #if="" defined(__ti_compiler_version__)="" #pragma="" data_section(spi_config,="" ".const:spi_config")="" data_section(spitivadmahwattrs,="" ".const:spitivadmahwattrs")="" #endif="" #include=""
#include
SPITivaDMA_Object spiTivaDMAObjects[EK_TM4C1294XL_SPICOUNT];
#if defined (__TI_Compiler_version__)
#spima DATA_align (TivaDMAscratchBuf、32)
#Elif defined (__IAR_systems_icc_)
#tintrateg_t_un32_t_tattrategr_t_t_t_tattratun_tattrategr_un_t_t_t_un32_t_t_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_api_tun_ap_api_ap_ap_
{
baseAddr = SSI2_base、
.intNum = INT_SSI2、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[0]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_SEC_CHANGE_UART2RX_12、
txChannelIndex = UDMA_SEC_CHANGE_UART2TX_13、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH12_SSI2RX、
txChannelMappingFxnArg = UDMA_CH13_SSI2TX
}、
{
baseAddr = SSI3_base、
.intNum = INT_SSI3、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[1]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_SEC_CHANGE_TMR2A_14、
txChannelIndex = UDMA_SEC_CHANGE_TMR2B_15、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH14_SSI3RX、
txChannelMappingFxnArg = UDMA_CH15_SSI3TX
}、
{
baseAddr = SSI0_BASE、
.intNum = INT_SSI0、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[2]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_SEC_CHANGE_SSI1RX、
txChannelIndex = UDMA_SEC_CHANGE_SSI1TX、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH10_SSI0RX、
txChannelMappingFxnArg = UDMA_CH11_SSI0TX
}、
{
baseAddr = SSI1_base、
.intNum = INT_SSI1、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[3]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_SEC_CHANGE_SSI1RX、
txChannelIndex = UDMA_SEC_CHANGE_SSI1TX、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH10_SSI1RX、
txChannelMappingFxnArg = UDMA_CH11_SSI1TX
}
};
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]
}、
{
fxnTablePtr =&SPITIvaDMA_fxnTable、
.object =&spiTivaDMAObjects[3]、
hwAttrs =&spiTivaDMAHWAttrs[3]
}、
{NULL、NULL、NULL}
};
//
*===== EK_TM4C1294XL_initSPI ===
/void
EK_TM4C1294XL_initSPI (void)
{
/* SSI2 */
/*
*注意:TI-RTOS 示例为 SSI2或 I2C7配置引脚 PD0和 PD1。 因此、
*在中同时使用 I2C 和 SPI 驱动程序时会发生冲突
*应用程序。 修改此文件中的引脚多路复用设置并解析
*运行应用程序前发生冲突。
*
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);
// GPIOPinTypeGPIOOutput (GPIO_PORTD_BASE、GPIO_PIN_2);
// GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、4);
/* SSI3 */
SysCtlPeripheralEnable (SYSCTL_Periph_SSI3);
GPIOPinConfigure (GPIO_PQ0_SSI3CLK);
//GPIOPinConfigure (GPIO_PQ1_SSI3FSS);
GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0);
GPIOPinConfigure (GPIO_PQ3_SSI3XDAT1);
GPIOPinTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0 |GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeGPIOOutput (GPIO_PORTQ_BASE、GPIO_PIN_1);
GPIOPinWrite (GPIO_PORTQ_BASE、GPIO_PIN_1、2);
//******** SSI0
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
//********* SSI1
SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
GPIOPinConfigure (GPIO_PB5_SSI1CLK);
GPIOPinConfigure (GPIO_PB4_SSI1FSS);
GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);
GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5);
GPIOPinTypeSSI (GPIO_Porte _BASE、GPIO_PIN_4 |GPIO_PIN_5);
EK_TM4C1294XL_initDMA ();
SPI_init();
}