PN7462 I2CM Configuration and EEPROM Communication Example Request

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

PN7462 I2CM Configuration and EEPROM Communication Example Request

177 Views
uday_gowda
Contributor II

Hi Team,

I am trying to use the PN7462 I2C Master (I2CM) interface to communicate with an external EEPROM (24AA025UID / AT25M02).

My I2CM initialization is as follows:

phStatus_t I2C_Init(void)
{
    phStatus_t status;
    uint8_t bBaudRate;

    bBaudRate = (uint8_t)
        ((PH_EXHIF_HW_CRYSTAL_CLK / 100000UL) -
         PH_EXHIF_HW_CRYSTAL_CLK_MHZ);

    status = phhalI2CM_Init(
                PH_EXHIF_HW_I2CM_TX_FIFO_THRES,
                PH_EXHIF_HW_I2CM_RX_FIFO_THRES,
                PH_EXHIF_HW_I2CM_TIMEOUT,
                PH_EXHIF_HW_I2CM_RETRY_CNT);

    if(status != PH_ERR_SUCCESS)
    {
        return status;
    }

    status = phhalI2CM_Config(
                243,
                0x09,
                E_I2CM_7BIT_ADDR_MODE);

    phHal_Nvic_EnableInterrupt(PH_HAL_NVIC_I2C_MASK);

    return status;
}

I am using phhalI2CM_SlaveCheck(), phhalI2CM_Transmit(), and phhalI2CM_Receive() to access the EEPROM.

Could you please provide:

  1. I have initialized I2CM using phhalI2CM_Init() and phhalI2CM_Config(), and enabled the I2C interrupt. However, when I call phhalI2CM_SlaveCheck(), I get a HardFault.

    Could you please share:

    • Any I2CM EEPROM read/write example project for PN7462.
    • The recommended I2CM initialization sequence.
    • Any required PCR/PAD configuration.
    • Any OSAL/Event initialization required before using phhalI2CM_SlaveCheck(), phhalI2CM_Transmit(), and phhalI2CM_Receive().

Currently, transmit and slavecheck results in a HardFault, so I would like to verify that the I2CM initialization and usage sequence is correct.

Thanks,
Uday

0 Kudos
Reply
2 Replies

151 Views
EduardoZamora
NXP TechSupport
NXP TechSupport

Hello @uday_gowda

Unfortunately, there is no specific demo for I2C EEPROM read/write. I will recommend you referring to PN7462AU_ex_phExHif demo (from latest NFC Reader Library for PN7462) for I2CM initialization and operation.

For I2CM Tx tests, please comment the lines used for GPIO evaluation or sync:

- src/phExHif.c -> around lines 76, 84, 94, 108 (this line is used for reception)

- src/phExHif_Hw.c -> around lines 120, 126, 142 (hardcode bHifInterface), 210 (hardcode bCommChannel to 1)

Also, please consider changing Optimization level to None (-O0).

Regards,
Eduardo.

0 Kudos
Reply

90 Views
uday_gowda
Contributor II

Hello @EduardoZamora,

Thank you for your response.

I am using the following I2CM initialization and EEPROM read implementation, which works correctly in the PN7462AU_ex_phExHif demo project:

phStatus_t I2C_Init(void)
{
    phStatus_t status;
    uint8_t bBaudRate;

    bBaudRate = (uint8_t)
        ((PH_EXHIF_HW_CRYSTAL_CLK / 100000UL) -
         PH_EXHIF_HW_CRYSTAL_CLK_MHZ);

    status = phhalI2CM_Init(
                PH_EXHIF_HW_I2CM_TX_FIFO_THRES,
                PH_EXHIF_HW_I2CM_RX_FIFO_THRES,
                PH_EXHIF_HW_I2CM_TIMEOUT,
                PH_EXHIF_HW_I2CM_RETRY_CNT);

    if(status != PH_ERR_SUCCESS)
    {
        return status;
    }

    status = phhalI2CM_Config(
                0x40,
                0x09,
                E_I2CM_7BIT_ADDR_MODE);

    return status;
}

#define EEPROM_ADDR      (0x50U)

#define EEPROM_MFG_ADDR  (0xFAU)
#define EEPROM_DEV_ADDR  (0xFBU)
#define EEPROM_UID_ADDR  (0xFCU)

phStatus_t EEPROM_ReadUID(uint8_t uid[4])
{
    return EEPROM_Read(
                EEPROM_UID_ADDR,
                uid,
                4);
}

static phStatus_t EEPROM_Read(uint8_t memAddr,
                              uint8_t *pData,
                              uint16_t length)
{
    phStatus_t status;

    uint32_t txBuf[4];
    uint32_t rxBuf[64] = {0};

    txBuf[0] = memAddr;

    status = phhalI2CM_Transmit(
                EEPROM_ADDR,
                1,
                txBuf);

    if(status != PH_ERR_SUCCESS)
    {
        return status;
    }

    status = phhalI2CM_Receive(
                EEPROM_ADDR,
                length,
                rxBuf);

    if(status != PH_ERR_SUCCESS)
    {
        return status;
    }

    memcpy(pData, (uint8_t *)rxBuf, length);

    return PH_ERR_SUCCESS;
}

This exact code works in the PN7462AU_ex_phExHif demo. However, when integrated into my application and also phExMain example, it causes a HardFault.

Apart from commenting the GPIO evaluation/sync lines and changing the optimization level to -O0, is there any additional configuration required in phExMain and on my application for I2CM operation?

Regards,
Uday Gowda

0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-2375843%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EPN7462%20I2CM%20Configuration%20and%20EEPROM%20Communication%20Example%20Request%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2375843%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHi%20Team%2C%3C%2FP%3E%3CP%3EI%20am%20trying%20to%20use%20the%20PN7462%20I2C%20Master%20(I2CM)%20interface%20to%20communicate%20with%20an%20external%20EEPROM%20(24AA025UID%20%2F%20AT25M02).%3C%2FP%3E%3CP%3EMy%20I2CM%20initialization%20is%20as%20follows%3A%3C%2FP%3E%3CPRE%3EphStatus_t%20I2C_Init(void)%0A%7B%0A%20%20%20%20phStatus_t%20status%3B%0A%20%20%20%20uint8_t%20bBaudRate%3B%0A%0A%20%20%20%20bBaudRate%20%3D%20(uint8_t)%0A%20%20%20%20%20%20%20%20((PH_EXHIF_HW_CRYSTAL_CLK%20%2F%20100000UL)%20-%0A%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_CRYSTAL_CLK_MHZ)%3B%0A%0A%20%20%20%20status%20%3D%20phhalI2CM_Init(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_TX_FIFO_THRES%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_RX_FIFO_THRES%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_TIMEOUT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_RETRY_CNT)%3B%0A%0A%20%20%20%20if(status%20!%3D%20PH_ERR_SUCCESS)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20status%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20status%20%3D%20phhalI2CM_Config(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20243%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200x09%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20E_I2CM_7BIT_ADDR_MODE)%3B%0A%0A%20%20%20%20phHal_Nvic_EnableInterrupt(PH_HAL_NVIC_I2C_MASK)%3B%0A%0A%20%20%20%20return%20status%3B%0A%7D%3C%2FPRE%3E%3CP%3EI%20am%20using%20phhalI2CM_SlaveCheck()%2C%20phhalI2CM_Transmit()%2C%20and%20phhalI2CM_Receive()%20to%20access%20the%20EEPROM.%3C%2FP%3E%3CP%3ECould%20you%20please%20provide%3A%3C%2FP%3E%3COL%3E%3CLI%3E%3CP%3EI%20have%20initialized%20I2CM%20using%20phhalI2CM_Init()%20and%20phhalI2CM_Config()%2C%20and%20enabled%20the%20I2C%20interrupt.%20However%2C%20when%20I%20call%20phhalI2CM_SlaveCheck()%2C%20I%20get%20a%20HardFault.%3C%2FP%3E%3CP%3ECould%20you%20please%20share%3A%3C%2FP%3E%3CUL%3E%3CLI%3EAny%20I2CM%20EEPROM%20read%2Fwrite%20example%20project%20for%20PN7462.%3C%2FLI%3E%3CLI%3EThe%20recommended%20I2CM%20initialization%20sequence.%3C%2FLI%3E%3CLI%3EAny%20required%20PCR%2FPAD%20configuration.%3C%2FLI%3E%3CLI%3EAny%20OSAL%2FEvent%20initialization%20required%20before%20using%20phhalI2CM_SlaveCheck()%2C%20phhalI2CM_Transmit()%2C%20and%20phhalI2CM_Receive().%3C%2FLI%3E%3C%2FUL%3E%3C%2FLI%3E%3C%2FOL%3E%3CP%3ECurrently%2C%20transmit%20and%20slavecheck%20results%20in%20a%20HardFault%2C%20so%20I%20would%20like%20to%20verify%20that%20the%20I2CM%20initialization%20and%20usage%20sequence%20is%20correct.%3C%2FP%3E%3CP%3EThanks%2C%3CBR%20%2F%3EUday%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2376132%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20PN7462%20I2CM%20Configuration%20and%20EEPROM%20Communication%20Example%20Request%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2376132%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHello%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F261175%22%20target%3D%22_blank%22%3E%40uday_gowda%3C%2FA%3E%3C%2FP%3E%0A%3CP%3EUnfortunately%2C%20there%20is%20no%20specific%20demo%20for%20I2C%20EEPROM%20read%2Fwrite.%20I%20will%20recommend%20you%20referring%20to%20PN7462AU_ex_phExHif%20demo%20(from%20latest%20%3CA%20href%3D%22https%3A%2F%2Fwww.nxp.com%2Fapplications%2Ftechnologies%2Fsecurity%2Findustrial-security%2Fnfc-reader-library-software-support-for-nfc-frontend-solutions%3ANFC-READER-LIBRARY%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3ENFC%20Reader%20Library%3C%2FA%3E%20for%20PN7462)%20for%20I2CM%20initialization%20and%20operation.%3C%2FP%3E%0A%3CP%3EFor%20I2CM%20Tx%20tests%2C%20please%20comment%20the%20lines%20used%20for%20GPIO%20evaluation%20or%20sync%3A%3C%2FP%3E%0A%3CP%3E-%20src%2FphExHif.c%20-%26gt%3B%20around%20lines%2076%2C%2084%2C%2094%2C%20108%20(this%20line%20is%20used%20for%20reception)%3C%2FP%3E%0A%3CP%3E-%20src%2FphExHif_Hw.c%20-%26gt%3B%20around%20lines%20120%2C%20126%2C%20142%20(hardcode%20bHifInterface)%2C%20210%20(hardcode%20bCommChannel%20to%201)%3CBR%20%2F%3E%3CBR%20%2F%3EAlso%2C%20please%20consider%20changing%20Optimization%20level%20to%20None%20(-O0).%3C%2FP%3E%0A%3CP%3ERegards%2C%3CBR%20%2F%3EEduardo.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2377419%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20PN7462%20I2CM%20Configuration%20and%20EEPROM%20Communication%20Example%20Request%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2377419%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHello%20%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F200888%22%20target%3D%22_blank%22%3E%40EduardoZamora%3C%2FA%3E%2C%3C%2FP%3E%3CP%3EThank%20you%20for%20your%20response.%3C%2FP%3E%3CP%3EI%20am%20using%20the%20following%20I2CM%20initialization%20and%20EEPROM%20read%20implementation%2C%20which%20works%20correctly%20in%20the%20PN7462AU_ex_phExHif%20demo%20project%3A%3C%2FP%3E%3CPRE%3EphStatus_t%20I2C_Init(void)%0A%7B%0A%20%20%20%20phStatus_t%20status%3B%0A%20%20%20%20uint8_t%20bBaudRate%3B%0A%0A%20%20%20%20bBaudRate%20%3D%20(uint8_t)%0A%20%20%20%20%20%20%20%20((PH_EXHIF_HW_CRYSTAL_CLK%20%2F%20100000UL)%20-%0A%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_CRYSTAL_CLK_MHZ)%3B%0A%0A%20%20%20%20status%20%3D%20phhalI2CM_Init(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_TX_FIFO_THRES%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_RX_FIFO_THRES%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_TIMEOUT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PH_EXHIF_HW_I2CM_RETRY_CNT)%3B%0A%0A%20%20%20%20if(status%20!%3D%20PH_ERR_SUCCESS)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20status%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20status%20%3D%20phhalI2CM_Config(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200x40%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200x09%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20E_I2CM_7BIT_ADDR_MODE)%3B%0A%0A%20%20%20%20return%20status%3B%0A%7D%0A%0A%23define%20EEPROM_ADDR%20%20%20%20%20%20(0x50U)%0A%0A%23define%20EEPROM_MFG_ADDR%20%20(0xFAU)%0A%23define%20EEPROM_DEV_ADDR%20%20(0xFBU)%0A%23define%20EEPROM_UID_ADDR%20%20(0xFCU)%0A%0AphStatus_t%20EEPROM_ReadUID(uint8_t%20uid%5B4%5D)%0A%7B%0A%20%20%20%20return%20EEPROM_Read(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EEPROM_UID_ADDR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uid%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%204)%3B%0A%7D%0A%0Astatic%20phStatus_t%20EEPROM_Read(uint8_t%20memAddr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint8_t%20*pData%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint16_t%20length)%0A%7B%0A%20%20%20%20phStatus_t%20status%3B%0A%0A%20%20%20%20uint32_t%20txBuf%5B4%5D%3B%0A%20%20%20%20uint32_t%20rxBuf%5B64%5D%20%3D%20%7B0%7D%3B%0A%0A%20%20%20%20txBuf%5B0%5D%20%3D%20memAddr%3B%0A%0A%20%20%20%20status%20%3D%20phhalI2CM_Transmit(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EEPROM_ADDR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20txBuf)%3B%0A%0A%20%20%20%20if(status%20!%3D%20PH_ERR_SUCCESS)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20status%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20status%20%3D%20phhalI2CM_Receive(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EEPROM_ADDR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20length%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rxBuf)%3B%0A%0A%20%20%20%20if(status%20!%3D%20PH_ERR_SUCCESS)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20status%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20memcpy(pData%2C%20(uint8_t%20*)rxBuf%2C%20length)%3B%0A%0A%20%20%20%20return%20PH_ERR_SUCCESS%3B%0A%7D%3C%2FPRE%3E%3CP%3EThis%20exact%20code%20works%20in%20the%20PN7462AU_ex_phExHif%20demo.%20However%2C%20when%20integrated%20into%20my%20application%20and%20also%20phExMain%20example%2C%20it%20causes%20a%20HardFault.%3C%2FP%3E%3CP%3EApart%20from%20commenting%20the%20GPIO%20evaluation%2Fsync%20lines%20and%20changing%20the%20optimization%20level%20to%20-O0%2C%20is%20there%20any%20additional%20configuration%20required%20in%20phExMain%20and%20on%20my%20application%20for%20I2CM%20operation%3F%3C%2FP%3E%3CP%3ERegards%2C%3CBR%20%2F%3EUday%20Gowda%3C%2FP%3E%3C%2FLINGO-BODY%3E