Good day,
I'm a engineer using PN7462AU. I am developing an NFC communication program.
My question is very similar to this question. But there's no answer on that page.
※ URL : PN7462 GPIO Interrupts
I want to use GPIO as an interrupt source. When I receive the GPIO signal, I want to call the callback function.
There are API about GPIO. But I can't find API about setting GPIO callback function.
Question 1) Is there an API to set GPIO callback function?
- For example, using GPIO1, how to setting dwPcrIRQMessage?
- Should I use phhalPcr_RegCallBack ()?
Question 2) How to use GPIO as an interrupt source?
Below is the setup details,
1. Hardware: PN7462AU
2. SDK: PN7462AU-FW_v05.21.00
3. IDE: MCUXpresso IDE v11.0.0
If anyone knows the answer to your question, please reply.
If you have any question, please feel free to contact me.
Thanks.
Solved! Go to Solution.
Hi Haje,
Actually it is more likely an implementation issue , you may check some flag in the ISR to determine whether the callback should be invoked, and the flag is initialized from start up and modified by the application code in some cases.
BTW, why keeping GPIO high all the time? You may disable the pull up in the ISR or callback.
Hope that makes sense,
Have a great day,
Kan
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Hi Kan,
The reason I always give the GPIO High is just for testing.
When the test is over, the callback function will be called only at the rising edge, and thanks to Kan, it was successfully completed.
In the previous question, even if the GPIO signal is low, the callback function is still called. As the cause is known, the GPIO clear API did not work properly.
I used another GPIO clear API and it worked fine.
So my GPIO interrupt related questions have been solved.
I sincerely thank you for helping me.
Have a great day.
Haje.
My pleasure:-)
Have a great day,
Kan
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Dear Kan
Hi Kan, I read your answer carefully, but I have a few more questions, so I leave additional questions.
It's about question 1.
I want to use GPIO01 as an interrupt source.
① I set the GPIO01 like below.
- phhalPcr_ConfigUnput(1, true, false, true, false, true, false);
- API input parameter 4th, it means EnableInterrupt. So I set true.
- phhalPcr_ConfigPuPd(1, true, false);
- Pull up setting.
② I set callback function like below.
- phhalPcr_RegCallBack(&CallbackFunction, PcrIrqMessage);
- void CallbackFunction(void) {
printf("CHECK\n"); // Callback function just prints message.
}
- PcrIrqMessage = {PCR_INT_STATUS_REG_GPIO1_PAD_HIGH_INT_STATUS_MASK
| PCR_INT_STATUS_REG_GPIO_INT_STATUS_MASK);
I set the GPIO01 as interrupt source as above. But even if I give GPIO01 signal high in my program, It cannot recognize GPIO01 interrupt.
What's wrong with the above source code? (I think the PcrIrqMessage setting is wrong, but I'm not sure.)
If you have any question, please feel free to contact me.
Thanks.
Hi Haje,
Did you test it based on PN7462EVB? and maybe there is a typo here, it should be "phhalPcr_ConfigInput" , not "phhalPcr_ConfigUnput". and where did you put these codes? There is default setup for GPIOs from start up in the library, so please put your initial code in main().
Have a great day,
Kan
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Dear Kan
Thank you for answering the question. There was a typo in the process of posting a question, but in my code, I used it correctly as "phhalPcr_ConfigInput". The GPIO setting part is located in the main().
- PcrIrqMessage = {PCR_INT_STATUS_REG_GPIO1_PAD_HIGH_INT_STATUS_MASK
| PCR_INT_STATUS_REG_GPIO_INT_STATUS_MASK);
Is it correct to set up PCR to use GPIO1?
If you have any question, please feel free to contact me.
Thanks.
Hi Haje,
Your code is ok, and if you just want to GPIO1 as interrupt source, no need to use phhalPcr_RegCallBack(), which is used for register callback for GPIO common ISR, you may just define the GPIO1 ISR as below :
and put the initial code as below:
if you set a breakpoint in the ISR, you may find it hits as expected.
Hope that makes sense,
Have a great day,
Kan
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Dear Kan
Thanks to you, I could recognize GPIO01 high signal using the method just define the GPIO1 ISR.
However, I still have one more question.
In my program, the callback function is always called when GPIO01 is high.
Even if GPIO01 changes to low, the callback function is executed continuously.
I want to call the callback function only once when GPIO goes high.
If I put phhal_Nvic_DisableInterrupt (1U << (PHHAL_NVIC_GPIO_01_Isr)) into GPIO_01_IRQHandler(), it is called only once, but IRQHandler is not called when GPIO goes high again after that.
So I put phhal_Nvic_EnableInterrupt (1U << (PHHAL_NVIC_GPIO_01_Isr)) into GPIO_01_IRQHandler(), then IRQHandler is continuously executed when GPIO is high.
Question) Is there a way to call the callback function only once when GPIO goes high?
If you have any question, please feel free to contact me.
Thanks.
Hi Haje,
I had the similar issue where the interrupt was firing continuously even when configured for edge triggered. The following in the ISR fixed the issue for me (I believe that the earlier instructions were not actually clearing the correct Interrupt flag):
#define TEK_I2C_DATA_PIN 1
#define PHHAL_GPIO_PCR_INT_GPIO_POS 15
void GPIO_01_IRQHandler(void)
{
PH_REG_SET_BITN_WO(PCR_INT_CLR_STATUS_REG, PHHAL_GPIO_PCR_INT_GPIO_POS + TEK_I2C_DATA_PIN);
phHal_Nvic_ClearPendingInterrupt( 1U << (PHHAL_NVIC_GPIO_Common_Isr + TEK_I2C_DATA_PIN));
...
}
I copied the interrupt clearing instructions from the function "phhalPcr_ConfigInput()":
and this was my configuration for the pin:
I would say that NXP documentation is None or too Complicated for a functionality which is far too simple and basic.
Dear Shoaib Ali
Thank you very much for answering my question. Since I did the above, it did not work properly, and I found that the cause is that GPIO Clear is not working properly. That is, the GPIO Clear API provided by NXP did not work properly, and it was solved by implementing it by directly changing the register value.
In the method I implemented, GPIO Clear was performed directly with PH_REG_SET_BIT_WO (PH_INT_CLR_STATUS_REG, GPIOX_PAD_HIGH_INT_CLR_STATUS).
Thank you for answering again. Have a good day.
Hi Haje,
Actually it is more likely an implementation issue , you may check some flag in the ISR to determine whether the callback should be invoked, and the flag is initialized from start up and modified by the application code in some cases.
BTW, why keeping GPIO high all the time? You may disable the pull up in the ISR or callback.
Hope that makes sense,
Have a great day,
Kan
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Hi Haje,
The GPIO interrupt sources from PCR, so you should use PCR APIs.
Question 1) Is there an API to set GPIO callback function?
- For example, using GPIO1, how to setting dwPcrIRQMessage?
- Should I use phhalPcr_RegCallBack ()?
Question 2) How to use GPIO as an interrupt source?
Hope that makes sense,
Have a great day,
Kan
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------