SLAZ182P October   2012  – May 2021 MSP430F248

 

  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.      PM64
      2.      RGC64
    3. 5.3 Memory-Mapped Hardware Revision (TLV Structure)
  6. 6Advisory Descriptions
    1. 6.1  ADC25
    2. 6.2  BCL12
    3. 6.3  BCL13
    4. 6.4  BCL15
    5. 6.5  COMP2
    6. 6.6  CPU19
    7. 6.7  FLASH19
    8. 6.8  FLASH24
    9. 6.9  FLASH25
    10. 6.10 FLASH27
    11. 6.11 FLASH36
    12. 6.12 JTAG23
    13. 6.13 PORT11
    14. 6.14 PORT12
    15. 6.15 TA12
    16. 6.16 TA16
    17. 6.17 TA21
    18. 6.18 TAB22
    19. 6.19 TB2
    20. 6.20 TB16
    21. 6.21 TB24
    22. 6.22 USCI20
    23. 6.23 USCI21
    24. 6.24 USCI22
    25. 6.25 USCI23
    26. 6.26 USCI24
    27. 6.27 USCI25
    28. 6.28 USCI26
    29. 6.29 USCI28
    30. 6.30 USCI30
    31. 6.31 USCI34
    32. 6.32 USCI35
    33. 6.33 USCI40
    34. 6.34 XOSC5
    35. 6.35 XOSC6
    36. 6.36 XOSC8
  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();