工具/软件:TI-RTOS
我目前有一个 SPI 接口、用于连接从 AM57xx 工作的从器件、使用 GPIO 线路和位拆裂。 我正在"迁移"到 PDK MCSPI 驱动程序、但从器件不再响应发送到它的命令。 我的应用程序在 IPU1 (双 M4内核)上运行、具有 SYS/BIOS 6.46.4.53和 am57xx PDK 1.0.6。 我可以在逻辑分析仪上看到 CS、MOSI 和 MISO 线路、我担心传输多个字节时 CS 信号上出现短"尖峰"。 我也不确定初始化值、因为我看到了许多不同的值。
这是我的初始化:
void vSpi_eInitialize (void) { cSL_l4per_cm_core_componentRegs * l4PerCmReg =(cSL_l4per_cm_core_componentRegs *)(cSL_MPU_L4PER_CM_CORE_regs + D32Ipu_IOMMU_Offset); // SPI1时钟启用 CSL_FINST (l4PerCmReg -> CM_L4PER_MCSPI1_CLKCTRL_REG、L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI1_CLKCTRL_REG_MODULEMODE、ENABLE); //等待 SPI 外设启动 while (CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI1_CLKCTRL_REG_IDLEST_FUNC!= CSL_FEXT (l4PerCmReg -> CM_L4PER_MCSPI1_CLKCTRL_REG、 L4PER_CM_CORE_COMPONENT_CM_L4PER_MCSPI1_CLKCTRL_REG_IDLEST ) ); // SPI1_SCLK //注:要使 spim_SCLK 信号正常工作、相应的 INPUTENABLE 位 // CTRL_CORE_PAD_x 寄存器应设置为0x1,因为这样做是为了进行重定时。 HW_WR_REG32 (((Du32Spi_core_pad_io_register_base + CTRL_core_pad_SPI1_SCLK_offset)、 (0x000F0000));//转换_control_slow | INPUTENABLE_Receive_enabled | PULLTYPESELECT_PULLUP | PULLUDENABLE_ENABLE_ENABLE| MUXMODE_SPI1 // SPI1_D1 - Rx HW_WR_REG32 (((Du32Spi_CORE_PAD_IO_Register_base + CTRL_CORE_PAD_SPI1_D1_OFFSET)、 (0x000F0000));//转换_control_slow | INPUTENABLE_Receive_enabled | PULLTYPESELECT_PULLUP | PULLUDENABLE_ENABLE_ENABLE| MUXMODE_SPI1 // SPI1_D0 - Tx HW_WR_REG32 (((Du32Spi_core_pad_io_register_base + CTRL_core_pad_SPI1_D0_offset)、 (0x000B0000));// slew_control_slow | PULLTYPESELECT_PULLUP | PULLUDENABLE_ENABLE_ENABLE_ENABLE_ENABLED | MUXMODE_SPI1 // SPI1_CS0 HW_WR_REG32 (((Du32Spi_core_pad_io_register_base + CTRL_core_pad_SPI1_CS0_offset)、 (0x000B0000));// slew_control_slow | PULLTYPESELECT_PULLUP | PULLUDENABLE_ENABLE_ENABLE_ENABLE_ENABLED | MUXMODE_SPI1 // SPI1_CS1 HW_WR_REG32 (((Du32Spi_core_pad_io_register_base + CTRL_core_pad_SPI1_CS1_offset)、 (0x000B0000));// slew_control_slow | PULLTYPESELECT_PULLUP | PULLUDENABLE_ENABLE_ENABLE_ENABLE_ENABLED | MUXMODE_SPI1 // SPI1_CS2 HW_WR_REG32 (((Du32Spi_core_pad_io_register_base + CTRL_core_pad_SPI1_CS2_offset)、 (0x000B0000));// slew_control_slow | PULLTYPESELECT_PULLUP | PULLUDENABLE_ENABLE_ENABLE_ENABLE_ENABLED | MUXMODE_SPI1 //为 MCSPI3配置 Xbar 连接:映射到 MCSPI3 intr 的 IPU1_IRQ_60 (保留)*/ CSL_xbarIrqConfigure (CSL_XBAR_IRQ_CPU_ID_IPU1、 IPU_IRQ_MCSPI1_IRQ、 CSL_XBAR_MCSPI1_IRQ); //修改默认 SPI 配置 SPI_v1_HWAttrs SPI_cfg0; SPI_socGetInitCfg (0、&SPI_cfg0); SPI_cfg0.baseAddr = CSL_IPU_MCSPI1_regs + D32IPU_IOMMU_Offset; spi_cfg0.chMode = MCSPI_MULTI_CH; SPI_cfg0.enableIntr = false;//轮询模式 spi_cfg0.chnCfg[0].dataLineCommMode = MCSPI_DATA_LINE_COMM_MODE_6;// D1为 Rx;D0为 Tx spi_cfg0.chnCfg[1].dataLineCommMode = MCSPI_DATA_LINE_COMM_MODE_6; spi_cfg0.chnCfg[2].dataLineCommMode = MCSPI_DATA_LINE_COMM_MODE_6; SPI_socSetInitCfg (0、&SPI_cfg0); MCSPI_init(); }
和传输方法:
void vSpiDrv_eTransferBytes (MCSPI_Handle stSpiHandle、TU8 * pucTxBuffer、TU8 * pucRxBuffer、TU8 ucByteCount)
{
SPI_Transaction 事务;
transaction.count = ucByteCount;
transaction.rxBuf = pucRxBuffer;
transaction.txBuf = pucTxBuffer;
bool RetVal = MCSPI_transfer (stSpiHandle、事务);
如果(false ==RetVal)
{
System_printf ("SPI 传输中发生 uC_iTransferByte 错误\n");
}
// System_printf ("MCSPI_transfer returned transaction status =%d\n"、transaction.status);
}
如果有任何关于我可以检查的其他内容的想法、我们将不胜感激。
谢谢、
Mike