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.
工具/软件: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规格开始查找以下内容:
关于以下评论:
"此外、我发现 RX (MISO)和 TX (MOSI)信号在 SPI CLK 信号单端的负边沿上进行互阻抗或接收数据。"
这与所配置的 SPI 模式一致。 数据在负边沿启动、并将在正边沿采样。请参考数据表图5-68以获取参考。
此致、
Praveen
李承浩,你好。
我已经听不到您的意见了两周,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。
此致、
Praveen