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/TMS320F28377D:W5500 (WIZnet)的 SPI 接口问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/809329/ccs-tms320f28377d-spi-interface-problem-with-w5500-wiznet

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

我正在尝试在 TMS320F28377D 和 W5500 (WIZnet、 硬件 TCP/IP IC)之间进行连接。

我花 了很多时间 与 他们进行连接。 但是、我遇到了困难。

以下代码是我的 SPIA 模块设置代码。

void SPIA_init()

 EALLOW;
 DevCfgRegs.CPUSEL6.bit.SPI_A = 0;   //选择 CPU1
 CpuSysRegs.PCLKCR8.bit.SPI_A = 1;   //选择 CPU 时钟/

 // GPIO_setting。
 GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;  //启用 GPIO16上的上拉电阻(SPISIMOA)
 GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;//异步输入 GPIO16 (SPISIMOA)
 GpioCtrlRegs.GPBGMUX2.bit.GPIO54=0;
 GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;//将 GPIO16配置为 SPISIMOA

 GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;  //启用 GPIO17上的上拉电阻(SPISOMIA)
 GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;//异步输入 GPIO17 (SPISOMIA)
 GpioCtrlRegs.GPBGMUX2.bit.GPIO55=0;
 GpioCtrlRegs.GPBMUX2.bit.GPIO55=1;//将 GPIO17配置为 SPISOMIA

 GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;  //启用 GPIO18上的上拉电阻器(SPICLKA)
 GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;//异步输入 GPIO18 (SPICLKA)
 GpioCtrlRegs.GPBGMUX2.bit.GPIO56=0;
 GpioCtrlRegs.GPBMUX2.bit.GPIO56=1;//将 GPIO18配置为 SPICLKA

 GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;  //启用 GPIO57上的上拉电阻器(SPISTEA)
 GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;//异步输入 GPIO57 (SPISTEA)
 GpioCtrlRegs.GPBGMUX2.bit.GPIO57=0;
 GpioCtrlRegs.GPBMUX2.bit.GPIO57=1;//将 GPIO18配置为 SPICLKA

 GpioCtrlRegs.GPAPUD.bit.GPIO23=0;
 GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3;
 GpioCtrlRegs.GPAGMUX2.bit.GPIO23 = 0x0;  // W5500的 RST 引脚
 GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0x0;
 EDIS;

 SpiaRegs.SPICCR.bit.SPISWRESET = 0;
 SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;//下降沿数据传输
 SpiaRegs.SPICCR.bit.SPICHAR =7;//8位字符
 SpiaRegs.SPICTL.ALL = 0x0006;//启用主控模式、正常阶段、启用通话
 SpiaRegs.SPIBRR.ALL = 0x001F;//波特率= LSPCLK/(BRR+1)

 SpiaRegs.SPIFFTX.ALL = 0xE040;//发送寄存器
 SpiaRegs.SPIFFRX.ALL = 0x2041;//读取寄存器
 SpiaRegs.SPIFFCT.all = 0x00;//发送延迟=无延迟
 SpiaRegs.SPIPRI.bit.free=1;
 SpiaRegs.SPICCR.bit.SPISWRESET = 1;

使用前面提到的代码、我尝试确认 W5500接口是否工作正常。 实际上、如果 我向 W5500发送一条特定的命令消息(24位)、我希望得到所需的数据、如下图(来自 W5500数据表)所示。  

但是,在我的情况下,我无法获得下图所示的数据(通道1 (黄色线路):SPI_CLK, 通道2 (浅蓝色线路):SPI_MOSI,通道3 (深紫色线路):SPI_MISO

我不理解与结果相关的几种情况

1) 1)为什么 SPI_CLK 和/AWEW 信号在从 W5500接收数据之前完成。

2) 2)  TMS32028377D 的命令传输期间不需要的信号是什么。

要解决此问题、 您能否 给我 一个 SPIA 设置代码和 任何解决方案的审核?

此致

李承浩  

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

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

    李承浩,你好。

    我看到您在主配置中使用了 clock_polyarity=1和 clock_phy=0。 您能否确认是否也为相同配置配置了 W5500?

    此外、您能否共享 TX 代码(您尝试传输命令消息的代码)? 它将帮助我们关联您共享的波形。

    此致、
    Praveen

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

    尊敬的 Praveen

    感谢您的友好回复。

    我已确认 W5500配置。 其随附文件中所示的时序图显示 了当 SPI_CLK 空闲时、下降沿的数据传输和上升沿接收的数据。

    我使用 W5500发送与数据交换相关的函数

    void WIZCHIP_WRITE (unsigned long AddrSel、unsigned int arg)

     unsigned int i =0;
     unsigned int Send_Cmd[3]={0、};

     AddrSel |=(_W5500_SPI_WRITE_|_W5500_SPI_VDM_OP_);

     SEND_Cmd[0](AddrSel&0x00FF0000)>16;
     SEND_Cmd[1]=(AddrSel&0x0000FF00)>>8;
     SEND_Cmd[2]=(AddrSel&0x000000FF);

     //CS_ON//手动使用 SPISTEA
     for (i=0;i<3;i++)
     {
      SpiaRegs.SPITXBUF=(Send_Cmd[i][8);     //发送命令
     }
     SpiaRegs.SPITXBUF=arg<<8;     //发送数据
     while (!SpiaRegs.SPIFFTX.bit.TXFFST){}
     //CS_OFF//手动使用 SPISTEA

    unsigned int WIZCHIP_READ (unsigned long AddrSel)  //unsigned int common_REG_READ_BYTE (unsigned int Addr_off);

     unsigned int rcv_data;
     unsigned int i=0;
     unsigned int Send_Cmd[3]={0、};
     if (!SpiaRegs.SPIFFRX.bit.RXFFST) SpiaRegs.SPIFFRX.bit.RXFIFORESET =0;SpiaRegs.SPIFFRX.bit.RXFIFORESET =1;
     AddrSel |=(_W5500_SPI_READ_| 1);

     SEND_Cmd[0](AddrSel&0x00FF0000)>16;
     SEND_Cmd[1]=(AddrSel&0x0000FF00)>>8;
     SEND_Cmd[2]=(AddrSel&0x000000FF);

     //CS_ON//手动使用 SPISTEA
     for (i=0;i<3;i++)
     {
      SpiaRegs.SPITXBUF=(Send_Cmd[i][8);     //发送命令
     }

     RCV_DATA=(SpiaRegs.SPIRXBUF>>8); //接收数据

     //while (!SpiaRegs.SPIFFRX.bit.RXFFST){;}
     //CS_OFF//手动使用 SPISTEA
     返回 rcv_data;

    在 main()中,我只调用函数。

    此致

    李承浩

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

    李承浩,你好。

    感谢您的确认。

    根据 SPI 协议、只要 TXBUF 中写入数据、主节点就会生成 CLK。 根据您共享的代码、我看到在 WIZCHIP_READ 函数中只写入了3 x 8位数据、因此您可以在 SIMO 上看到24个时钟和相应的数据。

    如果您需要生成 CLK 以接收超过24位命令数据包的数据包、我建议您在传输命令数据包后启动一个伪主机传输、例如8位(如果您希望从从节点获得8位数据)。

    您可以尝试使用虚拟 TXBUF 写入吗?

    此致、
    Praveen

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

    李承浩,你好。

    您是否能够尝试这些建议? 祝你好运?

    此致、
    Praveen

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

    尊敬的 Praveen

    我很抱歉 耽误你的回答。

    我尝试根据您的建议进行测试

    请参阅以下 添加了虚拟的代码。

    unsigned int WIZCHIP_READ (unsigned long AddrSel)  //unsigned int common_REG_READ_BYTE (unsigned int Addr_off);

     unsigned int rcv_data;
     unsigned int i=0;
     unsigned int Send_Cmd[4]={0、};
     if (!SpiaRegs.SPIFFRX.bit.RXFFST) SpiaRegs.SPIFFRX.bit.RXFIFORESET =0;SpiaRegs.SPIFFRX.bit.RXFIFORESET =1;
     AddrSel |=(_W5500_SPI_READ_| 1);

     SEND_Cmd[0](AddrSel&0x00FF0000)>16;
     SEND_Cmd[1]=(AddrSel&0x0000FF00)>>8;
     SEND_Cmd[2]=(AddrSel&0x000000FF);
     SEND_Cmd[3]=0;  //Dummy
     //CS_ON//手动使用 SPISTEA
     for (i=0;i<4;i++)
     {
      SpiaRegs.SPITXBUF=(Send_Cmd[i][8);     //发送命令
     }

     RCV_DATA=(SpiaRegs.SPIRXBUF>>8);

     //while (!SpiaRegs.SPIFFRX.bit.RXFFST){;}
     //CS_OFF//手动使用 SPISTEA
     返回 rcv_data;

    尽管在发送命令数据包后添加了虚拟数据、但它显示的结果与下图所示的结果相同

    (通道1. :SPI CLK,通道2 :MISO,Ch. 3. : MOSI )

    如您所见、  在完成 发送命令数据包(24位)之前 、将导入不需要的数据。  

    此外、我发现 RX (MISO)和 TX (MOSI)信号在 SPI CLK 信号单端的负边沿上进行互阻抗或接收数据。

    我的 SPI 设置代码如下:

    void SPIA_init (void)

     EALLOW;
     DevCfgRegs.CPUSEL6.bit.SPI_A = 0;   //选择 CPU1
     CpuSysRegs.PCLKCR8.bit.SPI_A = 1;   //选择 CPU 时钟/

     // GPIO_setting。
     GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;  //启用 GPIO54上的上拉电阻(SPISIMOA)
     GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;//异步输入 GPIO54 (SPISIMOA)
     GpioCtrlRegs.GPBGMUX2.bit.GPIO54=0;
     GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;//将 GPIO54配置为 SPISIMOA

     GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;  //启用 GPIO55上的上拉电阻(SPISOMIA)
     GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;//异步输入 GPIO55 (SPISOMIA)
     GpioCtrlRegs.GPBGMUX2.bit.GPIO55=0;
     GpioCtrlRegs.GPBMUX2.bit.GPIO55=1;//将 GPIO56配置为 SPISOMIA

     GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;  //启用 GPIO56上的上拉电阻器(SPICLKA)
     GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;//异步输入 GPIO56 (SPICLKA)
     GpioCtrlRegs.GPBGMUX2.bit.GPIO56=0;
     GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;//将 GPIO56配置为 SPICLKA

     GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;  //启用 GPIO57上的上拉电阻器(SPISTEA)
     GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;//异步输入 GPIO57 (SPISTEA)
     GpioCtrlRegs.GPBGMUX2.bit.GPIO57=0;
     GpioCtrlRegs.GPBMUX2.bit.GPIO57=1;//将 GPIO57配置为 SPICLKA

     GpioCtrlRegs.GPAPUD.bit.GPIO23=0;
     GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3;
     GpioCtrlRegs.GPAGMUX2.bit.GPIO23 = 0;  // W5500的 RST 引脚
     GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;
     EDIS;

     SpiaRegs.SPICCR.bit.SPISWRESET = 0;
     SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;//下降沿数据传输
     SpiaRegs.SPICCR.bit.SPICHAR =7;//8位字符
     SpiaRegs.SPICTL.ALL = 0x0006;//启用主控模式、正常阶段、启用通话
     SpiaRegs.SPIBRR.ALL = 0x001F;//波特率= LSPCLK/(BRR+1)

     SpiaRegs.SPIFFTX.ALL = 0xE040;//发送寄存器
     SpiaRegs.SPIFFRX.ALL = 0x2041;//读取寄存器
     SpiaRegs.SPIFFCT.all = 0x00;//发送延迟=无延迟
     SpiaRegs.SPIPRI.bit.free=1;
     SpiaRegs.SPICCR.bit.SPISWRESET = 1;

    我还没有找到 问题的原因。

    此致

    李承浩

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

    李承浩,你好。

    不需要的数据似乎来自 SPI 从器件(在您的情况下为 W5500)。 您可能必须从 W5500规格中检查这种情况的发生原因。 我建议从 W5500规格开始查找以下内容:

    1.  W5500规格是否提到 SOMI 将在命令传输阶段保持低电平? 如果是、您期望的是公平的。 W5500规格在命令阶段是否提到 SOMI?
    2. 在传输的数据阶段是否按照您的命令的预期收到 SOMI 数据?


    关于以下评论:
    "此外、我发现 RX (MISO)和 TX (MOSI)信号在 SPI CLK 信号单端的负边沿上进行互阻抗或接收数据。"

    这与所配置的 SPI 模式一致。 数据在负边沿启动、并将在正边沿采样。请参考数据表图5-68以获取参考。  

    此致、
    Praveen

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

    李承浩,你好。

    我已经听不到您的意见了两周,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    此致、
    Praveen