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**** 2482105 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/715222/rtos-sw-ek-tm4c129exl-spi-datatransfer-issues

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

工具/软件:TI-RTOS

您好、Ralph、

      我正在尝试将 EK-TM4C129EXL 与8*8 LED 模块连接以显示一些字符。 当我尝试通过 SPI 发送0x00 (值- 0)时、显示模块中的 LED 不应亮起、但会亮起。 我无法找到为什么要关闭 LED 发光... 这是代码  

/* XDCtools 头文件*/
#include 
#include 
#include 

/* BIOS 头文件*/
#include 
#include 

/* TI-RTOS 头文件*/
#include 
#include 
//#include 

/* BIOS 头文件*/
#include 

/* TI-RTOS 头文件*/
#include 
#include 
#include 


#include 
#include 
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"



#define TASKSTACKSIFunZE 1024
Task_Structure0Structure.h;
Char spi0Stack[TASKSTACKSemaphZE];#define






task =


0x00

;// volatile track sumn = 1;void 1–1–void 1–1–1–void 1–1–1–1–volatile track semtrack 1–void 1–void 1 (1) 1–1–1–1–1–1–1–1–1–1–1–1–1–1–1–1–1–volatile tle tle tle tle tle




//静态 int 计数= 0;
if (count++& 1){
Semaphore_post (sem2);
}
否则{
Semaphore_post (sem1);
}
}/*Task1

在 sem1*/

tsk1Func (UArg arg0、UArg arg1)
{上处于暂挂循环中
//GPIO_TOGGLE (Board_LED1);
while (1){
Semaphore_pend (sem1、BIOS_wait_forever);
multiplexing();
/*任务1在此工作*/

}
}/*Task2
在 sem2*/

tsk2Func (UArg0、UArgarg1)
{上处于暂挂循环中
//GPIO_TOGGLE (Board_LED0);
while (1){
Semaphore_pend (sem2、BIOS_wait_forever);
spiDataSend();
/* task2在此处工作*/

}



}void spiDataSend()
{

SPI_Handle SPI;
SPI_Params spiParams;
SPI_Params_init (&spiParams);
spiParams.dataSize = 1;/* dataSize 的范围可以是4至8位*/
spiParams.transferMode = SPI_MODE_BLOCKING;
spiParams.mode = SPI_MASTER;
spiParams.bitrate = 2000000;
spiParams.transferCallbackFxn =空;
SPI = SPI_OPEN (Board_SPI0、&spiParams);
if (SPI == NULL){
/*打开 SPI 时出错*/
}
SPI_Transaction spiTransaction;
spiTransaction.count = 8;
spiTransaction.txBuf = transmitBuffer;
spiTransaction.rxBuf =空;
SPI_transfer (SPI、&spiTransaction);
SPI_CLOSE (SPI);
}


void 多路复用()
{

GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0,1);//代码的 LED 驱动器部分此部件工作正常...
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、1);
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);
GPIOPinWrite (GPIO_Porte _BASE,(GPIO_PIN_0|GPIO_PIN_1),rowSelect);
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、0);
rowSelect++;
如果(rowSelect > 3)
{
rowSelect = 0;
}

}


/*
=== main ====
*/
int main (void)
{
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initSPI();

GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、(GPIO_PIN_0|GPIO_PIN_1));//初始化解码器部分
GPIOPinTypeGPIOOutput (GPIO_PORTD_base、(GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3));//初始化 SPI 驱动器部分

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE))
{
}

Task_Params taskParams;
Task_Params_init (&taskParams);
taskParams.priority = 2;
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_Functr) spiDataSend,&taskParams,NULL);
/*启动 BIOS */
BIOS_start();
返回(0);
}

您可以注意到,传输缓冲区中的值为0x00,LED 仍然亮起....  

我有一定的怀疑、  

SPI = SPI_OPEN (Board_SPI0、&spiParams); 
--> Board_SPI0是否在 PORTD 上打开 SPI???

-->在哪一个寄存器中,发送缓冲区中的值将为 writeen????

-->我无法在 SSI_DR_DATA 中看到数据值- SSI 接收/发送数据 

   

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

    我不确定您要如何处理以下三行代码。

    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0,1);//代码的 LED 驱动器部分此部件工作正常...
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、1);
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);

    请注意、GPIOPinWrite 的第二个参数是引脚的位打包表示。 在第二行中、我认为您正在尝试设置 GPIO_PIN_2、对吧? 如果您打算这样做,则应改为写入 GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、GPIO_PIN_2)或 GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、0x4)。 您所做的操作不会设置 GPIO_PIN_2。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

       这三条线路使 LED 驱动器打开。。。这三条线路工作正常。 我对 SPI 数据传输有疑问。 我能够将这些值写入 trasnsmitBuffer、但我无法在 SSI_DR_DATA - SSI 接收/发送数据寄存器中看到这些值。 BTW 我已将值1更改为 0x4。 这似乎不是问题...

    这三个问题呢????

    SPI = SPI_OPEN (Board_SPI0、&spiParams);
    
    --> Board_SPI0是否在 PORTD 上打开 SPI??
    
    -->在哪一个寄存器中,发送缓冲区中的值将为 writeen????
    
    -->我无法在 SSI_DR_DATA 中看到数据值- SSI 接收/发送数据
    

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

    [引用用户="Naveen Kumar29"]这三行代码使 LED 驱动器打开。这三行代码工作正常。[/引用]

    确实-正如供应商的 Charles 所指出的-您的第2行(hi-lite、下面)肯定不起作用- 而且最肯定 的是、不好!

    查尔斯一直在解释你的“参数3选择证明不正确”-证明你抵制这种(详细)纠正是不明智的!

    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、1);
    GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2,1);  // 非常错误-您在这里的'1'- 永远不会打开 位'D2'!   查尔斯 '4'- Will。
    GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_0、0);

    您认为这样的情况很明显-您(小心)探测/测量过"PD2"-您是否没有这么做?   如果是、您说"工作正常"的"依据"是什么?   (可以肯定-您没有测量'PD2'-或者如果您尝试-您的连接或方法不正确...)

    建议"接受辅导"-并发展"适当"的诊断技巧...

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

    您好!

     如果您查看 Board.h 文件、Board_SPI0会映射到 TM4C129的 SPI2。 在数据表中、SPI2被映射到 PDx 引脚。 这就是您的问题。 您需要在 Board.h、EK_TM4C129EXL.c 和 EK_TM4C129EXL.h 中相应地更改到所需 SPI 实例的映射。  

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

    您好 CB1_MOBILE、

          查尔斯说过之后、我将0x4值写入 PORTD 的引脚2、但问题仍然存在。  我在上述帖子中的意思"顺便说一下、我已将值1更改为 0x4。 因此、驱动器部件的代码工作正常!!"。 当我尝试在"SPI_CLOSE (SPI)"上设置断点时、我无法在 SSI_DR_DATA - SSI 接收/发送数据寄存器上获取任何值。 此外、我们的工作场所没有示波器设施。

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

    您好、Charles、

        谢谢查尔斯,这澄清了我的疑问,让我们假设这一点

    UChar transmitBuffer[8]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};

    spiTransaction.txBuf = transmitBuffer; 

    此行后会发生什么情况???

    将在哪个寄存器中写入发送缓冲区中的值??? 这些 值是否会传输到 SSI2XDAT0 (SSI2TX)引脚??

    此致、

    Naveen  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当 SPI_TRANSF传输(SPI、&spiTransaction)被执行时、SPI 传输开始。 spiTransaction.txBuf = transmitBuffer 仅将 txBuf 分配给指向 transmitBuffer 数组的开头。

    一旦 SPI 传输开始、spiTransaction.txBuf 指向的数据将被复制到 SPI 模块 TX FIFO 中。 然后、FIFO 中的数据将被复制到移位寄存器中。 此时、您将看到 SSI2TX 或您正在使用的任何 SPI 实例上的传输。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    在调试时能否查看 SPI 模块 TX FIFO 或移位寄存器上的数据??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果没有示波器-(可能)可以通过(暂时)将一个(受保护的串联电阻器)连接到您的'SPI_TX 引脚'来获得一些数据活动的证据。

    除非您的 SPI 数据速率大幅降低、否则您将无法记录各个 SPI 的"位"、但您将获得 SPI 的确认信息、即"输出数据"。

    如果 SPI 数据速率足够"低"、并且将 SPI 数据设置为"0x55或0xAA"、您只需注意这些 SPI 传输字节的"逐位切换"即可...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    FIFO 和移位寄存器未映射存储器。 调试的最佳方法仍然是使用示波器或逻辑分析仪。 您还可以在环回中连接 SPITX 和 SPIRX 引脚。 这样、如果没有范围、您还可以验证是否接收到与传输的数据相同的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "kiss"会指示、"接收(部分)数据/活动"-快速轻松(即 LED 提供的)-应在"环回!"之前  

    事实证明、"多代码段和互连"比单个 LED 连接更难实现... 而且-如果回送失败-存在(至少) 4个"可能的可疑情况"。 (即失败:回送模式配置;故障互连;故障 SPI 输出;故障 SPI 输入!)