Thread 中讨论的其他器件:OMAPL138
工具/软件:TI-RTOS
您好!
我正在为 SPI0编写 SPI 驱动程序。 问题 是、当我将 J15 SPI 输出(SIMO 和 CLK 值)连接到示波器时、我看不到任何值。 我正在尝试模拟 SPI 0 CLK 信号(J15 25引脚)。
当我使用 XDS110调试驱动器时、我可以检查寄存器配置是否正确、SPIPC2 (CLKDIN)寄存器在每个周期中更新为高电平至低电平、但示波器不会读取任何输出。
另外、在查看 Starterware 示例和技术手册后、我还有一些问题:
-在 Starterware SPI 示例中,在开始通信之前 CS 未设置为低值。 根据技术手册、变速器在 CS 处于低电平时启动。 正确吗?
-如果 SPI 被定义为主器件、则应配置 SPIPC1位? 我理解阅读参考手册并不是必要的、尽管在我的代码中我配置了以避免错误。
我的代码如下(我不编写所有代码、仅编写重要代码):
InitSPI 从 main 调用、其输入值为 uiSPIReg = SOC_SPI_0_regs
CS 配置为2
#define CS_none_UI 0x00
#define CS_HOLT1_UI 0x04
#define SIMO_SOMI_CLK_CS_UI 0x00000E04 //将 SIMO、SOMI、CLK 和 CS 引脚配置为功能引脚*
#define SIMO_SOMI_CLK_CS_IO_UI 0x00000604 /*值以配置 SMIO、SOMI、CLK 和 CS 引脚输入/输出*
空 InitSPI (const Int_ui uiSPIReg)
{
DataFormat_st stDataFormat;
/*唤醒 SPI1实例。 *
PSCModuleControl (uiSPIReg、HW_PSC_SPI0、PSC_POWERDOMAIN_AYST_ON、
PSC_MDCTL_NEW_ENABLE);
/*执行 SPI1的引脚复用。 *
SPIPinMuxSetup (uiSPIReg);
/*
**使用 SPI1的芯片选择(CS) 2引脚进行通信
*
SPI0CSPinMuxSetup (2);
/*重置 SPI*/
SPIReset (uiSPIReg);
/*活动 SPI (复位后)*/
SPIOutOfReset (uiSPIReg);
/*将 SPI 配置为主接口*/
SPIModeConfigure (uiSPIReg、SPI_MASTER_MODE_UI);
/*设置 SPI 操作4引脚 CS */
SetSPIPinControl (uiSPIReg、SPIIPC0_UI、SIMO_SOMI_CLK_CS_UI);
/*Set Holt1默认 CS 选择 TBD*/
SPIDefaultCSSet (uiSPIReg、CS_HOLT1_UI);
/*配置 SPI 数据格式0*/
stDataFormat.uiWDelay = 0;
stDataFormat.ucbparityPolarity = SPI_evo_parity;
stDataFormat.ucbParityEnable = SPI_paracy_disable_UI;
stDataFormat.ucbWaitEna = SPI_WAITENA_DISABLE_UI;
stDataFormat.ucbShiftDir = SPI_MSB_UI;
stDataFormat.ucbDisableTimer = DISCSTIMERS_DISABLE_UI;
stDataFormat.ucbPolarity = SPI_CLK_POL_LOW_UI;
stDataFormat.ucbPhase = SPI_CLK_INPHASE_UI;
stDataFormat.uiSPIModuleCLK = SPI_MOD_CLK_UI;
stDataFormat.uiSPIClkFreq = SPI_CLK_FREQ_UI;
stDataFormat.uiCharLen = SPI_DATA_L8_UI;
SPIConfigDataFmtReg (uiSPIReg、SPIDAT1_FORMAT0_UI、stDataFormat);
SetSPIPinControl (uiSPIReg、SPIIPC1_UI、SIMO_SOMI_CLK_CS_IO_UI);
SPIEnable (uiSPIReg);
}
Affer 配置此函数称为循环函数
ExchangeSPIData (Int_ui uiSPIReg、
const Char_uC* pucOutBuffer、
char_uC* pucInBuffer、
INT_ui * puiBufferLength)
{
/*初始化返回值*/
eUSTATUS_e eResult = eSTATUSECU_OK;
INT_ui uiRecLength = 0;
(笑声)
INT_ui uiStatusSPI = SPIFlagStatus (uiSPIReg);
while (uiStatusSPI >0 &&*puBufferLength >0)
{
/*接收器寄存器满->清除 SPI 标志状态中的位*/
if (uiStatusSPI & SPI_SPIFLG_RXINTFLG_UI){
/*读取 SPIBuf*/
*puInBuffer=(char) SPIDataReceive(uiSPIReg);
uiRecLength ++;
}
/*Transmitter reg empty*/
IF (uiStatusSPI 和 SPI_SPIFLG_TXINTFLG_UI)
{
/*在 SPI_SPIDAT1->清除 SPI 标志状态中的位*/
SPIDat1ConfigCSNR (uiSPIReg、CS_none_UI);
SPITransmitData1 (uiSPIReg、* puOutBuffer);
*puiBufferLength --;
UARTSendMessage ("发送\n"、10);
puOutBuffer++;
}
(笑声) ->错误管理
/*更新 SPI 状态值*/
uiStatusSPI = SPIFlagStatus (uiSPIReg);
}
/*断言 CS 引脚(线路)-完成与 CS 的通信*/
SPIDat1ConfigCSNR (uiSPIReg、CS_HOLT1_UI);
//缓冲区长度现在是接收到的数据长度
* puiBufferLength = uiRecLength;
}
非常感谢您的帮助!