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.

[参考译文] CCS/TMS320F28035:在 SPI 3线模式下、它可以成功发送、但接收总是处于高电平

Guru**** 2609895 points
Other Parts Discussed in Thread: TMS320F28035

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/685830/ccs-tms320f28035-in-spi-3-wire-mode-it-can-be-transmit-successful-but-the-receive-always-in-high-level

器件型号:TMS320F28035

工具/软件:Code Composer Studio

大家好、

我将驱动 TLE5012B (SSC 通信)在  SPI 3线模式下使用 TMS320F28035。当我使用仿真模式与 TLE5012B 通信时、没问题。

关于该过程、将 SPI SIMO 引脚设置为输出模式、发送与上图类似的命令。 然后在输入接收数据中设置 SIMO 引脚。没问题。(请参阅下图)

但是、当我使用实数 SPI 3线模式并发送相同的命令时、它始终是高电平。(请参阅下图)

代码如下:

空 Init5012BGpio (空)
InitSpiaGpio();
void TLE5012B_Configuration (void)
SpiaRegs.SPICCR.bit.SPICHAR = 0x0F;  // 16位字符位
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.TALK = 1;    //启用主控模式、正常相位、
                      //启用 TALK、禁用 SPI int。
SpiaRegs.SPIBRR = 15; //6         // 15 -> 1Mbps
  SpiaRegs.SPICCR.bit.SPISWRESET = 1;    //从复位中撤回 SPI
  SpiaRegs.SPIPRI.bit.FREE = 1;      //设置断点以使断点不会干扰 xmission
SpiaRegs.SPIPRI.bit.TRIWIRE =1;//3线模式
  //初始化 SPI FIFO 寄存器
//  SpiaRegs.SPIFFTX.All=0xE040;
//  SpiaRegs.SPIFFRX.All=0x2044;
//  SpiaRegs.SPIFFCT.All=0x0;
uint16 RDATA_t = 0;
UINT16虚拟= 0;
unsigned int SW = 0;
UINT16 TLE5012B_READ_Angle (空)
uint16 sdata、RDATA;
sdata = 0x8021;         //请参阅演示
SpiaRegs.SPICTL.bit.TALK = 1;//启用发送路径
SpiaRegs.SPITXBUF = sdata;//主设备发送数据
while (SpiaRegs.SPISTS.bit.INT_flag!=1){}//等待数据接收
dummy = SpiaRegs.SPIRXBUF;//从自身清除垃圾数据
//接收相同的数据 TX
SpiaRegs.SPICTL.bit.TALK = 0;//禁用发送路径
SpiaRegs.SPITXBUF = sdata;//发送虚拟以启动 TX
//注:由于 TALK = 0、数据不会发送到 SPISIMOA 引脚
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}//等待数据接收
RDATA = SpiaRegs.SPIRXBUF;//主设备读取数据
SpiaRegs.SPICTL.bit.TALK = 0;//禁用发送路径
SpiaRegs.SPITXBUF = sdata;//发送虚拟以启动 TX
//注:由于 TALK = 0、数据不会发送到 SPISIMOA 引脚
while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}//等待数据接收
  SW = SpiaRegs.SPIRXBUF;//主设备读取数据
返回 RDATA-32768;
问题是什么?
如果有任何帮助,将不胜感激。 提前感谢您!  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。

    我不明白您之前提到的仿真是什么? 您能否解释一下它有时是如何工作的?
    您能否确认在传输的主 TX 和从 TX 阶段之间提供足够的时间。 如果这个时间不够、从器件可能没有及时切换模式。


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

    您好!

    首先、感谢您的帮助。

    我说过的仿真是、将 SPICLK SPISTE SPISIMO 引脚设置为通用 GPIO。 然后根据通信时间序列设置高电平或低电平。

    代码如下:

    #define SSC_SCK_SET GpioDataRegs.GPASET.bit.GPIO18 = 1;
    #define SSC_SCK_RESET GpioDataRegs.GPACLEAR.bit.GPIO18 = 1;

    #define SSC_CSQ_SET GpioDataRegs.GPASET.bit.GPIO19 = 1;
    #define SSC_CSQ_RESET GpioDataRegs.GPACLEAR.bit.GPIO19 = 1;

    #define SSC_DATA_SET GpioDataRegs.GPASET.bit.GPIO16=1;
    #define SSC_DATA_RESET GpioDataRegs.GPACLEAR.bit.GPIO16=1;

    #define SSC_DATA GpioDataRegs.GPADAT.bit.GPIO16

    空 Init5012BGpio (空)

    EALLOW;

    GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;//将 GPIO17配置为 SPISOMIA
    GpioCtrlRegs.GPADIR.bit.GPIO16=1;// 1=输出、0=输入

    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;//将 GPIO18配置为 SPICLKA
    GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;// 1=输出、0=输入

    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;//将 GPIO19配置为 SPISTEA
    GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;// 1=输出、0=输入
    GpioDataRegs.GPASET.bit.GPIO19=1;

    EDIS;

    void data_for_read (void)

    EALLOW;
    GpioCtrlRegs.GPADIR.bit.GPIO16 = 0;// 1=输出、0=输入
    EDIS;

    void data_for_Write (void)

    EALLOW;
    GpioCtrlRegs.GPADIR.bit.GPIO16=1;// 1=输出、0=输入
    EDIS;

    unsigned int SW = 0;
    unsigned int TLE5012B_Read_Angle (void)

    unsigned char count = 0;
    unsigned int add = 0;
    unsigned int add_int = 0;
    unsigned int read_data = 0;

    ssc_sck_reset;
    ADD = 0x8021;
    SSC_CSQ_RESET;

    asm (" NOP ");
    asm (" NOP ");

    for (计数=0;计数<16;计数++)

    if (添加0x8000)

    ssc_data_set;

    其他

    ssc_data_reset;

    ssc_sck_set;
    asm (" NOP ");
    asm (" NOP ");
    ADD = ADM<<1;
    ssc_sck_reset;
    asm (" NOP ");
    asm (" NOP ");

    ssc_data_set;
    asm (" NOP ");
    asm (" NOP ");
    for (计数=0;计数<16;计数++)

    Read_data = Read_data <<1;
    ssc_sck_set;
    asm (" NOP ");
    asm (" NOP ");
    ssc_sck_reset;
    asm (" NOP ");
    asm (" NOP ");

    data_for_read ();
    if (ssc_data)

    READ_DATA = READ_DATA|0x0001;

    for (计数=0;计数<16;计数++)

    SW = SW<<1;
    ssc_sck_set;
    asm (" NOP ");
    asm (" NOP ");
    ssc_sck_reset;
    asm (" NOP ");
    asm (" NOP ");
    if (ssc_data)

    SW = SW|0x0001;


    DATA_for_Write();
    SSC_CSQ_SET;
    asm (" NOP ");
    asm (" NOP ");
    asm (" NOP ");
    asm (" NOP ");
    返回 READ_DATA-32768;

    而且、在数据表中、传输的主 TX 和从 TX 阶段之间的时间为130ns。我在前面提到的图表中、您可以看到时间大约为3us、因此就足够了。 在 仿真中、时间是完全相同的。

    我在实际 SPI 三线制模式或采样中获得的代码是否错误?

    谢谢、此致!

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

    好的、仿真只是对协议进行位拆裂、似乎可以正常工作。

    您是否确认两个器件之间的时序模式正确、如 SPI 代码所示、您被配置为极性0、相位0、因此这是上升沿而无延迟:因此 DAT 在上升沿传输、然后锁存在下降沿。 确认这与从器件的预期相符。

    您的 SPI 代码与我们在数据表中共享的代码看起来没有什么不同。

    您能否尝试在3线模式下在器件上同时使用 SPIA 和 SPIB 的简单测试用例? 行为是否有任何不同?

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

    几天以来,我没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请拒绝此解决方案并回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    谢谢、
    标记