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.
工具/软件: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(); }
Digvijay、
我在使用 SSI1时遇到类似的问题、发现此帖子非常有用。 我可以使 SSI2和 SSI3正常工作。 但是、我在使用 SSI1时遇到了很大的困难。 您是否想将 DMA 配置解决方案发布为参考? 您是否必须更改 DMA 通道映射选择和索引? 对于 SSI3、是否还需要其他寄存器设置要求? 我已将此问题发布到论坛 (链接)、非常感谢您提供的任何帮助。 谢谢!
虽然我不清楚为什么我从未将 SSI0定义为您自己的冲突代码、但我的问题也是在 UDMA 通道上的。 请查找随附的代码以供将来参考。 这看起来不错吗? 如果您发现有问题、请随时提出更改建议。 似乎可以在 Launchpad 板上工作。
Ryan
CONST SPITivaDMA_HWAttrs spiTivaDMAHWAttrs[EK_TM4C1294XL_SPICOUNT]={ baseAddr = SSI1_base、 .intNum = INT_SSI1、 .intPriority =(~0)、 .scratchBufPtr =&spiTivaDMAscratchBuf[0]、 defaultTxBufValue = 0、 .rxChannelIndex = 24、 txChannelIndex = 25、 channelMappingFxn = uDMAChannelAssign、 .rxChannelMappingFxnArg = UDMA_CH24_SSI1RX、 txChannelMappingFxnArg = UDMA_CH25_SSI1TX }、 { baseAddr = SSI2_base、 .intNum = INT_SSI2、 .intPriority =(~0)、 .scratchBufPtr =&spiTivaDMAscratchBuf[1]、 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[2]、 defaultTxBufValue = 0、 .rxChannelIndex = UDMA_SEC_CHANGE_TMR2A_14、 txChannelIndex = UDMA_SEC_CHANGE_TMR2B_15、 channelMappingFxn = uDMAChannelAssign、 .rxChannelMappingFxnArg = UDMA_CH14_SSI3RX、 txChannelMappingFxnArg = UDMA_CH15_SSI3TX } };
您好,
SSI 配置正常。 如果仍然存在 DMA 冲突问题、我猜可能是它与使用 DMA 卡器的其他外设发生冲突。 由于我不在办公室、我无法向您提供详细信息。
此致、
Digvijay