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.

[参考译文] Starterware/AM3352:SPI1失败

Guru**** 2543990 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/600547/starterware-am3352-spi1-fails

器件型号:AM3352

工具/软件:Starterware

各位专家、您好!

在我的板上、我将 SPI0连接到 SPI 闪存、我在 CCS 中创建一个项目、它可能会正常运行。 我的 SPI1接口与 LCD 连接、LCD 也是 SPI 接口、因此我想创建另一个基于 SPI 闪存1的项目来控制 LCD、以便验证我的 LCD 电路。

问题是我找不到 CS0和 SPI_CLK 切换、我复制了下面的代码、

/*对 SPI1实例执行引脚复用*/
RetVal = McSPIPinMuxSetup (1);  


/*启用 McSPI0模块的时钟。*/
McSPI1ModuleClkConfig();  

/*对 SPI0实例的 CS0执行引脚多路复用*/
RetVal = McSPI1CSPinMuxSetup (chNum);  

/*为 McSPI 进行必要的设置配置。*/

McSPISetUp();

 ReadSPIDevice();

/////////////////////////////////// 函数//////////////////////////////////////////////////

int McSPIPinMuxSetup (unsigned int instanceNum)

INT STATUS = E_INST_NOT_SUPPT;

HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_McASP0_ACLKX)= (CONTRAL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_PUTYPESEL |

CONTRAL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_RXACTIVE |

CONTRAL_CONF_MUXMODE (3));// mode3用于 SPI1


HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_McASP0_FSX)= (CONTRAL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_PUTYPESEL |  

CONTRAL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_RXACTIVE |  

CONTRAL_CONF_MUXMODE (3));// mode3用于 SPI1


HWREG (SOC_CONTROL_REGS + CONTROL_CONF_McASP0_AXR0)= (CONTROL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_PUTYPESEL |  

CONTRAL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_RXACTIVE |

CONTRAL_CONF_MUXMODE (3));// mode3用于 SPI1

STATUS = S_PASS;
退货状态;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void McSPI1模块化配置(void)

HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)=
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)=
CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)&
CM_PER_L3_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL)=
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)&
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE)!=
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE);

HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)=
CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKCTRL)&
CM_PER_L3_CLKCTRL_MODULEMODE)!= CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE);

HWREG (SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL)=
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL)!=
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKSTCTRL)=
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL)!=
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKCTRL)=
CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKCTRL)&
CM_PER_L4LS_CLKCTRL_MODULEMODE)!= CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE);

HWREG (SOC_CM_PER_REGS + CM_PER_SPI1_CLKCTRL)&&=~CM_PER_SPI1_CLKCTRL_MODULEMODE;

HWREG (SOC_CM_PER_REGS + CM_PER_SPI1_CLKCTRL)|=
CM_PER_SPI1_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_regs + CM_PER_SPI1_CLKCTRL)&
CM_PER_SPI1_CLKCTRL_MODULEMODE)!= CM_PER_SPI1_CLKCTRL_MODULEMODE_ENABLE);


while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK);

while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)&
CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK);

while (!(HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)&
(CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK |
CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK)));

while (!(HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
(cm_per_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |
CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_SPI_GCLK));

////////////////////////////////////////////////////////////////////////////////////////////

int McSPI1CSPinMuxSetup (unsigned int csPinNum)

int status = E_INVALID_CHIP_SEL;

HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_McASP0_AHCLKR)= (CONTRAL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_PUTYPESEL |

CONTRAL_CONF_SPI1_SCLK_CONF_SPI1_SCLK_RXACTIVE |

CONTRAL_CONF_MUXMODE (3));// mode3用于 SPI1


STATUS = S_PASS;

退货状态;

////////////////////////////////////////////////////////////////////////////

//要支持 LCD 的 SPI1,请将_SPI_0_替换为_SPI_1_
静态空 McSPISetUp (空)

/*重置 McSPI 实例。*/
McSPIReset (SOC_SPI_1_regs);

/*启用芯片选择引脚。*/
McSPICSEnable (SOC_SPI_1_regs);

/*启用主操作模式。*/
McSPIMasterModeEnable (SOC_SPI_1_regs);

/*对主控模式执行必要的配置。*/
McSPIMasterModeConfig (SOC_SPI_1_regs、MCSPI_SINGLE_CH、
MCSPI_TX_RX_MODE、MCSPI_DATA_LINE_COMM_MODE_1、
chNum);

/*根据时钟模式配置 McSPI 总线时钟。 *
McSPIClkConfig (SOC_SPI_1_regs、MCSPI_IN_CLK、MCSPI_OUT_FREQ、chNum、
MCSPI_CLK_MODE_0);

/*配置字长。*/
McSPIWordLengthSet (SOC_SPI_1_regs、MCSPI_WORD_LENGTH (8)、chNum);

/*将 SPIEN 的极性设置为低。*/
McSPICSPPolarityConfig (SOC_SPI_1_regs、MCSPI_CS_POL_LOW、chNum);

/*启用 McSPI 外设的发送器 FIFO。*/
McSPITxFIFOConfig (SOC_SPI_1_regs、MCSPI_TX_FIFO_ENABLE、chNum);

/*启用 McSPI 外设的接收器 FIFO。*/
McSPIRxFIFOConfig (SOC_SPI_1_regs、MCSPI_RX_FIFO_ENABLE、chNum);

//////////////////////////////////////////////////////////////////////////////////////

我比较了 SPI0和 SPI1之间"McSPISetUp()"的寄存器状态、它们是相同的、而 SPI1接口不能工作、我没有支付任何其他方面的衰减?

谢谢

Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Biser、

    感谢您的帮助。

    我执行了更多测试来验证 SPI0 (CAN 工作)和 SPI1 (CAN 工作)之间、CCS 内的每个寄存器的状态、例如 McSPI1->MCSPI_CH0CONF、MCSPI_MODULCTRL、MCSPI_CH0STAT、MCSPI_CH0CTRL

    与 McSPI0完全相同。

    两项调查结果:
    1) 1) SPI0的 CS0在上电后为高电平、然后它可以作为命令正确切换、而 SPI1的 CS0始终为"0"。

    2) 2) SPI1的 CLK 也始终为"0"、这是否意味着我没有正确设置 CLK? 如果是、我应该检查哪个寄存器?

    谢谢
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我比较了时钟寄存器 CM_PER_SPI0_CLKCTRL 和 CM_PER_SPI1_CLKCTRL 均为0x2、这是功能模式和使能模式。