Hello Nxp,
I am writing to you regarding a problem I have with the RTC chip PCA21125 communication with Aurix Microcontroller Tc389. I am unable to write the RTC registers, which prevents me from clearing the POR bit of Control 1 register and the RF bit of Second register. As a result, the SECONDS bitfield of Second register is not incrementing.
I am sharing my code.I would appreciate it if you could review it and give me your feedback. Is there anything I am missing or doing wrong? I have posted this question on the community forum before, but I did not receive any reply.
Control_1 register Init Code :
FUNC(CDD_RTC_PCA_StatusType, CDD_RTC_PCA) CDD_RTC_PCA_RegCtrl1Init(void)
{
VAR(uint16, AUTOMATIC) DataIndex = 0U;
VAR(Std_ReturnType, TYPEDEF) RetVal = E_OK;
VAR(CDD_RTC_PCA_StatusType, TYPEDEF) eRTC_Status = CDD_RTC_OK;
PCAReg.RegCntrl_1.uint8_reg = RTC_REGCTRL1_INTI_VAL;
Cdd_RTC_SPITxBuff[DataIndex++] = WRITE_CMD | RTC_REG_CONTROL_1;
Cdd_RTC_SPITxBuff[DataIndex++] = PCAReg.RegCntrl_1.uint8_reg;
RetVal |= Spi_SetupEB(CDD_RTC_PCA_SPI_CHNL, &Cdd_RTC_SPITxBuff[0U], &Cdd_RTC_SPIRxBuff[0U], DataIndex);
/* Send data filled in SPI buffer over SPI */
RetVal |= CDD_RTC_SpiSend();
/* Check if SPI transfer successful */
if(E_OK != RetVal)
{
eRTC_Status = CDD_RTC_SPI_FAILURE;
}
else
{
// do nothing
}
return eRTC_Status;
}
Control_2 Register Init Code
FUNC(CDD_RTC_PCA_StatusType, CDD_RTC_PCA) CDD_RTC_PCA_RegCtrl2Init(void)
{
VAR(uint16, AUTOMATIC) DataIndex = 0U;
VAR(Std_ReturnType, TYPEDEF) RetVal = E_OK;
VAR(CDD_RTC_PCA_StatusType, TYPEDEF) eRTC_Status = CDD_RTC_OK;
PCAReg.RegCntrl_2.uint8_reg = RTC_REGCTRL2_INTI_VAL;
Cdd_RTC_SPITxBuff[DataIndex++] = WRITE_CMD | RTC_REG_CONTROL_2;
Cdd_RTC_SPITxBuff[DataIndex++] = PCAReg.RegCntrl_2.uint8_reg;
RetVal |= Spi_SetupEB(CDD_RTC_PCA_SPI_CHNL, &Cdd_RTC_SPITxBuff[0U], &Cdd_RTC_SPIRxBuff[0U], DataIndex);
/* Send data filled in SPI buffer over SPI */
RetVal |= CDD_RTC_SpiSend();
/* Check if SPI transfer successful */
if(E_OK != RetVal)
{
eRTC_Status = CDD_RTC_SPI_FAILURE;
}
else{
//do nothing
}
return eRTC_Status;
}
Clear RF bit Function :
FUNC(CDD_RTC_PCA_StatusType, CDD_RTC_PCA) CDD_RTC_PCA_CLearRF(void)
{
VAR(uint16, AUTOMATIC) DataIndex = 0U;
VAR(Std_ReturnType, TYPEDEF) RetVal = E_OK;
VAR(CDD_RTC_PCA_StatusType, TYPEDEF) eRTC_Status = CDD_RTC_OK;
PCAReg.RegSeconds.bit.RF = CDD_RTC_RF_CLR;
Cdd_RTC_SPITxBuff[DataIndex++] = WRITE_CMD | RTC_REG_SECONDS;
Cdd_RTC_SPITxBuff[DataIndex++] = PCAReg.RegSeconds.uint8_reg;
RetVal |= Spi_SetupEB(CDD_RTC_PCA_SPI_CHNL, &Cdd_RTC_SPITxBuff[0U], &Cdd_RTC_SPIRxBuff[0U], DataIndex);
/* Send data filled in SPI buffer over SPI */
RetVal |= CDD_RTC_SpiSend();
/* Check if SPI transfer successful */
if(E_OK != RetVal)
{
eRTC_Status = CDD_RTC_SPI_FAILURE;
}
else{
}
RTC Driver Init Code
FUNC(CDD_RTC_PCA_StatusType, CDD_RTC_PCA) CDD_RTC_PCA_DriverInit(void)
{
VAR(Std_ReturnType, TYPEDEF) RetVal = E_OK;
VAR(CDD_RTC_PCA_StatusType, TYPEDEF) eRTC_Status = CDD_RTC_OK;
/* Set SPI to Sync Mode for Driver initialization */
u8RTC_SPIMode = CDD_RTC_PCA_SYNC_MODE;
RetVal |= CDD_RTC_PCA_RegCtrl1Init();
RetVal |= CDD_RTC_PCA_RegCtrl2Init();
RetVal |= CDD_RTC_PCA_CLearRF();
if(E_OK == RetVal)
{
eRTC_Status = CDD_RTC_OK;
/* Initialize RTC state to Idle */
u8RTCState = RTC_IDLE_STATE;
u8RTC_SPIMode = CDD_RTC_SPI_MODE_CFG;
}
else
{
eRTC_Status = E_NOT_OK;
}
return eRTC_Status;
}
Read Register Code :
FUNC(CDD_RTC_PCA_StatusType, CDD_RTC_PCA) CDD_RTC_PCA_ReadReg( VAR(uint8, AUTOMATIC) u8StartIndx,
VAR(uint8, AUTOMATIC) u8TotalRegToRead,
P2VAR(uint8, AUTOMATIC, CDD_RTC_PCA) DataPtr )
{
VAR(uint8, AUTOMATIC) u8LoopIndx = 0U;
VAR(uint16, AUTOMATIC) DataIndex = 0U;
VAR(Std_ReturnType, TYPEDEF) RetVal = E_OK;
VAR(CDD_RTC_PCA_StatusType, TYPEDEF) eRTC_Status = CDD_RTC_OK;
g_TotalRegToRead = u8TotalRegToRead;
Cdd_RTC_SPITxBuff[DataIndex++] = READ_CMD | u8StartIndx;
for(u8LoopIndx = 0U; u8LoopIndx < u8TotalRegToRead; u8LoopIndx++)
{
Cdd_RTC_SPITxBuff[DataIndex++] = u8StartIndx + u8LoopIndx;
}
RetVal |= Spi_SetupEB(CDD_RTC_PCA_SPI_CHNL, &Cdd_RTC_SPITxBuff[0U], &Cdd_RTC_SPIRxBuff[0U], DataIndex);
/* Send data filled in SPI buffer over SPI */
RetVal |= CDD_RTC_SpiSend();
/* Check if SPI transfer successful */
if(E_OK != RetVal)
{
eRTC_Status = CDD_RTC_SPI_FAILURE;
}
else
{ //do nothing }
return eRTC_Status;
}
SPI Configuration :
Chip Select polarity : High
Data Shifting edge : Trailing
Channel configuration --> Data Width : 8
I have been struggling over this for long time , please give the necessity inputs.