dsPIC30F3014/4013 dsPIC30F3014/4013 Rev. A1 Silicon Errata The dsPIC30F3014/4013 (Rev. A1) samples that you have received were found to conform to the specifications and functionality described in the following documents: 4. Sequential Interrupts Sequential interrupts after modifying the CPU IPL, interrupt IPL, interrupt enable or interrupt flag may cause an address error trap. * DS70157 - "dsPIC30F/33F Programmer's Reference Manual" * DS70138 - "dsPIC30F3014/4013 Data Sheet" * DS70046 - "dsPIC30F Family Reference Manual" 5. DISI Instruction The exceptions to the specifications in the documents listed above are described in this section. These exceptions are described for the specific devices listed below: The DISI instruction will not disable interrupts if a DISI instruction is executed in the same instruction cycle that the DISI counter decrements to zero. 6. Early Termination of Nested DO Loops When using two DO loops in a nested fashion, terminating the inner-level DO loop by setting the EDT (CORCON<11>) bit will produce unexpected results. 7. 32 kHz Low-Power (LP) Oscillator The LP oscillator does not function when the device is placed in Sleep mode. 8. Data Converter Interface (DCI) Once enabled, if the DCI module is subsequently disabled by the application, the module does not release the ownership of the COFS, CSCK, CSDI and CSDO pins to the associated port functions (RB9, RB10, RB11 and RB12). 9. Output Compare Module in PWM Mode * dsPIC30F3014 * dsPIC30F4013 These devices may be identified by the following message that appears in the MPLAB(R) ICD 2 Output Window under MPLAB IDE, when a "Reset and Connect" operation is performed within MPLAB IDE: Setting Vdd source to target Target Device dsPIC30F4013 found, revision = 0x1001 ...Reading ICD Product ID Running ICD Self Test ...Passed MPLAB ICD 2 Ready The errata described in this section will be addressed in future revisions of dsPIC30F3014 and dsPIC30F4013 devices. Silicon Errata Summary The following list summarizes the errata described in this document: 1. MAC Class Instructions Modification with 4 Address Sequential MAC instructions, which prefetch data from Y data space using 4 address modification, will cause an address error trap. 2. 3. Decimal Adjust Instruction The Decimal Adjust instruction, DAW.b, may improperly clear the Carry bit, C (SR<0>). PSV Operations Using SR In certain instructions, fetching one of the operands from program memory using Program Space Visibility (PSV) will corrupt specific bits in the STATUS Register, SR. (c) 2008 Microchip Technology Inc. Output compare will produce a glitch when loading 0% duty cycle in PWM mode. It will also miss the next compare after the glitch. 10. Output Compare The output compare module will produce a glitch on the output when an I/O pin is initially set high and the module is configured to drive the pin low at a specified time. 11. Special Function Registers Writes to certain unimplemented address locations can affect I/O Port register values. 12. 4x PLL Operation The 4x PLL mode of operation may not function correctly for certain input frequencies. 13. The data pin (SDA) on the I2CTM module does not function unless the LATF<2> bit is low. 14. INT0, ADC and Sleep Mode ADC event triggers from the INT0 pin will not wake-up the device from Sleep mode if the SMPI bits are non-zero. DS80228K-page 1 dsPIC30F3014/4013 15. 8x PLL Mode If 8x PLL mode is used, the input frequency range is 5 MHz-10 MHz instead of 4 MHz-10 MHz. 16. Low-Voltage Detect (LVD) The external Low-Voltage Detect (LVD) module is not connected to the AN2 Pad. 17. Sleep Mode Execution of the Sleep instruction (PWRSAV #0) may cause incorrect program operation after the device wakes up from Sleep. The current consumption during Sleep may also increase beyond the specifications listed in the device data sheet. 18. I2C Module The I2C module loses incoming data bytes when operating as an I2C slave. 19. I/O Port - Port Pin Multiplexed with IC1 The Port I/O pin multiplexed with the Input Capture 1 (IC1) function cannot be used as a digital input pin when the UART auto-baud feature is enabled. 20. I2C Module: 10-bit addressing mode When the I2C module is configured for 10-bit addressing using the same address bits (A10 and A9) as other I2C devices, the A10 and A9 bits may not work as expected. 21. Timer Module 22. PLL Lock Status Bit The PLL LOCK Status bit (OSCCON<5>) can occasionally get cleared and generate an oscillator failure trap even when the PLL is still locked and functioning correctly. 23. PSV Operations An address error trap occurs in certain addressing modes when accessing the first four bytes of any PSV page. 24. I2C Module: 10-bit Addressing Mode The 10-bit slave does not set the RBF flag or load the I2CxRCV register on address match if the Least Significant bits of the address are the same as the 7-bit reserved addresses. 25. I2C Module: 10-bit Addressing Mode When the I2C module is configured as a 10-bit slave with an address of 0x102, the I2CxRCV register content for the lower address byte is 0x01 rather than 0x02. 26. I2C Module When the I2C module is enabled, the dsPIC(R) DSC device generates a glitch on the SDA and SCL pins, causing a false communication start in a single-master configuration or a bus collision in a multi-master configuration. The following sections describe the errata and work around to these errata, where they may apply. Clock switching prevents the device from waking up from Sleep. DS80228K-page 2 (c) 2008 Microchip Technology Inc. dsPIC30F3014/4013 1. Module: MAC Class Instructions with 4 Address Modification Sequential MAC class instructions, which prefetch data from Y data space using 4 address modification, will cause an address error trap. The trap occurs only when all the following conditions are true: 1. Two sequential MAC class instructions (or a MAC class instruction executed in a REPEAT or DO loop) that prefetch from Y data space. 2. Both instructions prefetch data from Y data space using the + = 4 or - = 4 address modification. 3. Neither of the instruction uses an accumulator write back. Work around The problem described above can be avoided by using any of the following methods: 1. Inserting any other instruction between the two MAC class instructions. 2. Adding an accumulator write back (a dummy write back if needed) to either of the MAC class instructions. 3. Do not use the + = 4 or - = 4 address modification. 4. Do not prefetch data from Y data space. (c) 2008 Microchip Technology Inc. 2. Module: CPU - DAW.b Instruction The Decimal Adjust instruction, DAW.b, may improperly clear the Carry bit, C (SR<0>), when executed. Work around Check the state of the Carry bit prior to executing the DAW.b instruction. If the Carry bit is set, set the Carry bit again after executing the DAW.b instruction. Example 1 shows how the application should process the Carry bit during a BCD addition operation. EXAMPLE 1: CHECK CARRY BIT BEFORE DAW.b .include "p30f5013.inc" ....... MOV.b #0x80, w0 ;First BCD number MOV.b #0x80, w1 ;Second BCD number ADD.b w0, w1, w2 ;Perform addition BRA NC, L0 ;If C set go to L0 DAW.b w2 ;If not,do DAW and BSET.b SR, #C ;set the carry bit BRA L1 ;and exit L0:DAW.b w2 L1: .... DS80228K-page 3 dsPIC30F3014/4013 3. Module: PSV Operations Using SR These instructions are identified in Table 1. Example 2 demonstrates one scenario where this occurs. When one of the operands of instructions shown in Table 1 is fetched from program memory using Program Space Visibility (PSV), the STATUS Register, SR and/or the results may be corrupted. Also, always use Work around 2 if the C compiler is used to generate code for dsPIC30F3014/4013 devices. AFFECTED INSTRUCTIONS(1) TABLE 1: Instruction(1) Examples of Incorrect Operation(2) Data Corruption IN ADDC ADDC W0, [W1++], W2 ; SR<1:0> bits(3), Result in W2 SUBB SUBB.b W0, [++W1], W3 ; SR<1:0> bits(3), Result in W3 SUBBR SUBBR.b W0, [++W1], W3 ; SR<1:0> bits(3), Result in W3 CPB CPB W0, [W1++], W4 ; SR<1:0> bits(3) RLC RLC [W1], W4 ; SR<1:0> bits(3), Result in W4 RRC RRC [W1], W2 ; SR<1:0> bits(3), Result in W2 ADD (Accumulator-based) ADD [W1++], A ; SR<1:0> bits(3) LAC LAC [W1], A ; SR<15:10> bits(4) Note 1: 2: 3: 4: Refer to the "dsPIC30F/33F Programmer's Reference Manual" (DS70157) for details on the dsPIC30F instruction set. The errata only affects these instructions when a PSV access is performed to fetch one of the source operands in the instruction. A PSV access is performed when the effective address of the source operand is greater than 0x8000 and the PSV (CORCON<2>) bit is set to `1'. In the examples shown, the data access from program memory is made via the W1 register. SR<1:0> bits represent Sticky Zero and Carry Status bits, respectively. SR<15:10> bits represent Accumulator Overflow and Saturation Status bits. EXAMPLE 2: INCORRECT RESULTS .include "p30fxxxx.inc" ....... MOV.B #0x00, W0 ;Load PSVPAG register MOV.B WREG, PSVPAG BSET CORCON, #PSV ;Enable PSV .... MOV #0x8200, W1 ;Set up W1 for ;indirect PSV access ;from 0x000200 ADD W3, [W1++], W5 ;This instruction ;works ok ADDC W4, [W1++], W6 ;Carry flag and ;W6 gets ;corrupted here! Work arounds Work around 1: For Assembly Language Source Code To work around the erratum in the MPLAB ASM30 assembler, the application may perform a PSV access to move the source operand from program memory to RAM or a W register prior to performing the operations listed in Table 1. The work around for Example 2 is demonstrated in Example 3. DS80228K-page 4 EXAMPLE 3: CORRECT RESULTS .include "p30fxxxx.inc" ....... MOV.B #0x00, w0 ;Load PSVPAG register MOV.B WREG, PSVPAG BSET CORCON, #PSV ;Enable PSV .... MOV #0x8200, W1 ;Set up W1 for ;indirect PSV access ;from 0x000200 ADD W3, [W1++], W5 ;This instruction ;works ok MOV [W1++], W2 ;Load W2 with data ;from program memory ADDC W4, W2, W6 ;Carry flag and W4 ;results are ok! Work around 2: For C Language Source Code For applications using C language, MPLAB C30 versions 1.20.04 or higher provide the following command-line switch that implements a work around for the erratum. -merrata=psv Refer to the "readme.txt" file in the MPLAB C30 v1.20.04 toolsuite for further details. (c) 2008 Microchip Technology Inc. dsPIC30F3014/4013 4. Module: Interrupt Controller - Sequential Interrupts When interrupt nesting is enabled (or NSTDIS (INTCON1<15>) bit is `0') the following sequence of events will lead to an address error trap. The generic terms "Interrupt 1" and "Interrupt 2" are used to represent any two enabled dsPIC30F interrupts. 1. Interrupt 1 processing begins. 2. Interrupt 1 is negated by user software by one of the following methods: - CPU IPL is raised to Interrupt 1 IPL level or higher or - Interrupt 1 IPL is lowered to CPU IPL level or lower or - Interrupt 1 is disabled (Interrupt 1 IE bit set to `0') or - Interrupt 1 flag is cleared 3. Interrupt 2 occurs with a priority higher than Interrupt 1. Work around The user may disable interrupt nesting or execute a DISI instruction before modifying the CPU IPL or Interrupt 1 setting. A minimum DISI value of 2 is required if the DISI is executed immediately before the CPU IPL or Interrupt 1 is modified, as shown in Example 4. If the MPLAB C30 compiler is being used, one must inspect the Disassembly Listing in the MPLAB IDE file to determine the exact number of cycles to disable level 1-6 interrupts. One may use a large DISI value and then set the DISICNT register to zero, as shown in Example 5. A macro may also be used to perform this task, as shown in Example 6. EXAMPLE 4: USING DISI .include "p30fxxxx.inc" ... DISI#2 ; protect the disable of INT1 BCLRIEC1, #INT1IE; disable interrupt 1 ... ; next instruction protected by DISI EXAMPLE 5: RAISING CPU INTERRUPT PRIORITY LEVEL .include "p30fxxxx.h" ... __asm__ volatile ("DISI #0x1FFF"); SRbits.IPL = 0x5; DISICNT = 0x0; // protect CPU IPL modification // set CPU IPL to 5 // remove DISI protection EXAMPLE 6: USING MACRO #define DISI_PROTECT(X) {\ __asm__ volatile ("DISI #0x1FFF");\ X; \ DISICNT = 0; } DISI_PROTECT(SRbits.IPL = 0x5); (c) 2008 Microchip Technology Inc. // safely modify the CPU IPL DS80228K-page 5 dsPIC30F3014/4013 5. Module: DISI Instruction When a user executes a DISI #7, for example, this will disable interrupts from 7 + 1 cycles (7 + the DISI instruction itself). In this case, the DISI instruction uses a counter which counts down from 7 to 0. The counter is loaded with 7 at the end of the DISI instruction. If the user code executes another DISI on the instruction cycle where the DISI counter has become zero, the new DISI count is loaded, but the DISI state machine does not properly re-engage and continue to disable interrupts. At this point, all interrupts are enabled. The next time the user code executes a DISI instruction, the feature will act normally and block interrupts. In summary, it is only when DISI execution is coincident with the current DISI count = 0, that the issue occurs. Executing a DISI instruction before the DISI counter reaches zero will not produce this error. In this case, the DISI counter is loaded with the new value, and interrupts remain disabled until the counter becomes zero. Work around When executing multiple DISI instructions within the source code, make sure that subsequent DISI instructions have at least one instruction cycle between the time that the DISI counter decrements to zero and the next DISI instruction. Alternatively, make sure that subsequent DISI instructions are called before the DISI counter decrements to zero. 6. Module: Early Termination of Nested DO Loops When using two DO loops in a nested fashion, terminating the inner-level DO loop by setting the EDT (CORCON<11>) bit will produce unexpected results. Specifically, the device may continue executing code within the outer DO loop forever. This erratum does not affect the operation of the MPLAB C30 compiler. Work around The application should save the DCOUNT SFR prior to entering the inner DO loop and restore it upon exiting the inner DO loop. This work around is shown in Example 7. EXAMPLE 7: SAVE AND RESTORE DCOUNT .include "p30fxxxx.inc" ....... DO #CNT1, LOOP0 ;Outer loop start .... PUSH DCOUNT ;Save DCOUNT DO #CNT2, LOOP1 ;Inner loop .... ;starts BTSS Flag, #0 BSET CORCON, #EDT ;Terminate inner .... ;DO-loop early .... LOOP1: MOV W1, W5 ;Inner loop ends POP DCOUNT ;Restore DCOUNT ... LOOP0: MOV W5, W8 ;Outer loop ends Note: For details on the functionality of EDT bit, see section 2.9.2.4 in the dsPIC30F Family Reference Manual. 7. Module: 32 kHz Low-Power (LP) Oscillator The LP oscillator is located on the SOSCO and SOSCI device pins and serves as a secondary crystal clock source for low-power operation. The LP oscillator can also drive Timer1 for a real-time clock application. The LP oscillator does not function when the device is placed in Sleep mode. Work around If the application needs to wake-up periodically from Sleep mode using an internal timer, the Watchdog Timer may be enabled prior to entering Sleep mode. When the Watchdog Timer expires, code execution will resume from the instruction immediately following the SLEEP instruction. 8. Module: Data Converter Interface (DCI) The DCI module is enabled by setting the DCIEN (DCICON1<15>) bit and disabled by clearing the DCIEN bit. Once enabled, if the DCI module is subsequently disabled by the application, the module does not release the ownership of the COFS, CSCK, CSDI and CSDO pins to the associated port functions (RB9, RB10, RB11 and RB12). Work around After disabling the DCI module by clearing the DCIEN bit, the application should further set the DCI Module Disable bit, DCIMD (PMD1<8>). The port functions associated with the DCI module (RB9, RB10, RB11 and RB12) may now be used. DS80228K-page 6 (c) 2008 Microchip Technology Inc. dsPIC30F3014/4013 9. Module: Output Compare in PWM Mode If the desire duty cycle is `0' (OCxRS = 0), the module will generate a high level glitch of 1 TCY. The second problem is that on the next cycle after the glitch, the OC pin does not go high, or in other words, it misses the next compare for any value written on OCxRS. Work around There are two possible solutions to this problem: 1. Load a value greater than `0' to the OCxRS register when operating n PWM mode. In this case, no 0% duty cycle is achievable. 2. If the application requires 0% duty cycles, the output compare module can be disabled for 0% duty cycles, and re-enabled for non-zero percent duty cycles. 10. Module: Output Compare A glitch will be produced on an output compare pin under the following conditions: * The user software initially drives the I/O pin high using the output compare module or a write to the associated PORT register. * The output compare module is configured and enabled to drive the pin low at some later time (OCxCON = 0x0002 or OCxCON = 0x0003). When these events occur, the output compare module will drive the pin low for one instruction cycle (TCY) after the module is enabled. 12. Module: 4x PLL Operation When the 4x PLL mode of operation is selected, the specified input frequency range of 4-10 MHz is not fully supported. When device VDD is 2.5-3.0V, the 4x PLL input frequency must be in the range of 4-5 MHz. When device VDD is 3.0-3.6V, the 4x PLL input frequency must be in the range of 4-6 MHz for both industrial and extended temperature ranges. Work around 1. Use 8x PLL or 16x PLL mode of operation and set final device clock speed using the POST<1:0> oscillator postscaler control bits (OSCCON<7:6>). 2. Use the EC without PLL Clock mode with a suitable clock frequency to obtain the equivalent 4x PLL clock rate. 13. Module: I2C The SDA pin is the data pin for the I2C module. This pin is multiplexed the RF2 pin. The state of the LATF<2> overrides the SDA pin functionality when LATF<2> is high. In order to use the I2C module successfully, the LATF<2> bit must be low. Work around Before enabling the I2C module, clear the LATF<2> bit. The I2C module will operate properly as long as this bit remains low. Work around None. However, the user may use a timer interrupt and write to the associated PORT register to control the pin manually. 11. Module: Special Function Registers The I/O Port register values can be changed by writing to the following address locations, which are located in unimplemented memory space. A write to these unimplemented addresses could cause an I/O pin configured as an output to change states. This state change could be confirmed by reading either the PORT or LAT register associated with the pin. PORTB will be modified by a write to address 0x0C8 PORTC will be modified by a write to address 0x0CE PORTD will be modified by a write to address 0x0D4 PORTE will be modified by a write to address 0x0DA PORTF will be modified by a write to address 0x0E0 Work around User software should avoid writing to the unimplemented locations listed above. (c) 2008 Microchip Technology Inc. DS80228K-page 7 dsPIC30F3014/4013 14. Module: INT0, ADC and Sleep Mode ADC event triggers from the INT0 pin will not wake-up the device from Sleep mode if the SMPI bits are non-zero. This means that if the ADC is configured to generate an interrupt after a certain number of INT0 triggered conversions, the ADC conversions will not be triggered and the device will remain in Sleep. The ADC will perform conversions and wake-up the device only if it is configured to generate an interrupt after each INT0 triggered conversion (SMPI<3:0> = 0000). Work around None. If ADC event trigger from the INT0 pin is required, initialize SMPI<3:0> to `0000' (interrupt on every conversion). 15. Module: 8x PLL Mode If 8x PLL mode is used, the input frequency range is 5 MHz-10 MHz instead of 4 MHz-10 MHz. Work around None. If 8x PLL is used, make sure the input crystal or clock frequency is 5 MHz or greater. 16. Module: Low-Voltage Detect (LVD) When using the external Low-Voltage Detect (LVD) module, interrupts are generated independent of the voltage. Work around The LVD module works as an internal reference source only. 17. Module: Sleep Mode Execution of the Sleep instruction (PWRSAV #0) may cause incorrect program operation after the device wakes up from Sleep. The current consumption during Sleep may also increase beyond the specifications listed in the device data sheet. Work arounds To avoid this issue, any of the following three work arounds can be implemented, depending on the application requirements. Work around 1: Ensure that the PWRSAV #0 instruction is located at the end of the last row of program Flash memory available on the target device and fill the remainder of the row with NOP instructions. This can be accomplished by replacing all occurrences of the PWRSAV #0 instruction with a function call to a suitably aligned subroutine. The address( ) attribute provided by the MPLAB ASM30 assembler can be utilized to correctly align the instructions in the subroutine. For an application written in C, the function call would be GotoSleep( ), while for an assembly language application, the function call would be CALL _GotoSleep. The address error trap service routine software can then replace the invalid return address saved on the stack with the address of the instruction immediately following the _GotoSleep or GotoSleep( ) function call. This ensures that the device continues executing the correct code sequence after waking up from Sleep mode. Example 8 demonstrates the work around described above, as it would apply to a dsPIC30F3014 device. DS80228K-page 8 (c) 2008 Microchip Technology Inc. dsPIC30F3014/4013 EXAMPLE 8: ; ---------------------------------------------------------------------------------------------.global __reset .global _main .global _GotoSleep .global __AddressError .global __INT1Interrupt ; ---------------------------------------------------------------------------------------------.section *, code _main: BSET INTCON2, #INT1EP ; Set up INT pins to detect falling edge BCLR IFS1, #INT1IF ; Clear interrupt pin interrupt flag bits BSET IEC1, #INT1IE ; Enable ISR processing for INT pins CALL _GotoSleep ; Call function to enter SLEEP mode _continue: BRA _continue ; ---------------------------------------------------------------------------------------------; Address Error Trap __AddressError: BCLR INTCON1, #ADDRERR ; Set program memory return address to _continue POP.D W0 MOV.B #tblpage (_continue), W1 MOV #tbloffset (_continue), W0 PUSH.D W0 RETFIE ; ---------------------------------------------------------------------------------------------__INT1Interrupt: BCLR IFS1, #INT1IF ; Ensure flag is reset RETFIE ; Return from Interrupt Service Routine ; ---------------------------------------------------------------------------------------------.section *, code, address (0x3FC0) _GotoSleep: ; fill remainder of the last row with NOP instructions .rept 31 NOP .endr ; Place SLEEP instruction in the last word of program memory PWRSAV #0 Work around 2: Work around 3: Instead of executing a PWRSAV #0 instruction to put the device into Sleep mode, perform a clock switch to the 512 kHz Low-Power RC (LPRC) Oscillator with a 64:1 postscaler mode. This enables the device to operate at 0.002 MIPS, thereby significantly reducing the current consumption of the device. Similarly, instead of using an interrupt to wake-up the device from Sleep mode, perform another clock switch back to the original oscillator source to resume normal operation. Depending on the device, refer to Section 7. "Oscillator" (DS70054) or Section 29. "Oscillator" (DS70268) in the "dsPIC30F Family Reference Manual" (DS70046) for more details on performing a clock switch operation. Instead of executing a PWRSAV #0 instruction to put the device into Sleep mode, perform a clock switch to the 32 kHz Low-Power (LP) Oscillator with a 64:1 postscaler mode. This enables the device to operate at 0.000125 MIPS, thereby significantly reducing the current consumption of the device. Similarly, instead of using an interrupt to wake-up the device from Sleep mode, perform another clock switch back to the original oscillator source to resume normal operation. Depending on the device, refer to Section 7. "Oscillator" (DS70054) or Section 29. "Oscillator" (DS70268) in the "dsPIC30F Family Reference Manual" (DS70046) for more details on performing a clock switch operation. Note: The above work around is recommended for users for whom application hardware changes are not possible. (c) 2008 Microchip Technology Inc. Note: The above work around is recommended for users for whom application hardware changes are possible, and also for users whose application hardware already includes a 32 kHz LP Oscillator crystal. DS80228K-page 9 dsPIC30F3014/4013 18. Module: I2C Work around 2: When the I2C module is configured as a slave, either in single-master or multi-master mode, the I2C receiver buffer is filled whether a valid slave address is detected or not. Therefore, an I2C receiver overflow condition occurs and this condition is indicated by the I2COV flag in the I2CSTAT register. Use this work around for applications in which the I2C receiver interrupt is required. Assuming that the RBF and the I2COV flags in the I2CSTAT register are set due to previous data transfers in the I2C bus (i.e., between master and other slaves); the following procedure can be used to receive valid data bytes: This overflow condition inhibits the ability to set the I2C receive interrupt flag (SI2CF) when the last valid data byte is received. Therefore, the I2C slave Interrupt Service Routine (ISR) is not called and the I2C receiver buffer is not read prior receiving the next data byte. 1. When a valid slave address byte is detected, SI2CF bit is set and the I2C slave interrupt service routine is called; however, the RBF and I2COV bits are already set due to data transfers between other I2C nodes. 2. Check the status of the D_A flag and the I2COV flag in the I2CSTAT register when executing the I2C slave service routine. 3. If the D_A flag is cleared and the I2COV flag are set, an invalid data byte was received but a valid address byte was received. The overflow condition occurred because the I2C receive buffer was overflowing with previous I2C data transfers between other I2C nodes. This condition only occurs after a valid slave address was detected. 4. Clear the I2COV flag and perform a dummy read of the I2C receiver buffer, I2CRCV, to clear the RBF bit and recover the valid address byte. This action will also avoid the loss of the next data byte due to an overflow condition. 5. Verify that the recovered address byte matches the current slave address byte. If they match, the next data to be received is a valid data byte. 6. If the D_A flag and the I2COV flag are both set, a valid data byte was received and a previous valid data byte was lost. It will be necessary to code for handling this overflow condition. Work arounds To avoid this issue, either of the following two work arounds can be implemented, depending on the application requirements. Work around 1: For applications in which the I2C receiver interrupt is not required, the following procedure can be used to receive valid data bytes: 1. Wait until the RBF flag is set. 2. Poll the I2C receiver interrupt SI2CIF flag. 3. If SI2CF is not set in the corresponding Interrupt Flag Status (IFSx) register, a valid address or data byte has not been received for the current slave. Execute a dummy read of the I2C receiver buffer, I2CRCV; this will clear the RBF flag. Go back to step 1 until SI2CF is set and then continue to Step 4. 4. If the SI2CF is set in the corresponding Interrupt Flag Status (IFSx) register, valid data has been received. Check the D_A flag to verify that an address or a data byte has been received. 5. Read the I2CRCV buffer to recover valid data bytes. This will also clear the RBF flag. 6. Clear the I2C receiver interrupt flag SI2CF. 7. Go back to step 1 to continue receiving incoming data bytes. DS80228K-page 10 (c) 2008 Microchip Technology Inc. dsPIC30F3014/4013 19. Module: I/O Port - Port Pin Multiplexed with IC1 If the user application enables the auto-baud feature in the UART module, the I/O pin multiplexed with the IC1 (Input Capture) pin cannot be used as a digital input. Work around None. 23. Module: PSV Operations An address error trap occurs in certain addressing modes when accessing the first four bytes of an PSV page. This only occurs when using the following addressing modes: * MOV.D * Register Indirect Addressing (word or byte mode) with pre/post-decrement Work around 20. Module: I2C If there are two I2C devices on the bus, one of them is acting as the Master receiver and the other as the Slave transmitter. If both devices are configured for 10-bit addressing mode, and have the same value in the A10 and A9 bits of their addresses, then when the Slave select address is sent from the Master, both the Master and Slave acknowledge it. When the Master sends out the read operation, both the Master and the Slave enter into Read mode and both of them transmit the data. The resultant data will be the ANDing of the two transmissions. Work around In all I2C devices, the addresses as well as bits A10 and A9 should be different. 21. Module: Timer Do not perform PSV accesses to any of the first four bytes using the above addressing modes. For applications using the C language, MPLAB C30 version 3.11 or higher, provides the following command-line switch that implements a work around for the erratum. -merrata=psv_trap Refer to the readme.txt file in the MPLAB C30 v3.11 tool suite for further details. 24. Module: I2C In 10-bit Addressing mode, some address matches don't set the RBF flag or load the receive register I2CxRCV, if the lower address byte matches the reserved addresses. In particular, these include all addresses with the form XX0000XXXX and XX1111XXXX, with the following exceptions: When the timer is being operated in the asynchronous mode using the secondary oscillator (32.768 kHz) and the device is put into Sleep mode, a clock switch to any other oscillator mode before putting the device to Sleep prevents the timer from waking the device from Sleep. * * * * Work around Ensure that the lower address byte in 10-bit Addressing mode does not match any 7-bit reserved addresses. Do not clock switch to any other oscillator mode if the timer is being used in the asynchronous mode using the secondary oscillator (32.768 kHz). 22. Module: PLL Lock Status Bit The PLL LOCK Status bit (OSCCON<5>) can occasionally get cleared and generate an oscillator failure trap even when the PLL is still locked and functioning correctly. Work around The user application must include an oscillator failure trap service routine. In the trap service routine, first inspect the status of the Clock Failure Status bit (OSCCON<3>). If this bit is clear, return from the trap service routine immediately and continue program execution. (c) 2008 Microchip Technology Inc. 001111000X 011111001X 101111010X 111111011X Work around 25. Module: I2C When the I2C module is configured as a 10-bit slave with and address of 0x102, the I2CxRCV register content for the lower address byte is 0x01 rather than 0x02; however, the module acknowledges both address bytes. Work around None. DS80228K-page 11 dsPIC30F3014/4013 26. Module: I2C When the I2C module is enabled by setting the I2CEN bit in the I2CCON register, the dsPIC DSC device generates a glitch on the SDA and SCL pins. This glitch falsely indicates "Communication Start" to all devices on the I2C bus, and can cause a bus collision in a multi-master configuration. Additionally, when the I2CEN bit is set, the S and P bits of the I2C module are set to values `1' and `0', respectively, which indicate a "Communication Start" condition. Work arounds To avoid this issue, either of the following two work arounds can be implemented, depending on the application requirements. Work around 1: In a single-master environment, add a delay between enabling the I2C module and the first data transmission. The delay should be equal to or greater than the time it takes to transmit two data bits. In the multi-master configuration, in addition to the delay, all other I2C masters should be synchronized and wait for the I2C module to be initialized before initiating any kind of communication. Work around 2: In dsPIC DSC devices in which the I2C module is multiplexed with other modules that have precedence in the use of the pin, it is possible to avoid this glitch by enabling the higher priority module before enabling the I2C module. Use the following procedure to implement this work around: 1. Enable the higher priority peripheral module that is multiplexed on the same pins as the I2C module. 2. Set up and enable the I2C module. Disable the higher priority peripheral module that was enabled in step 1. Note: Work around 2 works only for devices that share the SDA and SCL pins with another peripheral that has a higher precedence over the port latch, such as the UART. The priority is shown in the pin diagram located in the data sheet. For example, if the SDA and SCL pins are shared with the UART and SPI pins, and the UART has higher precedence on the port latch pin. DS80228K-page 12 (c) 2008 Microchip Technology Inc. dsPIC30F3014/4013 APPENDIX A: REVISION HISTORY Revision A (2/2005) Original version of this document. Revision B (3/2005) Added silicon issues 7 (Special Function Registers) and 8 (PLL). Revision C (4/2005) Added silicon issue 9 (Using OSC2/RC15 pin for Digital I/O). Revision D (4/2006) Added silicon issue 10 (I2C). Revision E (9/2006) Added errata 1, 5, 9, 10, 15 and 16. Revision F (6/2007) Added silicon issue 17 (LVD) and 18 (Output Compare). Revision G (9/2007) Removed silicon issue 18 (Output Compare). Updated silicon issue 14 (I2C). Added silicon issue 18 (Sleep Mode). Revision H (12/2007) Updated silicon issue 3 (PSV Operations Using SR), and added silicon issues 19 and 20 (I2C), and 21 (I/O Port - Port Pin Multiplexed with IC1). Revision J (5/2008) Added silicon issues 21 and 22 (I2C), and 23 (Timer). Removed silicon issue 13 (Using OSC2/RC15 pin for Digital I/O). Revision K (9/2008) Replaced issues 19 and 21 (I2C) with issue 26 (I2C). Added silicon issues 22 (PLL Lock Status Bit), 23 (PSV Operations) and 24-26 (I2C). (c) 2008 Microchip Technology Inc. DS80228K-page 13 dsPIC30F3014/4013 NOTES: DS80228K-page 14 (c) 2008 Microchip Technology Inc. Note the following details of the code protection feature on Microchip devices: * Microchip products meet the specification contained in their particular Microchip Data Sheet. * Microchip believes that its family of products is one of the most secure families of its kind on the market today, when used in the intended manner and under normal conditions. * There are dishonest and possibly illegal methods used to breach the code protection feature. All of these methods, to our knowledge, require using the Microchip products in a manner outside the operating specifications contained in Microchip's Data Sheets. Most likely, the person doing so is engaged in theft of intellectual property. * Microchip is willing to work with the customer who is concerned about the integrity of their code. * Neither Microchip nor any other semiconductor manufacturer can guarantee the security of their code. Code protection does not mean that we are guaranteeing the product as "unbreakable." Code protection is constantly evolving. We at Microchip are committed to continuously improving the code protection features of our products. Attempts to break Microchip's code protection feature may be a violation of the Digital Millennium Copyright Act. If such acts allow unauthorized access to your software or other copyrighted work, you may have a right to sue for relief under that Act. Information contained in this publication regarding device applications and the like is provided only for your convenience and may be superseded by updates. It is your responsibility to ensure that your application meets with your specifications. MICROCHIP MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND WHETHER EXPRESS OR IMPLIED, WRITTEN OR ORAL, STATUTORY OR OTHERWISE, RELATED TO THE INFORMATION, INCLUDING BUT NOT LIMITED TO ITS CONDITION, QUALITY, PERFORMANCE, MERCHANTABILITY OR FITNESS FOR PURPOSE. Microchip disclaims all liability arising from this information and its use. Use of Microchip devices in life support and/or safety applications is entirely at the buyer's risk, and the buyer agrees to defend, indemnify and hold harmless Microchip from any and all damages, claims, suits, or expenses resulting from such use. No licenses are conveyed, implicitly or otherwise, under any Microchip intellectual property rights. Trademarks The Microchip name and logo, the Microchip logo, Accuron, dsPIC, KEELOQ, KEELOQ logo, MPLAB, PIC, PICmicro, PICSTART, rfPIC, SmartShunt and UNI/O are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. FilterLab, Linear Active Thermistor, MXDEV, MXLAB, SEEVAL, SmartSensor and The Embedded Control Solutions Company are registered trademarks of Microchip Technology Incorporated in the U.S.A. Analog-for-the-Digital Age, Application Maestro, CodeGuard, dsPICDEM, dsPICDEM.net, dsPICworks, dsSPEAK, ECAN, ECONOMONITOR, FanSense, In-Circuit Serial Programming, ICSP, ICEPIC, Mindi, MiWi, MPASM, MPLAB Certified logo, MPLIB, MPLINK, mTouch, PICkit, PICDEM, PICDEM.net, PICtail, PIC32 logo, PowerCal, PowerInfo, PowerMate, PowerTool, REAL ICE, rfLAB, Select Mode, Total Endurance, WiperLock and ZENA are trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. SQTP is a service mark of Microchip Technology Incorporated in the U.S.A. All other trademarks mentioned herein are property of their respective companies. (c) 2008, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved. Printed on recycled paper. Microchip received ISO/TS-16949:2002 certification for its worldwide headquarters, design and wafer fabrication facilities in Chandler and Tempe, Arizona; Gresham, Oregon and design centers in California and India. The Company's quality system processes and procedures are for its PIC(R) MCUs and dsPIC(R) DSCs, KEELOQ(R) code hopping devices, Serial EEPROMs, microperipherals, nonvolatile memory and analog products. In addition, Microchip's quality system for the design and manufacture of development systems is ISO 9001:2000 certified. (c) 2008 Microchip Technology Inc. DS80228K-page 15 Worldwide Sales and Service AMERICAS ASIA/PACIFIC ASIA/PACIFIC EUROPE Corporate Office 2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel: 480-792-7200 Fax: 480-792-7277 Technical Support: http://support.microchip.com Web Address: www.microchip.com Asia Pacific Office Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel: 852-2401-1200 Fax: 852-2401-3431 India - Bangalore Tel: 91-80-4182-8400 Fax: 91-80-4182-8422 India - New Delhi Tel: 91-11-4160-8631 Fax: 91-11-4160-8632 Austria - Wels Tel: 43-7242-2244-39 Fax: 43-7242-2244-393 Denmark - Copenhagen Tel: 45-4450-2828 Fax: 45-4485-2829 India - Pune Tel: 91-20-2566-1512 Fax: 91-20-2566-1513 France - Paris Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79 Japan - Yokohama Tel: 81-45-471- 6166 Fax: 81-45-471-6122 Germany - Munich Tel: 49-89-627-144-0 Fax: 49-89-627-144-44 Atlanta Duluth, GA Tel: 678-957-9614 Fax: 678-957-1455 Boston Westborough, MA Tel: 774-760-0087 Fax: 774-760-0088 Chicago Itasca, IL Tel: 630-285-0071 Fax: 630-285-0075 Dallas Addison, TX Tel: 972-818-7423 Fax: 972-818-2924 Detroit Farmington Hills, MI Tel: 248-538-2250 Fax: 248-538-2260 Kokomo Kokomo, IN Tel: 765-864-8360 Fax: 765-864-8387 Los Angeles Mission Viejo, CA Tel: 949-462-9523 Fax: 949-462-9608 Santa Clara Santa Clara, CA Tel: 408-961-6444 Fax: 408-961-6445 Toronto Mississauga, Ontario, Canada Tel: 905-673-0699 Fax: 905-673-6509 Australia - Sydney Tel: 61-2-9868-6733 Fax: 61-2-9868-6755 China - Beijing Tel: 86-10-8528-2100 Fax: 86-10-8528-2104 China - Chengdu Tel: 86-28-8665-5511 Fax: 86-28-8665-7889 Korea - Daegu Tel: 82-53-744-4301 Fax: 82-53-744-4302 China - Hong Kong SAR Tel: 852-2401-1200 Fax: 852-2401-3431 Korea - Seoul Tel: 82-2-554-7200 Fax: 82-2-558-5932 or 82-2-558-5934 China - Nanjing Tel: 86-25-8473-2460 Fax: 86-25-8473-2470 Malaysia - Kuala Lumpur Tel: 60-3-6201-9857 Fax: 60-3-6201-9859 China - Qingdao Tel: 86-532-8502-7355 Fax: 86-532-8502-7205 Malaysia - Penang Tel: 60-4-227-8870 Fax: 60-4-227-4068 China - Shanghai Tel: 86-21-5407-5533 Fax: 86-21-5407-5066 Philippines - Manila Tel: 63-2-634-9065 Fax: 63-2-634-9069 China - Shenyang Tel: 86-24-2334-2829 Fax: 86-24-2334-2393 Singapore Tel: 65-6334-8870 Fax: 65-6334-8850 China - Shenzhen Tel: 86-755-8203-2660 Fax: 86-755-8203-1760 Taiwan - Hsin Chu Tel: 886-3-572-9526 Fax: 886-3-572-6459 China - Wuhan Tel: 86-27-5980-5300 Fax: 86-27-5980-5118 Taiwan - Kaohsiung Tel: 886-7-536-4818 Fax: 886-7-536-4803 China - Xiamen Tel: 86-592-2388138 Fax: 86-592-2388130 Taiwan - Taipei Tel: 886-2-2500-6610 Fax: 886-2-2508-0102 China - Xian Tel: 86-29-8833-7252 Fax: 86-29-8833-7256 Thailand - Bangkok Tel: 66-2-694-1351 Fax: 66-2-694-1350 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781 Netherlands - Drunen Tel: 31-416-690399 Fax: 31-416-690340 Spain - Madrid Tel: 34-91-708-08-90 Fax: 34-91-708-08-91 UK - Wokingham Tel: 44-118-921-5869 Fax: 44-118-921-5820 China - Zhuhai Tel: 86-756-3210040 Fax: 86-756-3210049 01/02/08 DS80228K-page 16 (c) 2008 Microchip Technology Inc.