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.

[参考译文] TMS320F28388D:如何读取错误行

Guru**** 2595805 points
Other Parts Discussed in Thread: TMS320F28388D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1078155/tms320f28388d-how-to-read-the-miso-lines

部件号:TMS320F28388D
“线程: C2000WARE”中讨论的其它部件

您好,

希望你们做得好。

我们正在使用 TMS320F28388D 控制卡并尝试读取 SPI 错误行。  

以下是 SPI 配置。

//mySPI0初始化

SPI_enableFIFO (mySPI0_base);
SPI_setConfig (mySPI0_base,device_LSPCLK_FREQ,SPI_PROT_POL1PHA0,
SPI_MODE_MASTER,1000000,8);

SPI_disableLoopback (mySPI0_base);
SPI_enableTalk (mySPI0_base);
SPI_disableInterrupt (mySPI0_base,SPI_INT_TXFF);
SPI_setEmulationMode (mySPI0_base,SPI_emulation _fule_run);

SPI_enableModule(mySPI0_base);

下面是我们用于读取 SPI miso 的 API。

 对于(i=0;i<5;i++)

SPI_writeDataNonBlocking (mySPI0_base,地址[i]);
read_data[i]= SPI_readDataNonBlocking (mySPI0_base);
}

但是,当我们交叉检查示波器之间 SPI 误线接收到的数据与通过  SPI_readDataNonBlocking 获得的数据不匹配。

SPI 配置或 SPI 错误行读数方面是否有任何问题?

谢谢

纳维亚·安娜·王子

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

    纳维亚

    从上面的 SPI 代码片段中,您正在尝试从从属 SPI 设备读取5个 SPI 字。对吗?

    如果是,我强烈建议您使用 spi.h 中提供的 SPI_receiveNBytes 函数(driverlib 函数)。 以下函数应帮助您从从属设备接收5个 SPI 字。

    SPI_receiveNBytes(mySPI0_base,&read_data,5,0U);

    此致,

    马诺伊

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

    您好,

    根据建议,我 尝试使用下面的 API 读取错误行。

    SPI_receiveNBytes(mySPI0_base,&read_data,5,0U);

    但是,存储到  READ_DATA 寄存器的数据 会被一个位移。  

    此外 ,即使 我正在发送0x2100000000数据,MOSI 线路也始终为零

    下面是在读取没有  API 的寄存器时捕获的示波器图像。

    黄色为时钟

    蓝色是错误的

    红色是 MOSI

    下面是使用  API 读取寄存器时捕获的示波器图像。

    在比较这两张图像时,观察到 时钟有初始延迟。 我 很好奇为什么会发生这种情况。 这就是我收到的数据被漏掉一位的原因。

    谢谢

     纳维亚·安娜·王子

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

    纳维亚

    SPI_receiveNBytes 确实传输0x00以启动 SPI 事务。 因此,看到 MOSI 上有0,这不足为奇。

    如果要同时传输/接收"N"字节,则需要使用

    SPI_pollingFIFO 事务(基本,字符长度,&TxBuffer,&RxBuffer,NumberOfWords, txDelay)

    其中,

    Base = mySPI0_base

    字符长度=8U

    TXbuffer 应填充0x2100000000

    RXbuffer 可以为空

    NumberOfWords = 5U

    txDelay = 0U

    [引用 userid="511306" url="~/support/icros/C2000 -微控制器-组/CC2000 /f/c2000 -微控制器-论坛/1078155/tms320f28388d-hut-read-he-miso-lines /3991549#3991549">在比较两幅图像时,观察到 初始时钟延迟。 我 很好奇为什么会发生这种情况。 这是我收到的数据被漏掉一位的原因。

    是否确定从属和主中继器正在使用相同的时钟方案? 我还看到 SPI 总线上有很多响铃声。 考虑进行阻抗匹配并清除信号

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

    您好,

    根据建议,我尝试使用   SPI_pollingFIFO 事务(基本,字符长度,&TxBuffer,&RxBuffer,numOfWords, txDelay) API 读取 MOSI 和味噌线,但在示波器上仍获得相同的结果。 下图是相同的图像

    在 MOSI 线路中,我发送的是0x2100000000,但示波器上的情况却不同。  

    下面是 读取 SPI 味噌数据的代码

    UINT32_t SPI_receive_Multichannel_Motor (uint16_t *地址)

    内部 I=0;

    UINT16_t read_data[5]={0};
    UINT32_t 已接收数据=0;

    SPI_pollingFIFO 事务(SPIB_BASE,8U,地址,读取数据,5U, 0U);
    SPI_enableFIFO (SPIB_BASE);


    返回已接收的数据;

    }

     下面是从机和主机的时钟方案

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

    纳维亚

    [引用 userid="511306" url="~/support/icros/c2000微控制器-组/CC2000 /f/c2000微控制器-论坛/1078155/tms320f28388d-hut-read-miso-lines /3998825#3998825">此处的 MOSI 行我发送0x2100000000,但没有收到相同的示波器。  [/引用]

    我真的很担心 SPI 总线的响声。 振铃噪音足够大,导致通信错误。 这就是我建议您执行阻抗匹配的原因。

    您是否可以尝试传输一个字节,并检查是否可以正确地看到以下面所示的两种方法传输的0x21

    方法1:SPI_ANTByte (SPIB_BASE,0x21);

    方法2:

    温度= 0x21;

    Addr =临时(&P);

    SPI_pollingFIFO 事务(SPIB_BASE,8U,地址,读取数据,1U, 0U);

    您能告诉我您是如何在0x2100000000中填充地址的? 这就是我将数据打包的方式。 您是这样做的吗?

    TxData_SPIB[0]= 0x21;

    TxData_SPIB[1]= 0x00;

    TxData_SPIB[2]= 0x00;

    TxData_SPIB[3]= 0x00;

    TxData_SPIB[4]= 0x00;

    地址=&TxData_SPIB[0]

    此致,

    马诺伊

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

    此外,您尝试通信的 SPI 从属设备是什么?

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

    您好,

    您尝试通信的 SPI 从属设备是什么?

    我们正在尝试通过具有  TMS320F28388D 控制器的 SPI 连接到 TMC5160A 电机驱动器

    以下是通信所需的 SPI 配置

    • SPI 速度:1MHz
    • SPI 模式:3.
    • SPI 字符长度:8.
    • 电动机驱动器寄存器长度:40 (8位地址+32位数据)
    • 由于马达驱动器寄存器需要40位数据,我们必须发送8位数据五次。

    //SPIB GPIO 配置
    syssctl_enablePeripheral (sysctl_Periph_CLK_SPIB);
    GPIO 设置精确配置(GPIO_24_SPIB_SIMO);
    GPIO 设置引脚配置(GPIO_25_SPIB_SOMI);
    GPIO 设置引脚配置(GPIO_26_SPIB_CLK);
    GPIO 设置引脚配置(GPIO_27_SPIB_Sten);

    //mySPIB 初始化
    SPI_disableModule (SPIB_BASE);
    SPI_enableFIFO (SPIB_BASE);
    SPI_setConfig (SPIB_BASE,DEVICE_LSPCLK_FREQ,SPI_PROT_POL1PHA0,
    SPI_MODE_MASTER,1000000,8);
    SPI_disableLoopback (SPIB_BASE);
    SPI_enableTalk (SPIB_BASE);
    SPI_disableInterrupt (SPIB_base,SPI_INT_TXFF);
    SPI_setEmulationMode (SPIB_base,SPI_emonization_fule_run);
    SPI_enableModule(SPIB_base);

    方法1:SPI_ANTByte (SPIB_BASE,0x21);

    在尝试方法1时,代码不会进入下一行执行。 我猜测,因为我在 SPI 配置中启用了 FIFO,所以它不会进入下一行。

    方法2:

    温度= 0x21;

    Addr =临时(&P);

    SPI_pollingFIFO 事务(SPIB_BASE,8U,地址,读取数据,1U, 0U);

    以上是示波器图像,用于发送8位 SPI_pollingFIFO 事务 (SPIB_base, 8U,地址,读数据, 1U, 0U);

    您能告诉我 您是如何在0x2100000000中填充地址的?  

    UINT32_t Get_Motor_Register_X (uint16_t 地址)

    UINT16_t *SPI_Data=0;
    UINT32_t Received _data=0;
    SPI_Data[0]=地址;
    SPI_Data[1]=0;
    SPI_Data[2]=0;
    SPI_Data[3]=0;
    SPI_Data[4]=0;
    Received_data= SPI_receive_X_Motor (SPI_Data);//此处我正在调用 API 以获取 SPI 传输和 SPI 响应

    返回接收的数据;

    }

    振铃噪音足够大,导致通信错误。 这就是我建议您执行阻抗匹配的原因。

    很抱歉我不理解阻抗匹配。 您能对此做 些详细说明 吗?

    谢谢

    纳维亚

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="511306" url="~ë/support/icros/c2000-icroms-group/c2f/c2000-微控制器-forume/1078155/tms320f28388d-hut-read-miso-lines /4002842#4002842"]

    方法1:SPI_ANTByte (SPIB_BASE,0x21);

    在尝试方法1时,代码不会进入下一行执行。 我猜测,因为我在 SPI 配置中启用了 FIFO,所以它不会进入下一行。

    [/引用]

    我看到您已将 SPI 芯片选择引脚配置为 SPI 引脚,而不是 GPIO 引脚。 您需要将 SPI 芯片选择引脚配置为 GPIO 输出引脚并执行以下操作。 当您提到该代码被卡住时,它应该卡在 SPI_writeDataBlockingNonFIFO 函数中,等待传输完成。

    此外,在使用 SPI_ANTByte 函数时不要启用 SPI FIFO

    您可以检查 SPI_ex6_EEPROM (C2000Ware 示例),这将显示如何使用这些驱动程序库 API。

    1)将 GPIO (用于芯片选择)拉低

    2) SPI_ANTByte (SPIB_BASE,0x21)

    [引用 userid="511306" url="~ë/support/icros/c2000-icroms-group/c2f/c2000-微控制器-forume/1078155/tms320f28388d-hut-read-miso-lines /4002842#4002842"]

    振铃噪音足够大,导致通信错误。 这就是我建议您执行阻抗匹配的原因。

    很抱歉我不理解阻抗匹配。 您能对此做 些详细说明 吗?

    [/引用]

    这是一个基本的电气工程主题,并在 PCB 设计过程中加以注意。 搜索阻抗匹配时,在线材料非常多。 我在 SPI 总线上看到的振铃噪音(SPI 信号峰值)可能会导致通信问题。

    TI 提供的本 AppNote 涵盖了 SDFM 外设的本主题,但这些概念是通用的,可以应用于 SPI

    利用电机驱动器中的隔离 Δ-Σ 调制器实现更好的信号完整性(https://www.ti.com/lit/tida033)

    此致,

    马诺伊