SLAZ242O October   2012  – May 2021 MSP430F4784

 

  1. 1Functional Advisories
  2. 2Preprogrammed Software Advisories
  3. 3Debug Only Advisories
  4. 4Fixed by Compiler Advisories
  5. 5Nomenclature, Package Symbolization, and Revision Identification
    1. 5.1 Device Nomenclature
    2. 5.2 Package Markings
      1.      PZ100
    3. 5.3 Memory-Mapped Hardware Revision (TLV Structure)
  6. 6Advisory Descriptions
    1. 6.1  COMP3
    2. 6.2  CPU19
    3. 6.3  CPU44
    4. 6.4  EEM20
    5. 6.5  FLASH19
    6. 6.6  FLASH24
    7. 6.7  FLASH25
    8. 6.8  FLASH27
    9. 6.9  FLASH36
    10. 6.10 FLL4
    11. 6.11 FLL5
    12. 6.12 FLL6
    13. 6.13 FLL7
    14. 6.14 JTAG23
    15. 6.15 LCDA5
    16. 6.16 LCDA7
    17. 6.17 SDA4
    18. 6.18 TA12
    19. 6.19 TA16
    20. 6.20 TA21
    21. 6.21 TAB22
    22. 6.22 TB2
    23. 6.23 TB16
    24. 6.24 TB24
    25. 6.25 USCI15
    26. 6.26 USCI19
    27. 6.27 USCI20
    28. 6.28 USCI21
    29. 6.29 USCI22
    30. 6.30 USCI23
    31. 6.31 USCI24
    32. 6.32 USCI25
    33. 6.33 USCI26
    34. 6.34 USCI28
    35. 6.35 USCI30
    36. 6.36 USCI34
    37. 6.37 USCI35
    38. 6.38 USCI40
    39. 6.39 XOSC5
    40. 6.40 XOSC8
    41. 6.41 XOSC9
  7. 7Revision History

USCI28

USCI Module

Category

Functional

Function

Timing of USCI I2C interrupts may cause device reset due to automatic clear of an IFG.

Description

When certain USCI I2C interrupt flags (IFG) are set and an automatic flag-clearing event on the I2C bus occurs, it results in an errant ISR call to the reset vector. This will only happen when the IFG is cleared within a critical time window (~6 CPU clock cycles) after a USCI interrupt request occurs and before the interrupt servicing is initiated. The affected interrupts are UCBxTXIFG, UCSTPIFG, UCSTTIFG and UCNACKIFG.

The automatic flag-clearing scenarios are described in the following situations:
(1) A pending UCBxTXIFG interrupt request is cleared on the falling SCL clock edge following a NACK.
(2) A pending UCSTPIFG, UCSTTIFG, or UCNACKIFG interrupt request is cleared by a following Start condition.

Workaround

(1) Polling the affected flags instead of enabling the interrupts.
or
(2) Ensuring the above mentioned flag-clearing events occur after a time delay of 6 CPU clock cycles has elapsed since the interrupt request occurred and was accepted.
or
(3) At program start, check any applicable enabled IE bits such as UCBxTXIE, UCBxRXIE, UCSTTIE, UCSTPIE or UCNACKIE for a reset (A PUC will clear all of the IE bits of interest). If no PUC occurred then the device ran into the above mentioned errant condition and the program counter will need to be restored using an RETI instruction.

; ------- Workaround (3) example for TXIFG ------------    
Note: For assembly code use code snippet shown below and insert prior to user code

main
             bit.b  #UCBxTXIE ,&IE2 ; if TXIE is set, errant call occurred
             jz     start_normal    ; if not start main program
             reti                   ; else return from interrupt call
    start_normal
             ...                    ; Application code continues

Note: For C code the workaround will need to be executed prior to the CSTARTUP routine. The steps for modifying the CSTARTUP routine are IDE dependent.
Examples for Code Composer and IAR Embedded Workbench are shown below.

IAR Embedded Workbench:
1) The file cstartup.s43 is found at: ...\IAR Systems\< Current Embedded Workbench Version >\430\src\lib\430
2) Create a local copy of this file and link it to the project. Do not rename the file.
3) In the copy insert the following code prior to stack pointer initialization as shown:


        
#define IE2       (0x0001)  
      BIT.B   #0x08,&IE2         ; if TXIE is set, errant call occurred
      JZ      Start_Normal       ; if not start main program
      RETI                       ; else return from interrupt call    
// Initialize SP to point to the top of the stack.  
Start_Normal
      MOV     #SFE(CSTACK), SP
// Ensure that main is called.

Code Composer:
1) The file boot.c is found at ...\Texas Instruments\< Current Code Composer Version > \tools\compiler\MSP430\lib\rtssrc.zip
2) Extract the file from rtssrc.zip and create a local copy. Link the copy to the project. Do not rename this file.
3) In the copy insert the following code prior to stack pointer initialization as shown:

  __asm("\t  BIT.B\t   #0x08,&0x0001"); // if TXIE is set, errant call occurred
  __asm("\t  JZ\t      Start_Normal");  // if not start main program
  __asm("\t   RETI");                   // else return from interrupt call
  __asm("Start_Normal");

/*------------------------------------------------------------------ */
/* Initialize stack pointer. Stack grows toward lower memory. */
/*-------------------------------------------------------------------*/

Insert the code here:

/**********************************************************/
/* C_INT00() - C ENVIRONMENT ENTRY POINT                                     */
/**********************************************************/
#pragma CLINK(_c_int00)
extern void __interrupt _c_int00()
{

   //

   STACK_INIT();