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.

[参考译文] TMS570LS1224:TMS570LS12x Launchpad 和 TMDS570LS31HDK 之间的 SPI 通信问题

Guru**** 2538950 points
Other Parts Discussed in Thread: TMDS570LS31HDK, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/907828/tms570ls1224-issue-of-spi-communicaton-between-tms570ls12x-launchpad-and-tmds570ls31hdk

器件型号:TMS570LS1224
主题中讨论的其他器件:TMDS570LS31HDKHALCOGEN

您好!

此问题与有关 SPI 通信的多项测试有关。

第一个成功测试基于 TMS570LS12x。 SPI1和 SPI3所涉及的测试基于"Example_SPI_Master_Slave.c"代码。 URL 的链接是 https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/902181

第二个失败测试基于我电路板上的 TMS570LS12x 和 AD7705。 URL 的链接是 https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/907453。  

为了找出第二次测试的原因、我在 TMS570LS12x launchpad 中的 SPI1 (作为第一次测试等轮询模式下的主器件)和 TMDS570LS31HDK 中的 SPI2 (作为中断模式下的从器件、如第一次测试)之间进行了第三次测试。 根据主器件的观测接收缓冲器、每一个数据为65535、如下所示。

SPI1和 SPI2的配置如下所示。

下面是在 TMS570LS12x 上运行的 SPI1的测试代码。

//*用户代码开始(0)*//
//*用户代码结束*//

* Include Files */

#include "sys_common.h"

/*用户代码开始(1)*/
#include "spi.h"
#include "Gio.h"
//*用户代码结束*//

@fn void main (void)
*@简要应用程序 main 函数
*@注意此函数默认为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*/

*用户代码开始(2)*/
#define DELAY_VALUE 1000000
uint16 TX_Data_Master[16]={0x01、0x02、0x03、0x04、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、 0x10};
uint16 TX_Data_Slave[16]={0x11、0x12、0x13、0x14、0x15、 0x16、0x17、0x18、0x19、0x1A、 0x1b、0x1C、0x1D、0x1E、0x1F、 0x20};
uint16 RX_Data_Master[16]={0};
uint16 RX_Data_Slave[16]={0};
uint16 cmd=0;
//用户代码结束*

/ int main (void)
{
//用户代码开始(3)*/
int i;
spiDAT1_t 数据通信 fig1_t;

dataconfig1_t.CS_hold = false;
dataconfig1_t.WDEL = true;
dataconfig1_t.DFSEL = SPI_FMT_0;
dataconfig1_t.CSNR = 0x01;/0xFE;

gioInit();

/*根据 GUI 配置初始化 SPI 模块
* SPI1 -主器件(SIMO、SOMI、CLK、CS0)@TMS570LS12x 轮询模式
* SPI2 -从机(SIMO、SOMI、CLK、CS0)@TMDS570LS31HDK 中断模式
*这是 SPI1的主器件
***/
spiInit();

while (1)
{

/*通过轮询模式启动 SPI1发送和接收*/
TransmitAndReceiveData (spiREG1、&dataconfig1_t、16、TX_Data_Master、RX_Data_Master);

while (SPI_completed=SpiRxStatus (spiREG1));

if (RX_Data_Master[15]=0x20)
{
RX_Data_Master[15]=0xff;

gioToggleBit (gioPORTB、1);
}
其他
{
gioSetBit (gioPORTB、2、1);
// while (1);
}
}

for (i=0;i 

下面是在 TMDS570LS31HDK 上运行的 SPI2的测试代码。

//*用户代码开始(0)*//
////*用户代码结束*//

* include Files */

#include "sys_common.h"

//*用户




代码开始(1)*/#include "gio.h"#include "het.h"#include "spi.h"#include "RTI.h"//

@主
函数为 void n *@
@void n 默认为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*/

*用户代码开始(2)*/
#define DELAY_VALUE 1000000
uint16 TX_Data_Master[16]={0x01、0x02、0x03、0x04、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、 0x10};
uint16 TX_Data_Slave[16]={0x11、0x12、0x13、0x14、0x15、 0x16、0x17、0x18、0x19、0x1A、 0x1b、0x1C、0x1D、0x1E、0x1F、 0x20};
uint16 RX_Data_Master[16]={0};
uint16 RX_Data_Slave[16]={0};
uint16 cmd=0;
//用户代码结束*

/ int main (void)
{
//用户代码开始(3)*/
int i;
spiDAT1_t 数据通信 fig1_t;

dataconfig1_t.CS_hold = false;
dataconfig1_t.WDEL = true;
dataconfig1_t.DFSEL = SPI_FMT_0;
dataconfig1_t.CSNR = 0x01;/0xFE;

gioInit();
hetInit();

/*通过 CPSR 启用 CPU 中断*/
_enable_IRQ ();

/*初始化 RTI */
rtiInit();
/*启用 RTI 比较0通知*/
rtiEnableNotification (rtiNOTIFICATION_COMPARE0);
/*开始计数器*/
rtiStartCounter (rtiCOUNTER_BLOCK0);

/*这是从器件 SPI2。 *
spiInit();

while (1)
{
/*通过中断模式启动 SPI2发送和接收*/
SendspiAndGetData (spiREG2、&dataconfig1_t、16、TX_Data_Slave、RX_Data_Slave);

while (cmd==1);
CMD=0;
}
/*用户代码结束*/

返回0;
}


/*用户代码开始(4)*/
void spiEndNotification (spiBASE-t * SPI)
{
IF (SPI_completed=SpiRxStatus (SPI))
{
if (RX_Data_Slave[15]=0x10)
{
RX_Data_Slave[15]=0;
gioToggleBit (hetPORT1、27);
CMD==1;
返回;
}
其他
{
gioSetBit (hetPORT1、17、1);
返回;
}
}else if (SPI_completed=SpiTxStatus (SPI))(否则(SPI_completed=SpiTxStatus (SPI)
{
gioToggleBit (hetPORT1、5);
返回;
}
其他
{
gioSetBit (hetPORT1、25、1);
返回;
}
}

void rtiNotification (uint32通知)
{
gioToggleBit (hetPORT1,29);
}/*
用户代码结束*/ 

下面 显示了连接 TMS570LS12x Launchpad 和 TMDS570LS31HDK 的图片。

请帮助我找出我的错误或遗漏的东西。

此致

Datïan μ A

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

    您好、Tatian、

    如果配置中的芯片选择默认模式(CDEF)为0xFF、则对于 CS0、SPIDAT1中的 CSNR 域应为0xFE。 如果 CDEF 为0x00、CS0的 CSNR 域为0x1。

    从机无法使用时钟从主机传输数据。 请确保 先执行 spiSendAndGetData()是从器件端。  

    如果您首先启动主器件 TX、从器件可能会在其特性溢出之前检测到 CS 失效、SPISOMI 将置于高阻抗模式。  

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

    您好 QJ、

    非常感谢您的清晰解释。 我要尝试一下。

    此致

    Datïan μ A

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

    抱歉、我的拼写错误:

    如果没有主器件的时钟、从器件将无法传输数据。 请确保 先执行从机端的 spiSendAndGetData()。  

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

    您好 QJ、

    我没有找到 SPI2 (从器件)的 csdef。  

    对于 SPI 1 (主器件)、我看到 HalCoGen 中 MibSpi1的 csdef 为0xff、如下所示。 但我认为我使用的是 SPI、而不是 MibSpi。

    因此、我将 CSNR 从0x01更改为0xFE、如下所示。 您认为我的理解是正确的吗?

    我确保上电序列是从器件优先。 在这种情况下、接收数据会发生变化。 但它们并不像预期的那样  

    0x11、0x12、0x13、0x14、0x15、 0x16、0x17、0x18、0x19、0x1A、 0x1b、0x1C、0x1D、0x1E、0x1F、 0x20}。

    我是否可以要求您检查我为帮助我找到原因所做的工作? 您认为我需要探测任何引脚吗?

    此致

    Datïan μ A

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

    您好、Tatian、

    屏幕截图中的 csdef=0xFF 表示 MibSPI1。 请检查 SPI1 (主器件)和 SPI2 (从器件)的 SPIDEF 寄存器的值。

    如何将 SPI2连接到 SPI1? 正确的信号映射应如下所示:

    SPI1_nCS0 -- SPI2_nCS0

    SPI1_CLK -- SPI2_CLK

    SPI1_SIMO -- SPI2_SIMO          

    SPI1_SOMI -- SPI2_SOMI

     

    请勿将 SIMO 连接到 SOMI