Tool/software: TI-RTOS
Respected sir,
I am using all the SSI modules. SSI 0,2,3 works fine but SSI1 crashes at SPI_transfer(). After debugging i found the problem in following statement in SPITivaDMA.c file.
if (!Semaphore_pend(Semaphore_handle(&(object->transferComplete)),
object->transferTimeout))
I have tried following solution from Forum
1. Selecting right device in properties->general->device. 2. I have used ROV for stack level checking but all stacks seems ok. 3. I have increased stack size for HWI.
But none of above works. I have attached snaps of ROV and SSI module configuration code.
Void spiFxn (UArg arg0, UArg arg1) { // SPI_Handle masterSpi; // SPI_Transaction masterTransaction; // bool transferOK; //************************************SPI FOR DAC************************************* /* Initialize SPI handle as default master */ SPI_Params spiParamsdac; SPI_Params_init(&spiParamsdac); spiParamsdac.transferMode = SPI_MODE_BLOCKING; spiParamsdac.transferTimeout = SPI_WAIT_FOREVER; spiParamsdac.transferCallbackFxn = NULL; spiParamsdac.mode = SPI_MASTER; spiParamsdac.bitRate = 1000000; spiParamsdac.dataSize =8; spiParamsdac.frameFormat =SPI_POL1_PHA1; spiParamsdac.custom =(uintptr_t) NULL; masterSpi = SPI_open(Board_SPI1, &spiParamsdac); // change the cs pin to GPIO??????? if (masterSpi == NULL) { System_abort("Error initializing DAC_SPI\n"); } else { // System_printf("DAC_SPI initialized\n"); // System_flush(); } /* Initialize master SPI transaction structure */ masterTransaction.count = SPI_MSG_LENGTH; masterTransaction.txBuf = (Ptr)masterTxBuffer; masterTransaction.rxBuf = (Ptr)masterRxBuffer; GPIO_write(Board_LDAC, 0); // LDAC PIN OF DAC ALWAYS KEEP LOW //***************************SPI FOR ADC************************************************* SPI_Params spiParams; SPI_Params_init(&spiParams); spiParams.transferMode = SPI_MODE_BLOCKING; spiParams.transferTimeout = SPI_WAIT_FOREVER; spiParams.transferCallbackFxn = NULL; 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("Error initializing ADC_SPI\n"); } else { // System_printf("ADC_SPI initialized\n"); // System_flush(); } /* Initialize master SPI transaction structure */ adcTransaction.count = ADC_SPI_MSG_LENGTH; adcTransaction.txBuf = (Ptr)adcTxBuffer; adcTransaction.rxBuf = (Ptr)adcRxBuffer; // GPIO_write(Board_ADC_CONVST, Board_LED_ON); // User specific code, enable interrupts: Xint1Count = 0; // Count XINT1 interrupts TimerCount = 0; // Count Timer0 interrupts LoopCount = 0; // Count times through idle loop Flag = 0; Reg_Word = 0; // Initialize Buffer Tables for (n=0; n<BUF_SIZE; n++) { ADS833x_Buf[n] = n; } for (n=0; n<SIZE; n++) { ADS833x_Result[n] = n; } ADS833x_init(); // Step 6. IDLE loop: // Select input Channel if Manual Channel Selection is enabled in CFR register ADS833x_Buf[2] = ADS833x_CFR_Reg & 0x0800; if (ADS833x_Buf[2] == 0) { System_printf("\n manual channel select\n"); System_flush(); Channel_Number = 0; // Should be 0~7,Channel number for Manual channel select ADS833x_Channel_Select(Channel_Number); // Select ADC input channel } 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); if (absaSpi == NULL) { System_abort("Error initializing ABSA_SPI\n"); } else { System_printf("ABSA_SPI initialized\n"); System_flush(); } /* Initialize master SPI transaction structure */ absaTransaction.count = ABSA_SPI_MSG_LENGTH; absaTransaction.txBuf = (Ptr)absaTxBuffer; absaTransaction.rxBuf = (Ptr)absaRxBuffer; //**************************************************Channel 1************************************* SPI_Params 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) NULL; absbSpi = SPI_open(Board_SPI3, &spiParamsabsb); if (absbSpi == NULL) { System_abort("Error initializing ABSB_SPI\n"); } else { System_printf("ABSB_SPI initialized\n"); System_flush(); } /* Initialize master SPI transaction structure */ absbTransaction.count = ABSB_SPI_MSG_LENGTH; absbTransaction.txBuf = (Ptr)absbTxBuffer; absbTransaction.rxBuf = (Ptr)absbRxBuffer; //**************************************************END ABSOLUTE ENCODER************************************* } /* * =============================== SPI =============================== */ /* Place into subsections to allow the TI linker to remove items properly */ #if defined(__TI_COMPILER_VERSION__) #pragma DATA_SECTION(SPI_config, ".const:SPI_config") #pragma DATA_SECTION(spiTivaDMAHWAttrs, ".const:spiTivaDMAHWAttrs") #endif #include <ti/drivers/SPI.h> #include <ti/drivers/spi/SPITivaDMA.h> SPITivaDMA_Object spiTivaDMAObjects[EK_TM4C1294XL_SPICOUNT]; #if defined(__TI_COMPILER_VERSION__) #pragma DATA_ALIGN(spiTivaDMAscratchBuf, 32) #elif defined(__IAR_SYSTEMS_ICC__) #pragma data_alignment=32 #elif defined(__GNUC__) __attribute__ ((aligned (32))) #endif uint32_t spiTivaDMAscratchBuf[EK_TM4C1294XL_SPICOUNT]; const SPITivaDMA_HWAttrs spiTivaDMAHWAttrs[EK_TM4C1294XL_SPICOUNT] = { { .baseAddr = SSI2_BASE, .intNum = INT_SSI2, .intPriority = (~0), .scratchBufPtr = &spiTivaDMAscratchBuf[0], .defaultTxBufValue = 0, .rxChannelIndex = UDMA_SEC_CHANNEL_UART2RX_12, .txChannelIndex = UDMA_SEC_CHANNEL_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_CHANNEL_TMR2A_14, .txChannelIndex = UDMA_SEC_CHANNEL_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_CHANNEL_SSI1RX, .txChannelIndex = UDMA_SEC_CHANNEL_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_CHANNEL_SSI1RX, .txChannelIndex = UDMA_SEC_CHANNEL_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 */ /* * NOTE: TI-RTOS examples configure pins PD0 & PD1 for SSI2 or I2C7. Thus, * a conflict occurs when the I2C & SPI drivers are used simultaneously in * an application. Modify the pin mux settings in this file and resolve the * conflict before running your the application. */ 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(); }