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.

[参考译文] RTOS/TM4C1294NCPDT:SPI1的 SPI_TRANSFERT()崩溃

Guru**** 2222400 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/693523/rtos-tm4c1294ncpdt-spi_transfer-crashes-for-spi1

器件型号:TM4C1294NCPDT

工具/软件: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、

    您能详细说明一下碰撞意味着什么吗? 您是否遇到异常、挂起或 API 失败。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的先生,
    感谢你的答复。 问题已解决。 SSI1的 DMA 通道与 SSI0的 DMA 通道发生冲突。 当我更改 DMA 通道时、问题得到了解决。

    此致、
    Digvijay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、我也很想看到你修复的完整代码、谢谢。

    为什么没有 UDMA_SEC_CHANGE_UART2RX_12的 SPI 版本?这个 rxChannelIndex/txChannelIndex 的真正意义是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    这是我所做更改的代码。

    CONST SPITivaDMA_HWAttrs spiTivaDMAHWAttrs[EK_TM4C1294XL_SPICOUNT]={

    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_ADC10、
    txChannelIndex = UDMA_SEC_CHANGE_ADC11、
    channelMappingFxn = uDMAChannelAssign、
    .rxChannelMappingFxnArg = UDMA_CH24_SSI1RX、
    txChannelMappingFxnArg = UDMA_CH25_SSI1TX

    };


    此致、
    Digvijay。