https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595046/am5728-spi-issues
器件型号:AM5728您好!
我的客户在尝试使用 AM5728修订版2.0 EVM 板上的 SPI3、SPI4时遇到问题。
当前目标是使主器件 SPI3仅用于 Tx、从器件 SPI4仅用于 Rx、这两个引脚复用为 P16连接器。
请参阅相关摘录...
- (笑声) 从 boardPadDelayInit.c:boardPadDelayCfg_t pad[]:
/* SPI4从器件、D1上的 Tx;Rx 未使用*/
/* SPI3 - B12上的 clk (P16-GPIO5_10:34)*
{0x16D4、0xD0003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI3 - A11上的 D1 (P16-GPIO5_11:4); MOSI Tx *
{0x16D8、0xD0003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
B13上的/* SPI3 - d0 (P16-GPIO5_12:33); MISO (未使用)*
{0x16DC、0xD0003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI3 - A12上的 cs0 (P16-GPIO5_17:3)*/
{0x16E0、0x90003、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI4从器件、D0上接收;Tx 未使用*/
/* SPI4 - N7上的 clk (P16-VIN3A_HSYNC:9)*
{0x1460、0xD0008、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI4 - R4上的 D1 (P16-VIN3A_VSYNC:37); MISO (未使用)*/
{0x1464、0x90008、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
N9上的/* SPI4 - d0 (P16-VIN3A_DE0:14); 黄色;MOSI (Rx 输入)*
{0x1468、0xD0008、{0x0、0}、 {0x0、0、0}、{0x0、0、 0}}、
/* SPI4 - P9上的 cs0 (P16-VIN3A_FLD:44)*/
{0x146C、0xD0008、{0x0、0、0}、 {0x0、0、0}、{0x0、0、 0}}、
- (笑声) 从 evmAM572x_clock.c:Board_moduleClockInit():
/*添加了对主器件回送的 SPI3支持*/
CSL_FINST (l4PerCmReg -> CM_L4PER_MCSPI3_CLKCTRL_REG、
L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI3_CLKCTRL_REG_MODULEMODE、ENABLE);
/*添加了对从器件回送的 SPI4支持*/
CSL_FINST (l4PerCmReg -> CM_L4PER_MCSPI4_CLKCTRL_REG、
L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI4_CLKCTRL_REG_MODULEMODE、ENABLE);
- (笑声) 从 main_mcspi_slave_mode.c:spi_test_mst_SLV_xfer ():
#define MCSPI3_base 0x480b8000
#define MCSPI4_base 0x480ba000
#define WR_REG (reg、val)(*(uint32_t*)(reg)= val)
#define RD_REG (reg、var)(var =*(volatile UINT32_t*) reg)
#define SPI3_CH1CONF (MCSPI3_base + 0x12c)
#define SPI4_CH1CONF (MCSPI4_base + 0x12c)
如果(主机== true)
{
transaction.txBuf =(ptr) masterTxBuffer;
transaction.rxBuf =(ptr) addrMasterRxBuf;
/*设置主设备 D0_IN D1_OUT */
RD_REG (SPI4_CH1CONF、CNF);
cnf |= 1 << 16;
cnf &=~((1 << 18)|(1 << 17));
WR_REG (SPI4_CH1CONF、CNF);
}
其他
{
transaction.txBuf =(ptr) slaveTxBuffer;
transaction.rxBuf =(ptr) addrSlaveRxBuf;
/*设置从器件 D0_IN D1_OUT */
RD_REG (SPI3_CH1CONF、CNF);
cnf |= 1 << 16;
cnf &=~((1 << 18)|(1 << 17));
WR_REG (SPI3_CH1CONF、CNF);
}
--------
然后、它们在 P16上成对互连引脚、以便 SPI3主器件可以发送到 SPI4从接收器:
34-9 (clk)
4-14 (数据)
3-44 (cs0)
(笑声) 然后、它们继续单步执行 main_mcspi_slave_mode.c:
/*启动 SPI 传输*/
transferOK = SPI_transfer (SPI、事务);
if (transferOK){
/*... *
}
它们既不会在 masterRxBuffer 中接收任何消息、也不会在 slaveRxBuffer 中接收任何消息、尽管通过查看示波器、主 SPI 正在传输。
- 另一个结果是、当交换主从角色以便 SPI3为从器件、SPI4为主器件、然后 SPI3从器件正确接收消息时、SPI4主器件不接收任何内容。
- 另一个结果是、在尝试 system_test 时、将 SPI4上的时钟设置为高电平、并在 SPI3寄存器上读取1、正如预期的那样、检测到、但在 SPI3上设置时钟并在 SPI4上读取时、检测到0。
(在我看来、如果 SPI4时钟输入由于未知原因而无法正常工作、这种情况就像这样。 或者、我也可能错过器件配置中的某个内容?)
请给我一些提示吗?
提前感谢您、
此致、
Alberto