大家好、
在我们的应用中、我们将 MibSPI 接口用于 TMS570LC4357和 FPGA 之间的通信、其中 FPGA 配置为主模式、而 TMS570LC4357 配置 为从模式。
建立的通信处于4引脚模式(即 SOMI、MISO、CS、CLK)。 其中主时钟(FPGA)为10MHz。 我们已将 TMS570LC4357 系统时钟配置为180MHz、将外设时钟配置为30MHz、如下所示:
并使用以下代码将 MibSPI (使用 MibSPI2)配置为从器件(Halcogne 生成的代码):
void mibspiInit (void)
{
uint32 i;
/*用户代码开始(2)*/
/*用户代码结束*/
/**@b 初始化@b MIBSPI2 */
/**使 MIBSPI 退出复位*/
mibspiREG2->GCR0 = 0U;
mibspiREG2->GCR0 = 1U;
/**启用 MIBSPI2多缓冲模式并启用缓冲 RAM */
mibspiREG2->MIBSPIE =(mibspiREG2->MIBSPIE & 0xFFFFFFFEU)| 1U;
/** MIBSPI2主控模式和时钟配置*/
mibspiREG2->GCR1 =(mibspiREG2->GCR1 & 0xFFFFFFFCU)|((uint32)((uint32) 0U << 1U)/* CLOKMOD */
|0U);/*主设备*/
/** MIBSPI2使能引脚配置*/
mibspiREG2->INT0 =(mibspiREG2->INT0 & 0xFEFFFFFFU)|(uint32)((uint32) 0U << 24U);//启用 HICHZ */
/**-延迟*/
mibspiREG2->delay =(uint32)((uint32) 0U <<24U)/* C2TDELAY */
|(UINT32)((UINT32) 0U <<16U)/* T2CDELAY */
|(UINT32)((UINT32) 0U <<8U)/* T2EDELAY */
|(uint32)((uint32) 0U << 0U);// C2EDELAY *
/**-数据格式0 */
mibspiREG2->FMT0 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 2U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/
/**-数据格式1 */
mibspiREG2->FMT1 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 29U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/
/**-数据格式2 */
mibspiREG2->FMT2 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 29U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/
/**-数据格式3 */
mibspiREG2->FMT3 =(uint32)((uint32) 0U <<24U)/* wdelay */
|(uint32)((uint32) 0U << 23U)/*奇偶校验极性*/
|(uint32)((uint32) 0U << 22U)/*奇偶校验使能*/
|(uint32)((uint32) 0U << 21U)//等待启用
|(uint32)((uint32) 0U << 20U)/*移位方向*/
|(uint32)((uint32) 0U << 17U)/*时钟极性*/
|(uint32)((uint32) 0U << 16U)/*时钟相位*/
|(uint32)((uint32) 29U << 8U)/*波特率预分频*
|(uint32)((uint32) 16U << 0U);/*数据字长度*/
/**-默认芯片选择*/
mibspiREG2->DEF =(uint32)(0xFFU);
/**-在访问 MibSPI 寄存器之前等待缓冲器初始化完成*/
/*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
while ((mibspiREG2->FLG & 0x01000000U)!= 0U)
{
}/*等待*/
/**启用 MIBSPI RAM 奇偶校验*/
mibspiREG2->PAR_ECC_CTRL =(mibspiREG2->PAR_ECC_CTRL & 0xFFFFFFF0U)|(0x00000005U);
/**-初始化传输组*/
mibspiREG2->TGCTRL[0U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32) 0U << 8U);//开始缓冲区
mibspiREG2->TGCTRL[1U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32) 8U << 8U);//开始缓冲区
mibspiREG2->TGCTRL[2U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U)<< 8U);//开始缓冲区
mibspiREG2->TGCTRL[3U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U)<<8U);//开始缓冲区
mibspiREG2->TGCTRL[4U]=(uint32)((uint32) 1U <<30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U+0U)<<8U);//开始缓冲区
mibspiREG2->TGCTRL[5U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U+0U+0U+0U)<< 8U);//开始缓冲区
mibspiREG2->TGCTRL[6U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(uint32)((uint32)(8U+0U+0U+0U+0U+0U+0U+0U)<< 8U);//开始缓冲区
mibspiREG2->TGCTRL[7U]=(uint32)((uint32) 1U << 30U)/* OneShot *
|(UINT32)((UINT32) 0U << 29U)/* pcurrent reset */
|(UINT32)((UINT32) TRG_Always << 20U)/*触发事件*/
|(UINT32)((UINT32) TRG_DISABLED << 16U)/*触发源*/
|(UINT32)((UINT32)(8U+0U+0U+0U+0U+0U+0U+0U+0U+0U)<< 8U);//开始缓冲区
mibspiREG2->TGCTRL[8U]=(uint32)(8U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U)<< 8U;
mibspiREG2->LTGPEND =(mibspiREG2->LTGPEND & 0xFFFF00FFU)|(UINT32)((((UINT32)(8U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+1U-)-1U))<<8U);
/*未复制配置 RAM 组的代码*/
/**- MIBSPI2端口输出值*/
mibspiREG2->PC3 =(uint32)((uint32) 1U <<0U)/* SCS[0]*/
|(uint32)((uint32) 1U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(UINT32)((UINT32) 0U <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *
/**- MIBSPI2端口方向*/
mibspiREG2->PC1 =(uint32)((uint32) 0U <<0U)/* SCS[0]*/
|(uint32)((uint32) 1U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(uint32)((uint32) 1U <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *
/**- MIBSPI2端口开漏使能*/
mibspiREG2->PC6 =(uint32)((uint32) 0U <<0U)/* scs[0]*/
|(uint32)((uint32) 0U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(UINT32)((UINT32) 0U <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *
/**- MIBSPI2端口上拉/下拉选择*/
mibspiREG2->PC8 =(uint32)((uint32) 1U <<0U)/* scs[0]*/
|(uint32)((uint32) 1U << 1U)/* scs[1]*/
|(uint32)((uint32) 1U <<8U)/* ENA */
|(uint32)((uint32) 1U <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 1U <<11U);/* SOMI */
/**- MIBSPI2端口上拉/下拉使能*/
mibspiREG2->PC7 =(uint32)((uint32) 0U <<0U)/* scs[0]*/
|(uint32)((uint32) 0U << 1U)/* scs[1]*/
|(UINT32)((UINT32) 0U <<8U)/* ENA */
|(UINT32)((UINT32) 0U <<9U)/* CLK */
|(uint32)((uint32) 0U <<10U)/* SIMO */
|(uint32)((uint32) 0U << 11U);/* SOMI *
/* MIBSPI2将所有引脚设置为功能*/
mibspiREG2->PC0 =(uint32)((uint32) 1U <<0U)/* scs[0]*/
|(uint32)((uint32) 0U << 1U)/* scs[1]*/
|(uint32)((uint32) 1U <<8U)/* ENA */
|(uint32)((uint32) 1U <<9U)/* CLK */
|(uint32)((uint32) 1U <<10U)/* SIMO */
|(uint32)((uint32) 1U <<11U);/* SOMI */
/**-最后启动 MIBSPI2 */
mibspiREG2->GCR1 =(mibspiREG2->GCR1 & 0xFEFFFFFFU)| 0x01000000U;
}
在该配置中、通过 MIBSPI 发送数据时、我们看到 MIBSPI-RAM 中的数据写入正确、但 FPGA 是 MSB 位设置为1的数据。
示例:如果我们正在发送0x01、0x02、0x03、FPGA 正在接收0xC001、0xC002、0xC003...
不确定导致此问题的实际根本原因。我们还尝试了将 MIBSPI-RAM 配置为不同的 MPU 配置,如严格排序、设备可共享和直写式,但无法正常工作。
在调试时、我们观察到 SPI-INTFLAG 在传输后被设置为位错误和数据长度错误(值为 INTFLAG = 0x0251)、并且 RxBUF/EMU 被写入0x81000000。
但是、当我们将 VCLK1时钟从30MHz 增加到90MHz (如图 I 所示)时、我们不会看到这个问题、并且 INTFLAG 中没有设置错误标志(如图所示)。 (二)。 此外,RxBUF/Emu 被读取为0x8000FFFF,数据正在 FPGA 上正确接收。
图 I:-
图 二:-
我们还尝试了60MHz 的 VCLK1、但我们看到在 INTFLAGS 中设置了位错误、如下所示:
请告诉我们此处是否缺少任何配置。

