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 (在此处称为 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 }
为了非常精确、(DSP 是主器件、ET1100是从器件) MOSI、CLK 线路工作正常。 SPI SEL 线路也"看起来"工作正常。 明天早上、我将附加工作中捕获的信号。 我说、由于 SPI SEL 线路比 CLK 线路更早(可能半个时钟周期)变为低电平(有效)、因此工作正常。 ET1100 (MISO)不会按预期回复 MOSI 位。 这正是问题所在。 因为这种情况下、读取和写入当然不起作用。 因此、您的理解是正确的、但我无法100%自信地说导致问题的原因。
我个人认为问题是因为时间(95%确定)、但我不确定。 我已经把头打断了这么长时间。
我们非常感谢 TI 提供的更多帮助。
但您的参考资料看起来很有趣。 我将通读代码。 它看起来像是最近更新过的。 此外、您计划本周实现的此 SW HAL 更新是什么?
新代码如下所示(类似的、对于 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; } }
问题-
1.我的初始化是否正确? 我当前正在 DSP 上使用 ClockPolarity = 1和 ClockPhase = 0。 但 Et1100上的相应 SPI 模式如下图所示。
2. SPI 读/写不按预期工作。 我个人认为这是由于 SPI 的时序。
3.我是否需要在读取/写入之间添加一些延迟。 (已提供读取/写入函数)。
4.是否有一些我可能遗漏的东西? 我几乎放弃了这一点。 此外、我还从示波器中注意到 SPI_CLK 频率略有波动。 但我也理解该协议是异步协议、因此它不会有太大影响。
请帮助我了解出错的地方(或至少可能出错的地方)。
下图显示了我当前使用的 ET1100 SPI 模式。
下图描述了 Et1100时序图。
下图显示了实际时序图。 请注意、MISO (Et1100至 DSP)通信似乎正常、但它只是一种连续模式、不会产生任何信息意义)
感谢您、很抱歉所有垃圾邮件。 我完全陷入困境、迫切需要帮助。
Raghu、
是的、电流代码足以供参考、它可以正常工作。 您能否对照 TI 示例代码检查您的 SPI 初始化? TI 参考设计所针对的 F2837x 上的 SYSCLK 为200MHz、您的器件和参考设计之间的 LOSPCP 和 SPI 寄存器应相似。
此致
Santosh Athuru