工具/软件:
您好 TI 支持部门、
我观察到 杂散时钟脉冲(干扰) 在 LAUNCHXL-F28377S 板的 SPIB 模块上、SPIA 可在相同的设置下正常工作。
设置:
-
器件:TMS320F28377S、LSPCLK = 50MHz
-
模式:16 位主模式、模式 0、CS 硬件、FIFO 禁用
观察结果:
-
SPIA: 稳定的时钟、1、2 和 5MHz 上无需额外的脉冲
-
SPIB:
-
当 5MHz→时、CLK 和 MOSI(2–4 组)上都有额外脉冲
-
当 2MHz→时、仅 CLK 上出现额外脉冲
-
在 1MHz→时、未观察到任何干扰
-
-
当 SPIB 引脚配置为 GPIO 时、干扰会消失。 启用 Re 的 SPI 多路复用器会恢复干扰。
-
使用不同的逻辑分析仪通道进行测试、以排除测量伪影。
附加测试:
-
将 SPIB 时钟映射到 GPIO65 (SPICLKB) →出现 3 μ s 干扰
-
将 SPIB 时钟映射到 GPIO58 (SPICLKB) →干扰消失
-
但是、在我的应用中、SPIA MOSI 也需要 GPIO58、因此不能直接使用此权变措施。
附件:
-
逻辑分析仪屏幕截图 (SPIA 与 SPIB)
-
带杜邦接线的电路板照片(为了清晰的设置)
-
极少的测试代码
请您确认是不是这样 预期的硬件行为 (由于引脚多路复用器路由)或 配置问题 ?
任何建议的权变措施都将不胜感激。
谢谢您、
Mr. Orhan Gürbüz ć 



#include "driverlib.h"
#include "device.h"
#include "pin_map.h"
void SPIA_init(void);
void SPIB_init(void);
int main(void)
{
Device_init();
Device_initGPIO();
// === SPIA ===
GPIO_setPinConfig(GPIO_58_SPISIMOA);
GPIO_setPinConfig(GPIO_59_SPISOMIA);
GPIO_setPinConfig(GPIO_60_SPICLKA);
GPIO_setPinConfig(GPIO_61_SPISTEA);
// === SPIB ===
GPIO_setPinConfig(GPIO_63_SPISIMOB);
GPIO_setPinConfig(GPIO_64_SPISOMIB);
GPIO_setPinConfig(GPIO_65_SPICLKB); // GPIO_58_SPICLKB
GPIO_setPinConfig(GPIO_66_SPISTEB);
SPIA_init();
SPIB_init();
while(1)
{
SPI_writeDataNonBlocking(SPIB_BASE, 0xAAAA);
SPI_writeDataNonBlocking(SPIA_BASE, 0x5555);
DEVICE_DELAY_US(20);
}
}
void SPIA_init(void)
{
SPI_disableModule(SPIA_BASE);
SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0, SPI_MODE_MASTER, 5000000, 16);
SPI_disableFIFO(SPIA_BASE);
SPI_disableInterrupt(SPIA_BASE, SPI_INT_RXFF | SPI_INT_TXFF | SPI_INT_RX_OVERRUN | SPI_INT_RXFF_OVERFLOW | SPI_INT_RX_DATA_TX_EMPTY);
SPI_clearInterruptStatus(SPIA_BASE, SPI_INT_RXFF | SPI_INT_TXFF | SPI_INT_RX_OVERRUN | SPI_INT_RXFF_OVERFLOW | SPI_INT_RX_DATA_TX_EMPTY);
SPI_enableModule(SPIA_BASE);
}
void SPIB_init(void)
{
SPI_disableModule(SPIB_BASE);
// GPIO_setPinConfig(GPIO_65_GPIO65);
SPI_setConfig(SPIB_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0, SPI_MODE_MASTER, 5000000, 16);
SPI_disableFIFO(SPIB_BASE);
SPI_disableInterrupt(SPIB_BASE, SPI_INT_RXFF | SPI_INT_TXFF | SPI_INT_RX_OVERRUN | SPI_INT_RXFF_OVERFLOW | SPI_INT_RX_DATA_TX_EMPTY);
SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_RXFF | SPI_INT_TXFF | SPI_INT_RX_OVERRUN | SPI_INT_RXFF_OVERFLOW | SPI_INT_RX_DATA_TX_EMPTY);
SPI_enableModule(SPIB_BASE);
// GPIO_setPinConfig(GPIO_65_SPICLKB);
}