Skip to main content
Explorer II
February 9, 2024
Question

TTCAN TUR division: rounding or truncating?

  • February 9, 2024
  • 1 reply
  • 1465 views

This is a request for clarification of the TUR (Time Unit Ratio) calculation in the TTCAN implementation of the FD-CAN peripheral that is part of STM32MP1xxx systems.

Specifically: the TUR is composed of a numerator and a denominator, designated FDCAN_TURNA.NAV and FDCAN_TURCF.DC, respectively, in the documentation.

For example, see RM0436 pages 2994-2995.

The calculation of the NTU (Network Time Unit) is NTU = clock_period * (TUR.numerator / TUR.denominator)

My question: is the division a rounding division or a truncating division? The documentation does not specify this.

As a concrete example, I am analyzing a TTCAN system using the STM32MP157 FD-CAN1 peripheral with:

- numerator = 0x1ffff (= 131071, the maximum allowed)

- denominator = 8192

With rounding division, TUR = 16, with truncating division, TUR = 15.

Truncating divisions are more common in hardware, so what is the FD-CAN1 peripheral using for its TUR calculation?

Any clarification would be appreciated.

Thanks in advance.

 

    This topic has been closed for replies.

    1 reply

    Technical Moderator
    February 12, 2024

    Hi @tarmasr 

    Not FDCAN expert, but if I look to examples provided on RM0436 Table 452,

    PatrickF_0-1707725174509.png

    the resulting value for your settings (0x1FFFF and 0x2000) will be 15.99987793

    Regards.

     

    tarmasrAuthor
    Explorer II
    February 12, 2024

    Hi @PatrickF ,

    Thanks for taking the trouble to answer my query.

    Yes, I agree with the theoretical value (15.999...) and I did see the examples, but I was wondering if any form of rounding or truncation takes place, particularly since this combination of values (0x1FFFF and 0x2000) is so close to a whole number (16) and was probably intended to give exactly that number.

    The query came about because it seems unlikely that the TUR uses floating point arithmetic internally -- it's probably all integer arithmetic.

    However, based on your answer and the examples, some of which also result in fractional values, I will assume then that little or no rounding or truncation at all takes place and that internally the TUR is used as-is.

    My suspicion still is that it operates more like muldiv(period, numerator, denominator) which is approximately:

    floor(((period * numerator) + denominator/2) / denominator)

    But that we will probably never know, unless one of the designers of the TTCAN portion of FD-CAN1 weighs in.

    Best wishes,

    David.