带有 NXP CLRC663 的 SPI:只读 0xFF
SPI with NXP CLRC663 : read only 0xFF
我目前正在研究 NXP LPC55S06 处理器(来自 LPC55S06-EVK 演示板)和 NXP CLRC663 之间的 SPI 通信。
我集成了 NXP NFC 库来初始化 CLRC663 并在 .mex 文件中配置了 SPI 引出线。
我已经完成接线并且可以验证 SPI 命令的发送:
我的问题是 CLRC663 从不响应我发送的命令。
我已经检查了好几次接线,我认为问题出在软件上。
由于问题既不是来自 NFC 库,也不是来自特定于 LPC55S06 处理器的 FSL 驱动程序,我怀疑它可能来自此代码(由 NFC 库调用)完成的 SPI 配置:
#include "phDriver.h"
#include <board.h>
#include "BoardSelection.h"
#include "fsl_spi.h"
#define PHBAL_REG_LPCOPEN_SPI_ID 0x0DU /**< ID for LPC Open SPI BAL component */
/**
* \brief Initialize the LPC Open SPI BAL layer.
*
* \return Status code
* \retval #PH_DRIVER_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Parameter structure size is invalid.
*/
phStatus_t phbalReg_Init(
void * pDataParams,
uint16_t wSizeOfDataParams
)
{
spi_master_config_t masterConfig = {0};
if((pDataParams == NULL) || (sizeof(phbalReg_Type_t) != wSizeOfDataParams))
{
return (PH_DRIVER_ERROR | PH_COMP_DRIVER);
}
((phbalReg_Type_t *)pDataParams)->wId = PH_COMP_DRIVER | PHBAL_REG_LPCOPEN_SPI_ID;
((phbalReg_Type_t *)pDataParams)->bBalType = PHBAL_REG_TYPE_SPI;
/* reset FLEXCOMM for SPI */
RESET_PeripheralReset(LPC_SPI_NFC_RST);
SPI_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps=7000000u; //7MHz
SPI_MasterInit(LPC_SPI_NFC, &masterConfig, LPC_SPI_NFC_CLOCKRATE);
NVIC_SetPriority(LPC_SPI_NFC_IRQ, 7U);
return PH_DRIVER_SUCCESS;
}
phStatus_t phbalReg_Exchange(
void * pDataParams,
uint16_t wOption,
uint8_t * pTxBuffer,
uint16_t wTxLength,
uint16_t wRxBufSize,
uint8_t * pRxBuffer,
uint16_t * pRxLength
)
{
spi_transfer_t g_masterXfer;
uint8_t * pRxBuf;
status_t spiStatus;
uint8_t g_dummyBuffer[260];
memset(&g_masterXfer, 0, sizeof(spi_transfer_t));
if(pRxBuffer == NULL)
{
pRxBuf = g_dummyBuffer;
}
else
{
pRxBuf = pRxBuffer;
}
/* Set up the transfer */
g_masterXfer.txData = pTxBuffer;
g_masterXfer.rxData = pRxBuf;
g_masterXfer.dataSize = wTxLength;
/* Start transfer */
spiStatus = SPI_MasterTransferBlocking(LPC_SPI_NFC,&g_masterXfer);
if (spiStatus != kStatus_Success)
{
return (PH_DRIVER_FAILURE | PH_COMP_DRIVER);
}
if (pRxLength != NULL)
{
*pRxLength = wTxLength;
}
return PH_DRIVER_SUCCESS;
}
phStatus_t phbalReg_SetConfig(
void * pDataParams,
uint16_t wConfig,
uint16_t wValue
)
{
return PH_DRIVER_SUCCESS;
}
phStatus_t phbalReg_GetConfig(
void * pDataParams,
uint16_t wConfig,
uint16_t * pValue
)
{
return PH_DRIVER_SUCCESS;
}
知道与 CLRC663 的 SPI 通信是全双工的,你知道错误可能来自哪里吗?
我发现了我的问题所在。以下是我的重置是如何实现的:
高 - 等待 20 毫秒 - 低 - 等待 20 毫秒 - 高
在 this document 中提到:“通过引脚 PDOWN 上的高电平启用硬掉电。...要离开掉电模式引脚上的电平PDOWN 设置为 LOW。"
然而,我不得不做相反的事情,因为我将复位引脚保持在高电平,CLRC663 无法启动,所以它没有响应。
我目前正在研究 NXP LPC55S06 处理器(来自 LPC55S06-EVK 演示板)和 NXP CLRC663 之间的 SPI 通信。
我集成了 NXP NFC 库来初始化 CLRC663 并在 .mex 文件中配置了 SPI 引出线。 我已经完成接线并且可以验证 SPI 命令的发送:
我的问题是 CLRC663 从不响应我发送的命令。
我已经检查了好几次接线,我认为问题出在软件上。 由于问题既不是来自 NFC 库,也不是来自特定于 LPC55S06 处理器的 FSL 驱动程序,我怀疑它可能来自此代码(由 NFC 库调用)完成的 SPI 配置:
#include "phDriver.h"
#include <board.h>
#include "BoardSelection.h"
#include "fsl_spi.h"
#define PHBAL_REG_LPCOPEN_SPI_ID 0x0DU /**< ID for LPC Open SPI BAL component */
/**
* \brief Initialize the LPC Open SPI BAL layer.
*
* \return Status code
* \retval #PH_DRIVER_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Parameter structure size is invalid.
*/
phStatus_t phbalReg_Init(
void * pDataParams,
uint16_t wSizeOfDataParams
)
{
spi_master_config_t masterConfig = {0};
if((pDataParams == NULL) || (sizeof(phbalReg_Type_t) != wSizeOfDataParams))
{
return (PH_DRIVER_ERROR | PH_COMP_DRIVER);
}
((phbalReg_Type_t *)pDataParams)->wId = PH_COMP_DRIVER | PHBAL_REG_LPCOPEN_SPI_ID;
((phbalReg_Type_t *)pDataParams)->bBalType = PHBAL_REG_TYPE_SPI;
/* reset FLEXCOMM for SPI */
RESET_PeripheralReset(LPC_SPI_NFC_RST);
SPI_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps=7000000u; //7MHz
SPI_MasterInit(LPC_SPI_NFC, &masterConfig, LPC_SPI_NFC_CLOCKRATE);
NVIC_SetPriority(LPC_SPI_NFC_IRQ, 7U);
return PH_DRIVER_SUCCESS;
}
phStatus_t phbalReg_Exchange(
void * pDataParams,
uint16_t wOption,
uint8_t * pTxBuffer,
uint16_t wTxLength,
uint16_t wRxBufSize,
uint8_t * pRxBuffer,
uint16_t * pRxLength
)
{
spi_transfer_t g_masterXfer;
uint8_t * pRxBuf;
status_t spiStatus;
uint8_t g_dummyBuffer[260];
memset(&g_masterXfer, 0, sizeof(spi_transfer_t));
if(pRxBuffer == NULL)
{
pRxBuf = g_dummyBuffer;
}
else
{
pRxBuf = pRxBuffer;
}
/* Set up the transfer */
g_masterXfer.txData = pTxBuffer;
g_masterXfer.rxData = pRxBuf;
g_masterXfer.dataSize = wTxLength;
/* Start transfer */
spiStatus = SPI_MasterTransferBlocking(LPC_SPI_NFC,&g_masterXfer);
if (spiStatus != kStatus_Success)
{
return (PH_DRIVER_FAILURE | PH_COMP_DRIVER);
}
if (pRxLength != NULL)
{
*pRxLength = wTxLength;
}
return PH_DRIVER_SUCCESS;
}
phStatus_t phbalReg_SetConfig(
void * pDataParams,
uint16_t wConfig,
uint16_t wValue
)
{
return PH_DRIVER_SUCCESS;
}
phStatus_t phbalReg_GetConfig(
void * pDataParams,
uint16_t wConfig,
uint16_t * pValue
)
{
return PH_DRIVER_SUCCESS;
}
知道与 CLRC663 的 SPI 通信是全双工的,你知道错误可能来自哪里吗?
我发现了我的问题所在。以下是我的重置是如何实现的:
高 - 等待 20 毫秒 - 低 - 等待 20 毫秒 - 高
在 this document 中提到:“通过引脚 PDOWN 上的高电平启用硬掉电。...要离开掉电模式引脚上的电平PDOWN 设置为 LOW。"
然而,我不得不做相反的事情,因为我将复位引脚保持在高电平,CLRC663 无法启动,所以它没有响应。