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.

[参考译文] TMS320F2.8379万D:与ET1100通信的SPI配置。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/632436/tms320f28379d-spi-configuration-to-communicate-with-et1100

部件号:TMS320F2.8379万D
主题中讨论的其他部件: C2000WAREcontrolSUITE

大家好。

我的目标是在ET1100中通过SPI写入函数来读取和写入内存。 以下硬件配置:

- TMS320F2.8379万D:SPI-C多路复用,10.0101万和102 GPIO,GPIO 103作为CS低电平活动,200MHz,LSPCLK 50MHz。

- ET1100:SPI模式3,SPI SEL极性:活动低,数据输出样本:正常。

我尝试逐步配置SPI,因为它在379D手册中已被描述。 下面是我的配置功能:

void spi_fifo_init()
{
SpicRegs.SPIFFTX.ALL = 0xE040;
SpicRegs.SPIFFRX.ALL = 0x2044;
SpicRegs.SPIFFCT.ALL = 0x0;

InitSpiC();
}

void InitSpiC(void){

//初始化SPI-C

//启用主中继器(0 ==从中继器,1 ==主中继器)
SpicRegs.SPICTL.bit.MASTER_SLAVE = 1;

//在更改配置之前将重置设置为低
SpicRegs.SPICCR.bit.SPISWRESET = 0;

//时钟极性(0 ==上升,1 ==下降)
SpicRegs.SPICCR.bit.CLKPOLARITY = 0;

//时钟相位(0 ==正常,1 ==延迟)
SpicRegs.SPICTL.bit.CLK_PHASE =0;

//设置波特率
SpicRegs.SPIBRR.Bit.SPI_bit_rate = 99;

// 8位字符
SpicRegs.SPICCR.bit.SPICHAR =(8-1);

//启用传输(Talk)
SpicRegs.SPICTL.Bit.Talk = 1;

// SPI中断被禁用
SpicRegs.SPICTL.bit.SPIINTENA = 0;

//设置可用位
//在断点处停止不会停止SPI
SpicRegs.SPIPRI.Bit.free = 1;

//从重置中释放SPI
spicRegs.SPICCR.bit.SPISWRESET =1;
}

void InitSpicGpio()
{
EALLOW;
//为所选引脚启用内部上拉

//GpioCtrlRegs.GPDPUD.bit.GPIO100 = 0;//在GPIO100上启用上拉(SPISIMOA)
GpioCtrlRegs.GPDDIR.bit.GPIO100 = 1;// mosi作为输出

//GpioCtrlRegs.GPDPUD.bit.GPIO101 = 0;//在GPIO101上启用上拉(SPISOMIA)
GpioCtrlRegs.GPDDIR.bit.GPIO101 = 0;// miso作为输出

GpioCtrlRegs.GPDPUD.bit.GPIO102 = 0;//在GPIO102上启用上拉(SPICLKA)
gpioCtrlRegs.GPDDIR.bit.GPIO102 = 1;// clk作为输出

GpioCtrlRegs.GPDDIR.bit.GPIO103 = 1;// cs作为输出
GpioCtrlRegs.GPDPUD.bit.GPIO103 = 0;//在GPIO103上启用上拉(SPISTEA)

//
//将所选引脚的限定条件设置为仅异步
//
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
gpioCtrlRegs.GPDQSEL1.bit.GPIO100 = 3;//异步输入GPIO16 (SPISIMOA)
gpioCtrlRegs.GPDQSEL1.bit.GPIO101 = 3;//异步输入GPIO17 (SPISOMI)
GpioCtrlRegs.GPDQSEL1.bit.GPIO102 = 3;//异步输入GPIO18 (SPICLKA)
GpioCtrlRegs.GPDQSEL1.bit.GPIO103 = 3;//异步输入GPIO19 (SPISEA)

//使用GPIO寄存器配置SPI-C引脚
gpioCtrlRegs.GPDGMUX1.bit.GPIO100 = 1;//将GPIO16配置为SPISIMOA
gpioCtrlRegs.GPDGMUX1.bit.GPIO101 = 1;//将GPIO17配置为SPISOMIA
GpioCtrlRegs.GPDGMUX1.bit.GPIO102 = 1;//将GPIO18配置为SPICLKA
GpioCtrlRegs.GPDGMUX1.bit.GPIO103 = 1;//将GPIO19配置为SPISTEA

gpioCtrlRegs.gPDMUX1.bit.GPIO100 = 2;//将GPIO16配置为SPISIMOA
gpioCtrlRegs.gPDMUX1.bit.GPIO101 = 2;//将GPIO17配置为SPISOMIA
GpioCtrlRegs.GPDMUX1.bit.GPIO102 = 2;//将GPIO18配置为SPICLKA
gpioCtrlRegs.gPDMUX1.bit.GPIO103 = 2;//将GPIO19配置为SPISTEA

EDIS;
} 

能否告诉我我我的SPI配置是否为正版? 我不确定,因为我尝试从ET1100 (有关设备类型的信息)读取0x0地址,但txbuffer上没有发生任何事情。 在我的测试代码下方:

unsigned int byte0 = 0x0;
unsigned int byte1 = 0b0.0011万;
unsigned int byte3 = 0xFF;

GpioDataRegs.GPDCLEAR.bit.GPIO103 = 1;
ASM (" NOP");//需要15ns延迟
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");

SpyRegs.SPIDAT =(字节0 << 8);//正在发送第一个地址字节
while (SpicRegs.SPISTS.bit.BUFFULL_FLAG);

SpyRegs.SPIDAT =(字节1 << 8);//正在发送第二个地址字节
while (SpicRegs.SPISTS.bit.BUFFULL_FLAG);

SpyRegs.SPIDAT =(字节3 << 8);//正在发送等待状态字节
while (SpicRegs.SPISTS.bit.BUFFULL_FLAG);

SpicRegs.SPIDAT =(字节3 << 8);//发送读取终止字节
while (SpicRegs.SPISTS.bit.BUFFULL_FLAG); 

我们非常感谢您提供任何提示。

ET1100数据表: download.beckhoff.com/.../ethercat_et1100_datasheet_v1i9.pdf

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

    Could you tell me ifmy SPI configuration is genuine? I am not sure because I am trying to read 0x0 address from ET1100 (information about type of a device) and nothing is happening on rxbuffer. I posted my test code in previous post. I am trying to use 2 byte  Address modes for Read access with Wait state byte.

    以下是ET110数据表中的表格:

    和示例SPI例程:

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

    您是否已尝试在SPI上启用环回模式以查看是否正确接收您尝试发送的数据? 我们在C2000Ware中提供了这方面的示例供参考。

    您是否使用示波器探测设备之间的信号?

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

    您好,Kris,

    当然,我尝试了TI的环回和示例,具体来自controlSUITE。 和发送的数据正确无误。

    在我的案例中,使用示波器很难调试信号,因为我正在使用LaunchPadXL-F2.8379万D中的J9插座将微控制器与EtherCAT适配器连接起来。

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

    我理解。 您的启动板上是否有其他SPI引脚可用于确认TX波形符合您的预期? 您可以对同一SPI使用不同的引脚输出,也可以将完全相同的配置复制到不同的SPI (例如SPI-B)。

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

    我刚刚注意到rxbuffer中有一些东西,但它不是预期的值。 我认为我对algorhitm有一个问题。 您知道如何正确发送订单吗?

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

    您能否发布接收的数据与预期数据? 如果是位移,可能是极性/相位设置的结果。 我还没有和贝克霍夫部分合作过。 我将查看数据表以了解是否有任何适合您的配置的内容。

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

    我错了,我没有关于味噌的数据。

    但我在LaunchPad上对信号进行了范围划分,一切都正常,我有clk信号和MOSI数据。 为了设置GPIO mux参数,我使用了来自TI云的PinMux工具,以确保配置正确。 在我的项目中,我只设置了GPDDIR寄存器

    我想先读一下ET1100上的注册,它的地址是0x0000。 我发送的数据:

    //SPI_xmit (sdata);
    // 0字节:0b0万,1字节:0b0.0011万,2字节:0b1111.1111万,3字节:0b1111.1111万
    GpioDataRegs.GPDCLEAR.bit.GPIO103 = 1;
    DELAY _US (1);
    SPI_xmit ((0b0万 << 8)| 0b0.0011万);
    while (SpicRegs.SPIFFRX.bit.RXFFST !=1){}
    
    RDATA[0]= SpicRegs.SPIRXBUF;
    
    DELAY _US (1);
    SPI_xmit ((0b1111.1111万 << 8)| 0b1111.1111万);
    while (SpicRegs.SPIFFRX.bit.RXFFST !=1){}
    
    RDATA[1]= SpicRegs.SPIRXBUF;