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:SSI3从器件转换为 SSI1时出现问题

Guru**** 2478765 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/696570/rtos-tm4c1294ncpdt-trouble-with-ssi3-slave-conversion-to-ssi1

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

我有一个 Tiva TM4C1294NCPT Launchpad、并将 SSI2设置为主 SPI、通过跳线与同一开发板上的 SSI3从 SPI 通信。  这对我来说很好。  现在、我需要将从 SPI 从 SSI3更改为 SS1、但我似乎无法使其正常工作。 我的跳线设置如下:
通用设置:  SSI2Clk -> SSIxCLK、SSI2Fss -> SSIxFss、SSI2Data1->SSIxData0、SSI2Data0->SSIxData1、
SSI2->SSI3:     PD3->PQ0、PD2->PQ1、PD0->PQ2、PD1->PQ3
SSI2->SSI1:     PD3->PB5、PD2->PB4、PD0->PE4、PD1->PE5
程序会编译、主器件似乎会发出消息 OK。  当 SPI 从器件为 SSI3时、将接收报文。  我的 SPI 从器件任务如下:

空 SPIserver (UARg arg0、UARg arg1)
{
SPI_Handle serverSpi;
SPI_Params 服务器 SpiParams;
SPI_Transaction serverTransaction;
bool ServertransferOK;

/*使用从模式初始化 SPI 句柄*/
SPI_Params_init (&serverSpiParams);
serverSpiParams.mode = SPI_SLAVE;
serverSpiParams.bitrate = 1250000;
serverSpiParams.transferMode = SPI_MODE_BLOCKING;
serverSpiParams.frameFormat = SPI_POL0_PHA1;//极性和相位= SPI_POL0_PHA0、SPI_POL0_PHA1、SPI_POL1_PHA0、SPI_POL1_PHA1
//serverSpiParams.transferTimeout = SPI_WAIT_FOREVER;
serverSpiParams.dataSize = 10;


serverSpi = SPI_open (Board_SPI3、&serverSpiParams);

if (serverSpi == NULL){
System_abort ("初始化 SPI\n"时出错);
}
其他
{
System_printf ("服务器 SPI 已初始化"\n);
}

while (1)
{
//Step 1:接收新的 SPI 数据
serverTransaction.count = SPI_MSG_length;
serverTransaction.txBuf =空;
serverTransaction.rxBuf =(ptr) serverRxBuffer;
ServertransferOK = SPI_transfer (serverSpi、&serverTransaction);
}
} 


这就证明了一切正常。  现在、当我如前面所述将连接线从 SSI3更改为 SSI1、并在上述程序中将 SPI_OPEN ()中的"Board_SPI3"更改为"Board_SPI1"时、我的从器件 SPI 将保持阻塞模式。  常量定义如下:
#define Board_SPI1                 EK_TM4C1294XL_SPI1
#define Board_SPI2                 EK_TM4C1294XL_SPI2
#define Board_SPI3                 EK_TM4C1294XL_SPI3

我缺少什么。  是否需要为 SSI1配置其他一些配置而不是为 SSI3配置?  这与     Digvijay khambi 几天前报告的 SPI_transfer 崩溃类似。  如果有任何帮助、我们将不胜感激。  请查找以下发布的相关代码。  谢谢!

/*!
*@def EK_TM4C1294XL_SPIName
*@EK_TM4C1294XL 开发板上 SPI 名称的简短枚举
*/
typedef enum EK_TM4C1294XL_SPIName{
EK_TM4C1294XL_SPI1 = 0、
EK_TM4C1294XL_SPI2、
EK_TM4C1294XL_SPI3、

EK_TM4C1294XL_SPICOUNT
}EK_TM4C1294XL_SPIName;







//
*================================================= SPI ========================================================
*/
*放入子段以允许 TI 链接器正确删除项目*/
#if defined (__TI_Compiler_version__)
#pragma DATA_SECTION (SPI_CONFIG、".CONST:SPI_CONFIG")
#pragma DATA_SECTION (spiTivaDMAHWAttrs、".const:TivaDMAHWAttrs


)#include Tiva 
#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_tatun32_t_un_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_tun_ap_api_







baseAddr = SSI1_base、
.intNum = INT_SSI1、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[0]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_SEC_CHANGE_SSI1RX、
txChannelIndex = UDMA_SEC_CHANGE_SSI1TX、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH10_SSI1RX、
txChannelMappingFxnArg = UDMA_CH11_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
}
};

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}
};

//
*===== EK_TM4C1294XL_initSPI ===
/void
EK_TM4C1294XL_initSPI (void)
{

/* 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);


/* 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);

///* 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_1 |
GPIO_PIN_2 | GPIO_PIN_3);



EK_TM4C1294XL_initDMA ();
SPI_init();
}

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

    是否可以使用已检测的驱动程序库并启用日志记录? 然后执行 SPI2->SPI3设置(有效),并查看 Tools->ROV->LoggerStopMode-> Records 以查看驱动程序日志消息。 (注意:驱动程序将记录放入"main"记录器)。 您可以将其与 SPI2->SPI3设置进行比较、并希望获得更多见解。

    以下是在.cfg 文件中启用日志记录所需的更改。 它还会打开内核日志。

    BIOS.logsEnabled = true;
    //BIOS.logsEnabled = false;

    //driversConfig.libType = driversConfig.LibType_Noniced;
    driversConfig.libType = driversConfig.LibType_Instrumented;

    VAR LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup');
    LoggingSetup.mainLoggerSize = 4096;
    LoggingSetup.sysbiosLoggerSize = 4096;

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

    您好、Ryan、

          在浏览您的主题后、我发现您的问题与我的问题不同。 我对 SSI1和 SSI0使用相同的 DMA 通道。 但每个 SSI 都有不同的通道。 我在下面添加了故障 SSI 配置以及解决方法。

      {

        baseAddr = SSI0_BASE、

        .intNum = INT_SSI0、

        .intPriority =(~0)、

        .scratchBufPtr =&spiTivaDMAscratchBuf[2]、

        defaultTxBufValue = 0、

        .rxChannelIndex = uDMA_SEC_CHANGE_SSI1RX、   //对于 SSI1和 0为相同的通道

        txChannelIndex = uDMA_SEC_CHANGE_SSI1TX、    //对于 SSI1和 0为同一通道

        channelMappingFxn = uDMAChannelAssign、

        .rxChannelMappingFxnArg = uDMA_CH10_SSI0RX、    //对于 SSI1和 0为相同的通道

        txChannelMappingFxnArg = UDMA_CH11_SSI0TX       //对于 SSI1和 0具有相同的通道

      }、

      {

        baseAddr = SSI1_base、

        .intNum = INT_SSI1、

        .intPriority =(~0)、

        .scratchBufPtr =&spiTivaDMAscratchBuf[3]、

        defaultTxBufValue = 0、

        .rxChannelIndex = uDMA_SEC_CHANNEL_SSI1RX、   //我已使用扩散 DMA 通道更改了这些通道

        txChannelIndex = uDMA_SEC_CHANNEL_SSI1TX、    //我已经用散射 DMA 通道更改了这些通道

        channelMappingFxn = uDMAChannelAssign、

        .rxChannelMappingFxnArg = uDMA_CH10_SSI1RX、     //我已使用扩散 DMA 通道更改了这些通道  

        txChannelMappingFxnArg = UDMA_CH11_SSI1TX      //我已使用扩散 DMA 通道更改这些通道

      }

    };

    此致、

    Digvijay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Digvijay 和 Todd、
    这可以解决我的问题、并且可以在 Launchpad 上工作。 有趣的是,即使我不使用 SSI0,而且*不应该*有 uDMA 冲突,我仍然需要更改通道。 在本例中、我将 SSI1更改为24和25。
    谢谢!
    Ryan