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:SPI 传输存在问题

Guru**** 2613075 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581942/rtos-tm4c1294ncpdt-problem-with-spi-transfer

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您好!

我具有以下 SPI 配置。 当我在示波器上启动一个传输时、我得到一个5字节传输的3个时钟脉冲。 我所使用的代码是经过验证的代码、工作正常。 直到我从较旧 的 BIOS 版本升级以使用新的 TI 驱动程序。 如果我单步执行 SPI 传输、一切看起来都正常、直到代码应该在信标上挂起并等待传输完成。 此时、信号量以超时终止。 因此、传输似乎开始、由于超时、传输在完成前被取消。 为了开始传输(我在示波器上看到)、我假设为了启动传输 、DMA 已将数据传输到 SPI 控制器、因此必须正确配置。 这让我相信信标有问题、由于某种原因未在处理?  

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

#include
#include

SPITivaDMA_Object spiTivaDMAObjects[platform_SPICOUNT];

#if defined (__TI_Compiler_version__)
#pragma DATA_ALIGN (spiTivaDMAscratchBuf、32)
#Elif defined (_IAR_systems_icc_)
#pragma DATA_alignment=32
#Elif defined (_GNU_)
__attribute__((对齐(32)))
#endif
uint32_t spiTivaDMAscratchBuf[platform_SPICOUNT];

CONST SPITivaDMA_HWAttrs spiTivaDMAHWAttrs[platform_SPICOUNT]={

baseAddr = SSI0_BASE、
.intNum = INT_SSI0、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[0]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_CHANGE_SSI0RX、
txChannelIndex = UDMA_CHANGE_SSI0TX、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH10_SSI0RX、
txChannelMappingFxnArg = UDMA_CH11_SSI0TX
}、

baseAddr = SSI1_base、
.intNum = INT_SSI1、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[1]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_CHANGE_SSI1RX、
txChannelIndex = UDMA_CHANGE_SSI1TX、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH24_SSI1RX、
txChannelMappingFxnArg = UDMA_CH25_SSI1TX
}、

baseAddr = SSI2_base、
.intNum = INT_SSI2、
.intPriority =(~0)、
.scratchBufPtr =&spiTivaDMAscratchBuf[2]、
defaultTxBufValue = 0、
.rxChannelIndex = UDMA_SEC_CHANGE_UART2RX_12、
txChannelIndex = UDMA_SEC_CHANGE_UART2TX_13、
channelMappingFxn = uDMAChannelAssign、
.rxChannelMappingFxnArg = UDMA_CH12_SSI2RX、
txChannelMappingFxnArg = UDMA_CH13_SSI2TX

};

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

/*
*==== platform_initSPI ====
*
void platform_initSPI (void)

/*SSI0电机控制器*/
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);

GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);

GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5);

GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5、
GPIO_Strength _4mA、
GPIO_PIN_TYPE_STD);

/*SSI1相移器*/
SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);

GPIOPinConfigure (GPIO_PB5_SSI1CLK);
GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);
GPIOPinConfigure (GPIO_PB4_SSI1FSS);

GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_5|GPIO_PIN_4);
GPIOPinTypeSSI (GPIO_Porte _BASE、GPIO_PIN_5|GPIO_PIN_4);

GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_5、
GPIO_Strength _4mA、
GPIO_PIN_TYPE_STD);

GPIOPadConfigSet (GPIO_Porte _BASE、GPIO_PIN_4、
GPIO_Strength _4mA、
GPIO_PIN_TYPE_STD);


/* SSI2外部闪存*/
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);

platform_initdma();
spi_init();

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 RKRobinson:
    代码起作用的 TI-RTOS 版本是什么、升级到不起作用的版本是什么? 此外,是否在传递给 SPI_open()的 SPI_Params 中设置超时?
    谢谢、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、
    使用的版本是6_34_04_22我现在使用的版本是6_45_02_31。 我确实将超时设置为100、但信标不会无限期地超时它等待。 BIOS 时钟已启用并设置为1000US。
    Richard。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Richard、

    我想知道的是 TI-RTOS 版本、但基于较新的 BIOS 版本(6.45.02.31)、我猜您正在使用 TI-RTOS 2.16.01.14。  您能否在 General -> RTSC 选项卡下附加显示项目属性的屏幕截图。  它应该与此类似(但具有不同的 TI-RTOS 版本):

    然后在"Order"选项卡上、展开 TIRTOSTIVAC_REPOS、并附加该屏幕截图。  我希望看到如下所示的内容:

    谢谢、

    Janet