FAQ: Use different TCXO or XTAL with AXM0F343

Introduction

The AXM0F343 supports multiple RF reference clocks: a standard XTAL (Crystal Oscillator) or TCXO (Temperature Controlled Crystal Oscillator).
As shown below (page 25 of datasheet) the AXM0F343 supports clocks between 10 and 50 MHz, and, when a XTAL is used, a dedicated programmable XTAL driver allows to adjust the tuning capacitor (XTALCAP, #0x184) and transconductance (XTALOSC, #0xF10) to match the selected XTAL.

Default HW/SW Settings

All the AXM0F343 Development Kits (868 and 915 MHz) mount a 48 MHz TCXO from NDK
NT2016SA-48M-END4910A.
For this reason the examples within the AXM0F343 CMSIS pack and the default settings of the AX-Configuration Utility assume that a 48 MHz TCXO is being used.

In case a different frequency and/or a different TCXO/XTAL is to be used, some HW and SW modifications must be done.

HW Modifications

As shown below, the following components should be switched when moving from a 2.0×1.6 mm2 TCXO (e.g. NT2016SA-48M-END4910A) to a same size XTAL (e.g. NX2016SA-48M-EXS00A):

  1. Remove (DNP): R2, C51, FB1, R1.
  2. Solder a 0 Ω jumper resistor: C50, R12, C102.

AX-Configuration Utility Settings

To move from TCXO to XTAL, and change the reference frequency, follow these steps:

  • Create a new project in the AX Configuration Utility, selecting the correct MCU (-64 or -256) and PCB frequency (868 or 915 MHz).
  • in “Pin Configuration” panel, change the field “Ref Osc Config” from TCXO to XTAL.
  • In “PHY Configuration” panel adjust:
    • the XTAL frequency (if different from 48 MHz),
    • the XTALCAP to match the load capacitance required by your XTAL,
    • the AFC to match the expected ppm. A guide on how to adjust the AFC can be found from page 22 in the AX Configuration Utility User Manual accessible in the GUI via Help/Documentation or at C:\Program Files (x86)\ON Semiconductor\AX-ConfigurationUtility\DOCU.


The AX Configuration Utility will automatically re-calculate the registers to match the newly selected settings.
In particular, when moving from TCXO → XTAL, the GUI will vary the following registers:

  • AX5043_REG_XTALOSC from 0x04 to 0x0D. Increases the transconductance of the XTAL driver.
  • AX5043_REG_XTALAMPL from 0x00 to 0x07. Sets a minimum oscillation amplitude for the XTAL (not needed for TCXO).
  • AX5043_REG_XTALCAP from 0x00 to 0x0C. Enables the loading capacitors (not needed for TCXO).

When changing the reference frequency and the AFC, many registers will change as several parameters are directly derived from the Fxtal. A quick comparison between two different automatically calculated config.c will show the differences.

Once done with the GUI, the project is ready to be imported in the onsemi IDE.

Extra step not needed if using an AXM0F343 CMSIS Pack Version 1.5.0 or above

The following changes to app.c code should be done once the project is imported inside the onsemi-IDE:

  • line 44, add in the header section: #include "easyax5043.h" ;
  • line 185, modify to cmu.hsosc_cal_ref_clk_tcxo_feq = axradio_fxtal;

CMSIS Examples Settings

As mentioned before, the CMSIS examples assume that a 48 MHz TCXO is being used. If a different frequency from 48MHz is used and/or a XTAL is mounted instead of TCXO, some changes will be required by the CMSIS examples.

  1. Generate a new project in AX Configuration Utility with the desired settings.
  2. Copy the content of the newly generated config.c in the CMSIS example instead of the existing PHY settings (e.g. inside /AXRadio-TX-AXM0F343-64/RTE/Application/phy_1_config.c ).
Extra step not needed if using an AX-Configuration Utility Version 1.5 or above

In app.c:

  • line 44, add in the header section: #include "easyax5043.h" ;
  • line 185, modify to cmu.hsosc_cal_ref_clk_tcxo_feq = axradio_fxtal;
2 Likes

thank you very much for your help

Yaniv

My attempts at using a different TCXO have been resulting in a start up error. I know I emailed you guys about this issue previously, and it seemed to be fixed with the new update, however after further testing the issue still persists.

To summarize (using a 16.368 TCXO):
If the reset is held longer than 5 seconds the device gets stuck in the axradio_init() function in app.c. More specifically it gets stuck in the GPIO_Exception_Handler() that is called during the axradio_init() function.

This issue only seems to happen during the TX code generated by the CMSIS. Once this issue appears the only way to fix it, seems to be uploading the RX version before re-flashing the TX code. Obviously this is not a permanent solution, any help would be great.

Hi Alex,
I am unable to replicate your error on my AXM0F343-GEVB board.
Can you please describe step by step what modifications you are doing to help me identify the problem?
How you are observing the issue? Note that when you hard reset the board (via the board pushbutton) the JlinkGDBServer connection gets broken, so you cannot reliably see with the debugger in which part of the code you are stuck. Or have you implemented some “printf-debugging” or GPIO-toggling logic?
It would also help if you could share exactly your project.

What I did was:

  1. Created a new project in AX-ConfigurationUtility for my AXM0F343-64-915 EVB.
  2. In “PHY Panel” adjusted frequency of Fxtal to 16.000 (I don`t have a 16.368 MHz TCXO, but a 16 MHz)
  3. Imported the project in Eclipse and fixed the two lines of code in app.c as indicated in this forum FAQ.

The board transmits regularly every 1 second. If I press the RESET button on the board the TX stops. After releasing the RESET, the board goes through the init and restarts sending packets. Below the output on the serial port:

2 Likes

Okay I think I found my issue, Its when I modified the TX program. I have been unable to figure out exactly how to add or modify the wtimer_runcallbacks() function effectively. My quick solution was to remove it and hard code in what I needed to test.

  • Is there something that is in the wtimer_runcallbacks() function that is used to power off, like a zero detection or power down routine?

  • Do you have any examples of how to properly modify the callback queue, its timers, make new callback functions?