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/SW-EK-TM4C129EXL:SPI 数据传输问题

Guru**** 2480775 points
Other Parts Discussed in Thread: EK-TM4C129EXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/699138/rtos-sw-ek-tm4c129exl-spi-datatransfer-issues

器件型号:SW-EK-TM4C129EXL
Thread 中讨论的其他器件:EK-TM4C129EXL

工具/软件:TI-RTOS

我正在使用 EK-TM4C129EXL 评估套件。 我正在尝试通过 SPI 协议将数据从一个阵列发送到另一个阵列。 transmitBuffer(array1)中的数据不会发送到 receiveBuffer(array2)。 我还创建了一个布尔变量来检查 SPI 事务是否完成。 传输完成、但数据不会传输到第二个阵列。  我特此附上代码文件。



/* XDCtools 头文件*/ #include #include /* BIOS 头文件*/ #include #include /* TI-RTOS 头文件*/ #include #include #include #include #include
/*板头文件*/ #include "Board.h" #include #include #include #include #include #include
#define TASKSTACKSIZE 1024 UChar TransmitBuffer[8]={0、1、2、3、4、5、6、7}; UChar receiveBuffer[8]; Task_Structuretask0Struct; Char task0Stack[TASKSTACKSIZE]; btransferool OK; void spiDataSend() { SPI_Handle SPI; SPI_Params spiParams; SPI_Params_init (&spiParams); spiParams.transferMode = SPI_MODE_BLOCKING; spiParams.transferCallbackFxn = NULL; SPI = SPI_open (Board_SPI0、&spiParams); if (SPI == NULL){ /*打开 SPI 时出错*/ } SPI_Transaction spiTransaction; spiParams.dataSize = 8;// dataSize 的范围可以是4到8位*/ spiTransaction.count = 8; spiTransaction.txBuf = transmitBuffer; receivTransaction.rxBuf = spieBuffer; transferOK = SPI_transfer (SPI、&spiTransaction); if (transferOK){ /* SPI 传输或传输中出现错误*/ System_printf ("SPI 传输成功\n");//此消息在控制台上打印,但接收缓冲区为空,值为0。 system_flush(); } SPI_CLOSE (SPI); } int main (void) { Task_Params taskParams;
/*呼叫板初始化函数*/ Board_initGeneral(); Board_initGPIO(); Board_initSPI(); /*构造 spiDataSend Task 线程*/ Task_Params_init (&taskParams); taskParams.STACKSIZE = TASKSTACKSIZE; taskParams.stack =_task0Stack; Task_construct(&task0Struct,(Task_Functr) spiDataSend,&taskParams,NULL); BIOS_start(); 返回(0); }

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

    您好 Naveen、

    您是否正在尝试执行 SPI 环回? 这就是您的设置对我来说的样子。

    如果是、您需要在 SSI0上启用回送模式、这可能不会由 TI-RTOS 调用处理、因为 TivaWare 中也没有该功能。 为此、您需要执行以下操作:

    //在 SSI0上启用环回模式
    //没有针对这种情况的 TivaWare 函数
    HWREG (SSI0_BASE + SSI_O_CR1)|= 1U; 

    注意:我假设 Board_SPI0与 SSI0_BASE 相关

    如果这不能解决问题、那么您能否对 SSI 线路进行范围控制、以确保数据包在线路上正确输出? 听起来 TX 正常运行、但在进一步调试 RX 部分之前、让我们完全确定这一点。

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

    您好 Ralph、

    • 我没有尝试 SPI 回路示例。
    • 我正在尝试将微控制器连接到从器件。
    • 因此、微控制器将是主控制器、另一个具有 SPI 功能的模块将是从控制器。
    • 我需要通过 SPI 将数据阵列传输到从机模块。
    • 在这种情况下,我希望将数据存储在 transmitBuffer[]中,并尝试将该数据发送到从机模块,如下所示。   

    transmitchar Buffer[]={0、1、2、3、4、5、6、7}
    spiTransaction.count = 8;
    spiTransaction.txBuf = transmitBuffer;
    receivTransaction.rxBuf = spieBuffer;
    SPI_transfer (SPI、&spiTransaction); 

    spiTransaction.txBuf = transmitBuffer;
    据我理解、txBuf 是 transmitBuffer...的指针。

    receivTransaction.rxBuf = spieBuffer;
    根据我在这条语句中的理解、rxBuf 是接收缓冲区的指针... receiveBuffer 的意义是什么??? 。

    SPI_transfer (SPI、&spiTransaction);
    执行此行后会发生什么情况??? 来自 transmitBuffer 的数据是否将移动到 receiveBuffer??

    • 我想将数据数组传输到控制器的 SSI1TX (MOSI)引脚、我正确配置了所有 SSI1端口。
    • 需要向其发送数据以便将其传输到从机模块的任何特定阵列

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

    您好 Naveen、

    [引用 user="Naveen Kumar29">根据我在这篇声明中的理解,txBuf 是 transmitBuffer...的指针。 [/报价]

    正确。

    [引用 USER="Naveen Kumar29">根据我在这条语句中的理解,rxBuf 是接收缓冲区的指针... receiveBuffer 的意义是什么??? 。 [/报价]

    SPI 是双向的、也就是说、从器件通过 SSI 端口接收数据。

    [引用用户="Naveen Kumar29">执行该行后会发生什么情况??? 来自 transmitBuffer 的数据是否会移动到 receiveBuffer???

    否、当通过 SSI 线路接收到数据时、接收缓冲器将仅获取数据。 因此、如果执行没有问题(即传输正常检查通过)、这意味着您的数据已成功通过 SSI1TX 发送。 如果您对 SSI 线路进行了限定、您应该会看到数据被发送到从机模块。