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.

[参考译文] TMS320F2812:与 EtherCAT 控制器进行8位 SPI 通信

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/569859/tms320f2812-8-bit-spi-communication-with-ethercat-controller

器件型号:TMS320F2812

我使用 TMS320F2812 (在此处称为 DSP)与使用 ET1100芯片组的 EtherCAT 从站控制器进行通信。

我想建立一个8位 SPI 通信、其中 DSP 是主器件、Et1100是从器件。

我的问题包括
SPI 使能线路不能按预期工作。 我希望 SPI 使能线路在通信开始时变为有效(低电平)、然后在8位通信后变为无效(高电平)。 这也让我产生了一个问题:在我加载 TXBUF 后、我是否应该等待 x 微/毫秒、然后再加载下一个 TXBUF? 这是否也会导致使能线路无法按预期工作?  

以下函数用于对 et1100进行读取和写入。

void esc_read (uint16_t 地址、void *buf、uint16_t len、void *tALevent){
uint16_t count = 0;
unsigned int *ptr;
uint16_t ADR = 0;
uint16_t I = 0;

//ADR =地址;
ADR =(地址<<<3)+ESC_CMD_READ;
ptr = tALevent;
//芯片选择低电平
EALLOW;
GpioDataRegs.GPFDAT.BIT.GPIOF3=0;//发送使能(SYNC)
//SpiaRegs.SPICTL.bit.TALK = 1;
EDIS;

SpiaRegs.SPITXBUF = ADR;
while (! SpiaRegs.SPISTS.bit.INT_FLAG );
__byte (ptr,0)=(SpiaRegs.SPIRXBUF&0x00FF);
SpiaRegs.SPITXBUF = SEND_8BIT (ADR);
while (! SpiaRegs.SPISTS.bit.INT_flag );
__byte (ptr,1)=(SpiaRegs.SPIRXBUF&0x00FF);
计数= len;
ptr = buf;

while ((count--)>1)
{
i=0;
SpiaRegs.SPITXBUF = ESC_NEXT;
while (! SpiaRegs.SPISTS.bit.INT_flag );
__byte (ptr、I)=(SpiaRegs.SPIRXBUF&0x00FF);
i++;
}
SpiaRegs.SPITXBUF = ESC_TERM;
while (! SpiaRegs.SPISTS.bit.INT_FLAG );
//芯片选择高电平
EALLOW;
// SpiaRegs.SPICTL.bit.TALK = 0;
GpioDataRegs.GPFDAT.bit.GPIOF3=1;//发送禁用(SYNC)
EDIS;
__byte (ptr、i)=(SpiaRegs.SPIRXBUF&0xFF);

} 

void esc_write (uint16_t address、void * buf、uint16_t len、void * tALevent){
uint16_t 计数;
uint16_t 虚拟;
unsigned int *ptr;
uint16_t ADR;


ADR =(地址<<<<3)+ESC_CMD_WRITE);
ptr = tALevent;
//芯片选择低电平
EALLOW;
GpioDataRegs.GPFDAT.BIT.GPIOF3=0;//发送使能(SYNC)
// SpiaRegs.SPICTL.bit.TAL=1;
EDIS;

SpiaRegs.SPITXBUF = ADR;
while (! SpiaRegs.SPISTS.bit.INT_FLAG );
__byte (ptr,0)=(SpiaRegs.SPIRXBUF&0x00FF);
SpiaRegs.SPITXBUF = SEND_8BIT (ADR);
while (! SpiaRegs.SPISTS.bit.INT_flag );
__byte (ptr,1)=(SpiaRegs.SPIRXBUF&0x00FF);
计数= len;
ptr = buf;
while ((count--)>0)
{
uint16_t i=0;
SpiaRegs.SPITXBUF = send_8bit (__byte (ptr、i));
i++;
while (! SpiaRegs.SPISTS.bit.INT_FLAG );
虚拟= SpiaRegs.SPIRXBUF;
}
//芯片选择高电平
EALLOW;
// SpiaRegs.SPICTL.bit.TALK = 0;
GpioDataRegs.GPFDAT.bit.GPIOF3=1;//发送禁用(SYNC)
EDIS;

} 

总结-我的主要问题是 SPI 不能按预期工作。

还附加了 SPI 初始化。  

静态空 SPI_INIT (空)
{
EALLOW;
GpioMuxRegs.GPFMUX。ALL=0x000F;//选择 GPIO 作为 SPI 引脚
//端口 F MUX - x000 0000 1111
EDIS;
DINT;

//初始化 SPI FIFO 寄存器
SpiaRegs.SPIFFTX.All=0xA040;
SpiaRegs.SPIFFRX.All=0x2040;
SpiaRegs.SPIFFCT.All=0x0;

SpiaRegs.SPICCR.all =0x0047;//重置打开,(clk pol = 1:下降沿),8位字符位
SpiaRegs.SPICTL.all =0x0006;//启用主控模式、正常相位、
//启用 TALK、禁用 SPI int。
SpiaRegs.SPIBRR = 0x007F;// 150 MHz/4/(127+1)= 292.3 KHz
SpiaRegs.SPICCR.all =0x00C7;//从复位中撤回 SPI
SpiaRegs.SPIPRI.bit.FREE = 1; //设置断点不会干扰 xmission
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Raghu、
    根据我的经验、ET1100 SPI 的时序非常紧张。 您能否参阅 TI 参考设计软件(www.ti.com/.../TIDM-DELFINO-ETHERCAT)、我们在 Delfino 器件上提供了用于 SPI 和 EMIF 的 HAL。 本周将推出软件 HAL 更新。

    如果我正确理解、GPIO 工作正常、但读/写不工作?

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

    为了非常精确、(DSP 是主器件、ET1100是从器件) MOSI、CLK 线路工作正常。 SPI SEL 线路也"看起来"工作正常。 明天早上、我将附加工作中捕获的信号。 我说、由于 SPI SEL 线路比 CLK 线路更早(可能半个时钟周期)变为低电平(有效)、因此工作正常。 ET1100 (MISO)不会按预期回复 MOSI 位。 这正是问题所在。 因为这种情况下、读取和写入当然不起作用。 因此、您的理解是正确的、但我无法100%自信地说导致问题的原因。
    我个人认为问题是因为时间(95%确定)、但我不确定。 我已经把头打断了这么长时间。  
    我们非常感谢 TI 提供的更多帮助。  
    但您的参考资料看起来很有趣。 我将通读代码。 它看起来像是最近更新过的。 此外、您计划本周实现的此 SW HAL 更新是什么?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试降低 MCU 上的 SPI 速度。 我之前提到的 HAL 软件是随 TI 设计一起发布的 F2837x MCU 和 ET1100 PDI 软件、该示例支持 EMIF (16位)和 SPI PDI。 它适用于 F2837x MCU、但应可移植到 F2812或提供良好的基准。 可以从我上面链接的页面或下面的链接下载软件。 在使用 CTT 进行测试后、我对 HAL 做了一些其他更改、很可能会在本周将更新推送到网站。

    www.ti.com/.../tidcc35

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

    需要注意的一点是、在使用 FIFO 模式时不使用 INT_FLAG。 当 SPIDAT 寄存器被复制到 SPIRXBUF 时、该位将被清除;如果您的软件错过了该事件、则它可能会在轮询环路中挂起以设置 INT_FLAG。

    谢谢、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、那么我应该等待更新、或者现有代码足够好、可以查看吗? (我假设 CTT 是某种符合性测试)

    关于 SPI -如何减缓 MCU 上的 SPI (我假设 MCU 是微控制器单元或 DSP)? SPI_SEL 线路(GpioDataRegs.GPFDAT.bit.GPIOF3=1或0)不是软件可控制的。 它仅适用于 TXBUF 寄存器的内容和 SPICCR 字符位(状态控制)。 我必须从我在这个帖子/主题开头提供的代码中更改我的代码。 无论我在软件中做什么、SPI_SEL 线路在 CLK (和 TX 位)之前半个时钟周期(或可能一个完整时钟周期)变为低电平 然后 SPI_SEL 在 CLK 和 TX 位被发送后恢复高电平-这意味着不受软件控制。
    因此、我不清楚您减缓 SPI 意味着什么以及它将如何帮助您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    新代码如下所示(类似的、对于 ESC_READ)

    void esc_write (uint16_t address、void * buf、uint16_t len、void * tALevent){
    uint16_t 计数;
    uint16_t 虚拟;
    unsigned int *ptr;
    uint16_t ADR;
    
    
    ADR =((地址<<<3)+ESC_CMD_WRITE);
    ptr = tALevent;
    
    
    SpiaRegs.SPITXBUF = ADR;
    while (! SpiaRegs.SPISTS.bit.INT_FLAG );
    _byte (ptr、0)=(SpiaRegs.SPIRXBUF&0x00FF);
    SpiaRegs.SPITXBUF = SEND_8BIT (ADR);
    while (! SpiaRegs.SPISTS.bit.INT_FLAG );
    _byte (ptr、1)=(SpiaRegs.SPIRXBUF&0x00FF);
    计数= len;
    ptr = buf;
    while ((count--)>0)
    {
    uint16_t i=0;
    SpiaRegs.SPITXBUF = send_8bit (__byte (ptr、i));
    i++;
    while (! SpiaRegs.SPISTS.bit.INT_FLAG );
    虚拟= SpiaRegs.SPIRXBUF;
    }
    
    
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我同意 FIFO 模式下的 INT_FLAG。 目前、我仅使用一个 TX 寄存器、一个 RX 寄存器。 没有五分之三:)
    此外、当 RXBUF 被读取时(当 SPIDAT 被复制到 RXBUF 时、此位将清零)。 我已经检查了它的工作情况、它是好的。 您可能意味着该位在从 SPIDAT 复制到 RXBUF 时被置位。 但无论如何都很感谢:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Raghu、

    请参阅以下有关启用 FIFO 时 SPI_INT 标志用法的文章。 即使您仅使用 FIFO 的一个字、FIFO 仍处于启用和运行状态。
    e2e.ti.com/.../563115

    我认为 Santosh 指的是物理速度降低 SPI CLK 频率、但您似乎已经以292.3KHz 运行了? 是这样吗?

    您能否分享显示该行为的示波器的任何屏幕截图? 根据我的理解、SPI 按其应有的方式运行。 如果你将一个字载入到 SPITXBUF 中、只要没有更多数据要发送、SPISTE 信号将变为有效(低电平)直到完全传输完成。 您可以在此处进行自己的实验、验证这是否正确、方法是先无休止地填充 FIFO、然后在每个字之间添加延迟。 SPISTE 将会相应地切换。

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

    问题-  

    1.我的初始化是否正确? 我当前正在 DSP 上使用 ClockPolarity = 1和 ClockPhase = 0。 但 Et1100上的相应 SPI 模式如下图所示。  

    2. SPI 读/写不按预期工作。 我个人认为这是由于 SPI 的时序。

    3.我是否需要在读取/写入之间添加一些延迟。 (已提供读取/写入函数)。  

    4.是否有一些我可能遗漏的东西? 我几乎放弃了这一点。 此外、我还从示波器中注意到 SPI_CLK 频率略有波动。 但我也理解该协议是异步协议、因此它不会有太大影响。  

    请帮助我了解出错的地方(或至少可能出错的地方)。

    下图显示了我当前使用的 ET1100 SPI 模式。  

    下图描述了 Et1100时序图。  

    下图显示了实际时序图。 请注意、MISO (Et1100至 DSP)通信似乎正常、但它只是一种连续模式、不会产生任何信息意义)

    感谢您、很抱歉所有垃圾邮件。 我完全陷入困境、迫切需要帮助。  

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

    好的、我将阅读 SPI_INT 标志并进行必要的更新。

    是的、我已经在使用最低值、实际上是292.3KHz。 我不使用 FIFO。

    我刚刚发送了一条消息、希望这可以清除我的问题/当前状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Raghu、

    是的、电流代码足以供参考、它可以正常工作。 您能否对照 TI 示例代码检查您的 SPI 初始化? TI 参考设计所针对的 F2837x 上的 SYSCLK 为200MHz、您的器件和参考设计之间的 LOSPCP 和 SPI 寄存器应相似。

    此致

    Santosh Athuru