Section 3. Data Memory HIGHLIGHTS This section of the manual contains the following topics: 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 Introduction .................................................................................................................... 3-2 Data Space .................................................................................................................... 3-2 Data Space Address Generation Units (AGUs) ........................................................... 3-11 Modulo Addressing (dsPIC33E Devices Only) ............................................................ 3-13 Bit-Reversed Addressing (dsPIC33E Devices Only) ................................................... 3-19 DMA RAM .................................................................................................................... 3-23 Control Register Descriptions ...................................................................................... 3-24 Register Maps.............................................................................................................. 3-30 Related Application Notes............................................................................................ 3-31 Revision History ........................................................................................................... 3-32 3 Data Memory © 2009-2011 Microchip Technology Inc. DS70595C-page 3-1 dsPIC33E/PIC24E Family Reference Manual Note: This family reference manual section is meant to serve as a complement to device data sheets. Depending on the device variant, this manual section may not apply to all dsPIC33E/PIC24E devices. Please consult the note at the beginning of the “Data Memory” chapter in the current device data sheet to check whether this document supports the device you are using. Device data sheets and family reference manual sections are available for download from the Microchip Worldwide Web site at: http://www.microchip.com 3.1 INTRODUCTION The dsPIC33E/PIC24E data width is 16 bits. All internal registers and data space memory are organized as 16 bits wide. The data spaces can be accessed as one 64 Kbyte linear address range or 4 Mbyte pseudo-linear paged address range. The data memory is accessed using Address Generation Units (AGUs) and separate data paths. 3.2 DATA SPACE Data memory addresses between 0x0000 and 0x0FFF are reserved for the device Special Function Registers (SFRs). The SFRs include control and status bits for the CPU and peripherals on the device. An example data space memory map is shown in Figure 3-1. The RAM begins at address 0x1000 and is split into two blocks, X and Y data space. For data writes, the X and Y data memory spaces are always accessed as a single, linear data space. For data reads, the X and Y data memory spaces can be accessed independently or as a single, linear space. Data reads for MCU class instructions always access the X and Y data spaces as a single combined data space. Dual source operand DSP instructions, such as the MAC instruction, access the X and Y data spaces separately to support simultaneous reads for the two source operands. MCU instructions can use any W register as an address pointer for a data read or write operation. During data reads, the DSP class of instructions isolates the Y address space from the total data space. W10 and W11 are used as address pointers for reads from the Y data space. The remaining data space is referred to as X space, but could more accurately be described as “X minus Y” space. W8 and W9 are used as address pointers for data reads from the X data space in DSP class instructions. Figure 3-2 shows how the data memory map functions for both MCU class and DSP class instructions. Note that it is the W register number and type of instruction that determines how address space is accessed for data reads. In particular, MCU instructions treat the X and Y memory as a single combined data space. The MCU instructions can use any W register as an address pointer for reads and writes in combination with read and write data space page registers. The DSP instructions that can simultaneously pre-fetch two data operands, split the data memory into two spaces. Specific W registers must be used for read address pointers in this case. Some DSP instructions have the ability to store the accumulator that is not targeted by the instruction to data memory. This function is called “accumulator write back”. W13 must be used as an address pointer to the combined data memory space for accumulator write back operations. For DSP class instructions, W8 and W9 should point to implemented X memory space for all memory reads. If W8 or W9 points to Y memory space, zeros will be returned. If W8 or W9 points to an unimplemented memory address, an address error trap will be generated. DS70595C-page 3-2 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory For DSP class instructions, W10 and W11 should point to implemented Y memory space for all memory reads. If W10 or W11 points to implemented X memory space, all zeros will be returned. If W10 or W11 points to an unimplemented memory address, an address error trap will be generated. For additional information on address error traps, refer to Section 6. “Interrupts” (DS70602). Note: The data memory map and the partition between the X and Y data spaces is device specific. Refer to the specific dsPIC33E/PIC24E device data sheet for further details. In addition, some dsPIC33E/PIC24E devices contain DMA and dual-ported SRAM memory (DPSRAM). Both the CPU and DMA controller can write and read to/from addresses within the DPSRAM without interference, such as CPU stalls, resulting in maximized, real-time performance. The DMA can address all of the data memory space including the Extended Data Space (EDS), excluding the SFR space. Refer to Section 22. “Direct Memory Access (DMA)” (DS70348) for more information. Note: The presence and size of DPSRAM is device specific. Refer to the specific dsPIC33E/PIC24E device data sheet for further details. The data memory space is extended to support additional RAM and an optional external bus interface. The extended data memory space is a pseudo-linear address space across DS, EDS and Program Space Visibility (PSV) spaces. Figure 3-1: Example Data Memory Map MSB Address 0x0001 MSB LSB 0x0000 SFR Space 0x0FFF 0x1001 0x0FFE 0x1000 0x1FFF 0x2001 0x1FFE 0x2000 X Data RAM 3 LSB Address Addressable Directly 0x7FFE 0x8000 0x7FFF 0x8001 X Data RAM 0x8FFE 0x9000 0x8FFF 0x9001 Y Data RAM 0xCFFF 0xD001 Visible if DSxPAG = 0x01; otherwise, EDS or PSV page window 0xCFFE 0xD000 DPSRAM 0xDFFF 0xE001 Addressable Indirectly or Directly with the MOV instruction 0xDFFE 0xE000 X Data RAM Unimplemented 0xFFFF Note 1: 2: 3: 4: 0xFFFE The size of the X and Y data spaces is device specific. Refer to the appropriate device data sheet for further details. The data space boundaries indicated here are used for example purposes only. Near data memory can be accessed directly via file register instructions that encode a 13-bit address into the opcode. All data memory can be accessed indirectly via W registers or directly using the MOV instruction. Upper half of data memory map can be mapped into a segment of program memory space for PSV. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-3 Data Memory Always visible whenever EA<15> = 0 Near Data Memory (8 Kbytes) 16 bits dsPIC33E/PIC24E Family Reference Manual Data Spaces for MCU and DSP Instructions Indirect EA from W10, W11 Indirect EA from W8, W9 X Space Figure 3-2: Y Space Unused X Space (Y Space) X Space Unused Unused MCU Class Instructions (Read/Write) Dual Source Operand DSP Instructions (Read) DSP Instructions (Write) Note: 3.2.1 Data writes for DSP instructions consider the entire data memory as one combined space. DSP instructions that perform an accumulator write back use W13 as an address pointer for writes to the combined data spaces. Near Data Memory An 8 Kbyte address space, referred to as near data memory, is reserved in the data memory space between 0x0000 and 0x1FFF. Near data memory is directly addressable through a 13-bit absolute address field within all file register instructions. The memory regions included in the near data region will depend on the amount of data memory implemented for each dsPIC33E/PIC24E device variant. At a minimum, the near data region will include all of the SFRs and some of the X data memory. For devices that have smaller amounts of data memory, the near data region can include all of X memory space and possibly some or all of Y memory space. Refer to Figure 3-1 for more details. Note: 3.2.2 The entire 64K data space can be addressed directly using the MOV instruction. Refer to the “16-bit MCU and DSC Programmer’s Reference Manual” (DS70157) for further details. Paged Memory Scheme The dsPIC33E/PIC24E architecture extends the available data space through a paging scheme, which allows the available data space to be accessed using MOV instructions in a linear fashion for pre- and post-modified effective addresses (EAs). The base data space address pointer is used in conjunction with the data space page registers, the 10-bit read page register (DSRPAG) or the 9-bit write page register (DSWPAG), to form an EDS address or PSV address. The data space page registers are located in the SFR space. Construction of the EDS address is shown in Figure 3-3 and Figure 3-4. When DSRPAG<9> = 0 and base address bit, EA<15> = 1, DSRPAG<8:0> is concatenated onto EA<14:0> to form the 24-bit EDS read address. Similarly, when base address bit, EA<15> = 1, DSWPAG<8:0> is concatenated onto EA<14:0> to form the 24-bit EDS write address. DS70595C-page 3-4 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory Figure 3-3: Extended Data Space (EDS) Read Address Generation 16-bit DS EA EA<15> = 0 (DSRPAG = don’t care) 0 No EDS access Byte Select EA EA<15> Generate PSV address Y DSRPAG<9> = 1? Select DSRPAG 0 1 EA N DSRPAG<8:0> 9 bits 15 bits Byte Select 24-bit EDS EA Note: DS read access when DSRPAG = 0x000 will force an Address Error trap. Extended Data Space (EDS) Write Address Generation 16-bit DS EA Byte Select EA<15> = 0 (DSWPAG = don’t care) No EDS access 0 EA EA<15> 1 EA DSWPAG<8:0> 9 bits 15 bits 24-bit EDS EA Byte Select Note: DS write access when DSWPAG = 0x000 will force an Address Error trap. The paged memory scheme provides access to multiple 32 Kbyte windows in the EDS and PSV memory. The data space page registers DSxPAG, in combination with the upper half of data space address can provide up to 16 Mbytes of additional address space in the EDS and 8 Mbytes (DSRPAG only) of PSV address space. The EDS memory map is shown in Figure 3-5. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-5 Data Memory Figure 3-4: 3 dsPIC33E/PIC24E Family Reference Manual Figure 3-5: EDS Memory Map EA<15:0> 0x0000 Conventional DS Address SFR/DS (PAGE 0) 0x8000 PAGE 1 DS 0x008000 0xFFFF PAGE 2 PAGE 3 0x010000 0x018000 DSRPAG<9> = 0 EDS EA Address (24 bits) (DSRPAG<8:0>, EA<14:0>) (DSWPAG<8:0>, EA<14:0>) PAGE 1FD PAGE 1FE PAGE 1FF Note: 0xFE8000 0xFF0000 0xFF8000 The program space (PS) can be read using DSRPAG values of 0x200 or greater. Writes to PS are not supported, so DSWPAG is dedicated to EDS writes only. Refer to Section 4.0 “Program Memory” (DS70613) for details on PSV access. The usage of the page registers (DSRPAG and DSWPAG) for read and write access allows data movement between different pages in data memory. This is accomplished by setting the DSRPAG register value to the page from which you want to read, and configuring the DSWPAG register to the page to which it needs to be written. Data can also be moved from different PSV to EDS pages, by configuring the DSRPAG and DSWPAG registers to address PSV and EDS space, respectively. The data can be moved between pages by a single instruction. Example 3-1, Example 3-2 and Example 3-3 provide code examples for managing EDS access. Example 3-1: Compiler Managed EDS Access #include <p33Exxxx.h> _FOSCSEL(FNOSC_FRC); _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE); _FWDT(FWDTEN_OFF); __eds__ int __attribute__((space(xmemory),eds)) m[5] = {1, 2, 3, 4, 5}; __eds__ int __attribute__((space(ymemory),eds)) x[5] = {10, 20, 30, 40, 50}; int sum; int vectorDotProduct (int *, int *); int main(void) { // Compiler-managed EDS accesses sum = vectorDotProduct (__eds__ int *,__eds__ int *); } while(1); int vectorDotProduct (__eds__ int * m,__eds__ int * x) { int i, sum = 0; } DS70595C-page 3-6 for (i = 0; i < 5; i ++) sum += (*m++) * (*x++); return (sum); © 2009-2011 Microchip Technology Inc. Section 3. Data Memory Example 3-2: User Managed EDS Access #include <p33Exxxx.h> _FOSCSEL(FNOSC_FRC); _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE); _FWDT(FWDTEN_OFF); int int int int int int int m[5] = {1, 2, 3, 4, 5}; __attribute__((space(xmemory),eds)) __attribute__((space(ymemory),eds)) x[5] = {10, 20, 30, 40, 50}; sum[5]; __attribute__((space(xmemory),eds)) __attribute__((space(ymemory),eds)) m1[5] = {2, 4, 6, 8, 10}; m2[5] = {3, 6, 9, 12, 15}; sum1[5]; sum2[5]; void vectorMultiply (int *, int *, int *); int main(void) { int temp1, temp2; // Save original EDS page values temp1 = DSRPAG; temp2 = DSWPAG; DSRPAG = __builtin_edspage (m1); DSWPAG = __builtin_edspage (sum1); vectorMultiply ((int *) m1, x, (int *) sum1); 3 Data Memory DSRPAG = __builtin_edspage (m2); DSWPAG = __builtin_edspage (sum2); vectorMultiply ((int *) m2, x, (int *) sum2); // Restore original EDS page values DSRPAG = temp1; DSWPAG = temp2; vectorMultiply ((int *) m, x, (int *) sum); while(1); } void vectorMultiply (int *m, int *x, int *sum) { int i; for (i = 0; i < 5; i ++) (*sum++) = (*m++) * (*x++); } © 2009-2011 Microchip Technology Inc. DS70595C-page 3-7 dsPIC33E/PIC24E Family Reference Manual Example 3-3: EDS Code Example in Assembly .section .data, eds .global fib_data .global fib_sum fib_data: .word 0, 1, 2, 3, 5, 8, 13 fib_sum: .space 2 ; Start of code section .text .global _main _main: ; Set DSRPAG to the page that contains the “fib_data” array MOVPAG #edspage(fib_data), DSRPAG ; Set DSWPAG to the page that contains the “fib_sum” array MOVPAG #edspage(fib_sum), DSWPAG ; Set up W0 as a pointer to “fib_data” MOV #edsoffset(fib_data), W0 ; Set up W1 as a pointer to “fib_sum” MOV #edsoffset(fib_sum), W1 ; Clear register W2 as it will contain a running sum CLR W2 ; Add all the data values in register W2 REPEAT #6 ADD W2, [W0++], W2 ; Store the final result in variable “fib_sum” MOV W2, [W1] done: BRA done RETURN When an EDS or PSV page overflow or underflow occurs, the register indirect EA calculation results in clearing EA<15>. An overflow or underflow of the EA in the EDS or PSV pages can occur at the page boundaries when: • the initial address, prior to modification, addresses an EDS or PSV page • the EA calculation uses pre- or post-modified register indirect addressing. However, this does not include register offset addressing. In general, when an overflow is detected, the DSxPAG register is incremented, and the resultant EA<15> bit is set to keep the base address within the EDS or PSV window. When an underflow is detected, the DSxPAG register is decremented, and the EA<15> bit is set to keep the base address within the EDS or PSV window. This creates a linear EDS and PSV address space, but only when using register indirect addressing modes. Exceptions to the operation described above arise when entering and exiting the boundaries of page 0, EDS and PSV spaces. Table 3-1 shows the effects of overflow and underflow scenarios at different boundaries. In the following cases, when overflow or underflow occurs, the EA<15> bit is set and the DSxPAG is not modified; therefore, the EA will wrap to the beginning of the current page: • • • • DS70595C-page 3-8 Register indirect with register offset addressing Modulo addressing Bit-reversed addressing The table address used in any TBLRDx or TBLWTx operations (source address in TBLRDx and the destination address in TBLWTx) © 2009-2011 Microchip Technology Inc. Section 3. Data Memory Table 3-1: Overflow and Underflow Scenarios at Page 0, EDS and PSV Space Boundaries O/U, Operation R/W Before DSxPAG DS EA<15> After Page Description DSxPAG DS EA<15> Page Description O, DSRPAG = 0x1FF 1 EDS: Last page DSRPAG = 0x1FF 0 See Note 1 Read O, DSRPAG = 0x2FF 1 PSV: Last lsw DSRPAG = 0x300 1 PSV: First MSB [++Wn] Read page page or O, DSRPAG = 0x3FF 1 PSV: Last MSB DSRPAG = 0x3FF 0 See Note 1 [Wn++] Read page O, DSWPAG = 0x1FF 1 EDS: Last page DSWPAG = 0x1FF 0 See Note 1 Write U, DSRPAG = 0x001 1 EDS page DSRPAG = 0x001 0 See Note 1 Read [--Wn] U, DSRPAG = 0x200 1 PSV: First lsw DSRPAG = 0x200 0 See Note 1 or Read page [Wn--] U, DSRPAG = 0x300 1 PSV: First MSB DSRPAG = 0x2FF 1 PSV: Last lsw Read page page Legend: O = Overflow, U = Underflow, R = Read, W = Write Note 1: The register indirect address now addresses a location in the base data space (0x0000-0x8000). 2: An EDS access with DSxPAG = 0x000 will generate an address error trap. 3: Only reads from PS are supported using DSRPAG. An attempt to write to PS using DSWPAG will generate an address error trap. 4: Pseudo-linear addressing is not supported for large offsets. Extended X Data Space The lower half of the base address space range between 0x0000 and 0x7FFF is always accessible regardless of the contents of the data space page registers. It is indirectly addressable through the register indirect instructions. It can be regarded as being located in the default EDS page 0 (i.e., EDS address range of 0x000000 to 0x007FFF with the base address bit EA<15> = 0 for this address range). However, page 0 cannot be accessed through upper 32 Kbytes, 0x8000 to 0xFFFF, of base data space in combination with DSRPAG = 0x00 or DSWPAG = 0x00. Consequently, DSRPAG and DSWPAG are initialized to 0x001 at Reset. Note 1: DSxPAG should not be used to access page 0. An EDS access with DSxPAG set to 0x000 will generate an Address Error trap. 2: Clearing the DSxPAG in software has no effect. The remaining pages including both EDS and PSV pages are only accessible using the DSRPAG or DSWPAG registers in combination with the upper 32 Kbytes, 0x8000 to 0xFFFF, of the base address, where base address bit EA<15> = 1. For example, when DSRPAG = 0x01 or DSWPAG = 0x01, accesses to the upper 32 Kbytes, 0x8000 to 0xFFFF, of the data space will map to the EDS address range of 0x008000 to 0x00FFFF. When DSRPAG = 0x02 or DSWPAG = 0x02, accesses to the upper 32 Kbytes of the data space will map to the EDS address range of 0x010000 to 0x017FFF and so on, as shown in the EDS memory map in Figure 3-5. 3.2.4 EDS Arbitration and Bus Master Priority EDS accesses from bus masters in the system are arbitrated. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-9 Data Memory 3.2.3 3 dsPIC33E/PIC24E Family Reference Manual The arbiter for data memory (including EDS) arbitrates between the CPU, the DMA, and up to three other bus masters, one of which will be the ICD module. In the event of coincidental access to a bus by the bus masters, the arbiter determines which bus master access has the highest priority. The other bus masters are suspended and processed after the access of the bus by the bus master with the highest priority. Note: DMA accesses to DPSRAM are not subject to arbitration, and occur without any stalls. By default, the CPU is bus master 0 (M0) with the highest priority, and the ICD is bus master 4 (M4) with the lowest priority. The remaining bus masters (USB and DMA Controllers) are allocated to M2 and M3, respectively (in this default configuration, M1 is reserved and cannot be used). The user application may raise or lower the priority of the masters to be above that of the CPU by setting the appropriate bits in the EDS Bus Master Priority Control (MSTRPR) register. All bus masters with raised priorities will maintain the same priority relationship relative to each other (i.e., M1 being highest and M3 being lowest with M2 in between). Also, all the bus masters with priorities below that of the CPU maintain the same priority relationship relative to each other. The priority schemes for bus masters with different MSTRPR values are tabulated in Table 3-2. This bus master priority control allows the user application to manipulate the real-time response of the system, either statically during initialization, or dynamically in response to real-time events. Figure 3-6: Arbiter Architecture DPSRAM ICD USB DMA CPU Reserved MSTRPR<15:0> M0 M1 M2 M3 M4 EDS Arbiter SRAM Table 3-2: Priority MSTRPR<15:0> Bit Setting 0x0000 0x0008 0x0020 0x0028 M0 (highest) CPU USB DMA USB M1 Reserved CPU CPU DMA M2 USB Reserved Reserved CPU M3 DMA DMA USB Reserved M4 (lowest) ICD ICD ICD ICD Note: DS70595C-page 3-10 EDS Bus Arbiter Priority All other values of MSTRPR<15:0> are reserved. © 2009-2011 Microchip Technology Inc. Section 3. Data Memory 3.3 DATA SPACE ADDRESS GENERATION UNITS (AGUs) The dsPIC33E/PIC24E contains an X AGU and a Y AGU for generating data memory addresses. Both X and Y AGUs can generate any Effective Address (EA) within the available data memory range. However, EAs that are outside the physical memory provided return all zeros for data reads and data writes to those locations, have no effect. Furthermore, an address error trap will be generated. For more information on address error traps, refer to Section 6. “Interrupts” (DS70602). 3.3.1 X Address Generation Unit The X AGU is used by all instructions and supports all addressing modes. The X AGU consists of a read AGU (X RAGU) and a write AGU (X WAGU), which operate independently on separate read and write buses during different phases of the instruction cycle. The X read data bus is the return data path for all instructions that view data space as combined X and Y address space. It is also the X address space data path for the dual operand read instructions (DSP instruction class). The X write data bus is the only write path to the combined X and Y data space for all instructions. The X AGU supports pseudo-linear addressing through the base data space address range into all of the EDS and PSV address space. It can therefore generate EAs within the range 0x000000 to 0xFFFFFF. The X RAGU starts its effective address calculation during the prior instruction cycle, using information derived from the just pre-fetched instruction. The X RAGU EA is presented to the address bus at the beginning of the instruction cycle. The X WAGU starts its effective address calculation at the beginning of the instruction cycle. The EA is presented to the address bus during the write phase of the instruction. Bit-reversed addressing is supported by the X WAGU only. 3.3.2 Y Address Generation Unit (dsPIC33E Devices Only) The Y data memory space has one AGU that supports data reads from the Y data memory space. The Y memory bus is never used for data writes. The function of the Y AGU and Y memory bus is to support concurrent data reads for DSP class instructions. The Y AGU can only generate an EA within the base data space address range 0x0000 to 0xFFFF and cannot extend into EDS. The Y AGU timing is identical to that of the X RAGU, in that its effective address calculation starts prior to the instruction cycle, using information derived from the pre-fetched instruction. The EA is presented to the address bus at the beginning of the instruction cycle. The Y AGU supports Modulo Addressing and Post-modification Addressing modes for the DSP class of instructions that use it. Note: The Y AGU does not support data writes. All data writes occur via the X WAGU to the combined X and Y data spaces. The Y AGU is only used during data reads for dual source operand DSP instructions. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-11 Data Memory Both the X RAGU and the X WAGU support modulo addressing. 3 dsPIC33E/PIC24E Family Reference Manual 3.3.3 Address Generation Units and DSP Class Instructions (dsPIC33E Devices Only) The Y AGU and Y memory data path are used in concert with the X RAGU by the DSP class of instructions to provide two concurrent data read paths. For example, the MAC instruction can simultaneously pre-fetch two operands to be used in the next multiplication. The DSP class of instructions dedicates two W register pointers, W8 and W9, to always operate through the X RAGU and address X data space independently from Y data space, plus two W register pointers, W10 and W11, to always operate through the Y AGU and address Y data space independently from X data space. Any data write performed by a DSP class instruction takes place in the combined X and Y data space and the write occurs across the X-bus. Consequently, the write can be to any address regardless of where the EA is directed. The Y AGU only supports Post-modification Addressing modes associated with the DSP class of instructions. For more information on Addressing modes, please refer to the “16-bit MCU and DSC Programmer’s Reference Manual” (DS70157). The Y AGU also supports modulo addressing for automated circular buffers. All other (MCU) class instructions can access the Y data address space through the X AGU when it is regarded as part of the composite linear space. 3.3.4 Data Alignment The ISA supports both word and byte operations for all MCU instructions that access data through the X memory AGU. The Least Significant bit (LSb) of a 16-bit data address is ignored for word operations. Word data is aligned in the little-endian format with the Least Significant Byte (LSB) at the even address (LSb = 0) and the Most Significant Byte (MSB) at the odd address (LSb = 1). For byte operations, the LSb of the data address is used to select the byte that is accessed. The addressed byte is placed on the lower 8 bits of the internal data bus. All effective address calculations are automatically adjusted depending on whether a byte or a word access is performed. For example, an address is incremented by 2 for a word operation that post-increments the address pointer. Note: Figure 3-7: All word accesses must be aligned to an even address (LSb = 0). Misaligned word data fetches are not supported, so care must be taken when mixing byte and word operations or translating code from existing 8-bit PIC® microcontrollers. Should a misaligned word read or write be attempted, an address error trap will occur. A misaligned read data will be discarded and a misaligned write will not take place. The trap will then be taken, allowing the system to examine the machine state prior to execution of the address Fault. Data Alignment 15 DS70595C-page 3-12 MSB 8 7 LSB 0 0001 Byte 1 Byte 0 0000 0003 Byte 3 Byte 2 0002 0005 Byte 5 Byte 4 0004 Word 0 0006 Word 1 0008 Long Word<15:0> 000A Long Word<31:16> 000C © 2009-2011 Microchip Technology Inc. Section 3. Data Memory 3.4 MODULO ADDRESSING (dsPIC33E DEVICES ONLY) Modulo, or circular addressing provides an automated means to support circular data buffers using hardware. The objective is to remove the need for software to perform data address boundary checks when executing tightly looped code as is typical in many DSP algorithms. Any W register, except W15, can be selected as the pointer to the modulo buffer. The modulo hardware performs boundary checks on the address held in the selected W register and automatically adjusts the pointer value at the buffer boundaries, when required. dsPIC33E/PIC24E modulo addressing can operate in either data or program space (since the data pointer mechanism is essentially the same for both). One circular buffer can be supported in each of the X (which also provides the pointers into Program space) and Y data spaces. The modulo data buffer length can be any size up to 32K words. The modulo buffer logic supports buffers using word or byte-sized data. However, the modulo logic only performs address boundary checks at word address boundaries, so the length of a byte modulo buffer must be even. In addition, byte-sized modulo buffers cannot be implemented using the Y AGU because byte access is not supported via the Y memory data bus. 3.4.1 Modulo Start and End Address Selection Four address registers are available for specifying the modulo buffer start and end addresses: • • • • XMODSRT: X AGU Modulo Addressing Start Register XMODEND: X AGU Modulo Addressing End Register YMODSRT: Y AGU Modulo Addressing Start Register YMODEND: Y AGU Modulo Addressing End Register The start and end address selected for each modulo buffer have certain restrictions, depending on whether an incrementing or decrementing buffer is to be implemented. For an incrementing buffer, a W register pointer is incremented through the buffer address range. When the end address of the incrementing buffer is reached, the W register pointer is reset to point to the start of the buffer. For a decrementing buffer, a W register pointer is decremented through the buffer address range. When the start address of a decrementing buffer is reached, the W register pointer is reset to point to the end of the buffer. Note: 3.4.1.1 The user must decide whether an incrementing or decrementing modulo buffer is required for the application. Certain address restrictions depend on whether an incrementing or decrementing modulo buffer is to be implemented. MODULO START ADDRESS The data buffer start address is arbitrary, but must be at a ‘zero’ power of two boundary for incrementing modulo buffers. The modulo start address can be any value for decrementing modulo buffers and is calculated using the chosen buffer end address and buffer length. For example, if the buffer length for an incrementing buffer is chosen to be 50 words (100 bytes), then the buffer start byte address must contain 7 Least Significant zeros. Valid start addresses may, therefore, be 0xNN00 and 0xNN80, where ‘N’ is any hexadecimal value. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-13 3 Data Memory The start address for a modulo buffer must be located at an even byte address boundary. The LSb of the XMODSRT and YMODSRT registers is fixed at ‘0’ to ensure the correct modulo start address. The end address for a modulo buffer must be located at an odd byte address boundary. The LSb of the XMODEND and YMODEND registers is fixed to ‘1’ to ensure the correct modulo end address. dsPIC33E/PIC24E Family Reference Manual 3.4.1.2 MODULO END ADDRESS The data buffer end address is arbitrary but must be at a ‘ones’ boundary for decrementing buffers. The modulo end address can be any value for an incrementing buffer and is calculated using the chosen buffer start address and buffer length. For example, if the buffer size (modulus value) is chosen to be 50 words (100 bytes), the buffer end byte address for decrementing modulo buffer must contain 7 Least Significant ones. Valid end addresses can, therefore, be 0xNNFF and 0xNN7F, where ‘N’ is any hexadecimal value. Note: 3.4.1.3 If the required modulo buffer length is an even power of 2, the modulo start and end addresses that are chosen must satisfy the requirements for incrementing and decrementing buffers. MODULO ADDRESS CALCULATION The end address for an incrementing modulo buffer must be calculated from the chosen start address and the chosen buffer length in bytes. Equation 3-1 can be used to calculate the end address. Equation 3-1: Modulo End Address for Incrementing Buffer End Address = Start Address + Buffer Length – 1 The start address for a decrementing modulo buffer is calculated from the chosen end address and the buffer length, as shown in Equation 3-2. Equation 3-2: Modulo Start Address for Decrementing Buffer Start Address = End Address – Buffer Length + 1 3.4.1.4 DATA DEPENDENCIES ASSOCIATED WITH MODULO ADDRESSING SFRs A write operation to the Modulo and Bit-Reversed Addressing Control (MODCON) register, should not be immediately followed by an indirect read operation using any W register. The code segment shown in Example 3-4 will thus lead to unexpected results. Note 1: Using a POP instruction to pop the contents of the top-of-stack (TOS) location into the MODCON register, also constitutes a write to MODCON register. The instruction immediately following a write to MODCON cannot be any instruction performing an indirect read operation. 2: Some instructions perform an indirect read operation, implicitly. These are: POP, RETURN, RETFIE, RETLW and ULNK. Example 3-4: Incorrect MODCON Initialization MOV #0x8FF4, w0 MOV w0, MODCON MOV [w1], w2 ;Initialize MODCON ;Incorrect EA generated here Instead, use any Addressing mode other than indirect reads in the instruction that immediately follows the initialization of MODCON. Alternately, add a NOP instructions after initializing the MODCON register, as shown in Example 3-5. Example 3-5: Correct MODCON Initialization MOV #0x8FF4, w0 MOV w0, MODCON NOP MOV [w1], w2 Note: DS70595C-page 3-14 ;Initialize MODCON ;See Note below ;Correct EA generated here Alternately, execute other instructions that do not perform indirect read operations, using the W register designated for modulo buffer access. © 2009-2011 Microchip Technology Inc. Section 3. Data Memory An additional condition exists for indirect read operations performed immediately after writing to the modulo address SFRs: • • • • XMODSRT: X AGU Modulo Addressing Start Register XMODEND: X AGU Modulo Addressing End Register YMODSRT: Y AGU Modulo Addressing Start Register YMODEND: Y AGU Modulo Addressing End Register If modulo addressing has already been enabled in MODCON, then a write to the X (or Y) modulo address SFRs should not be immediately followed by an indirect read, using the W register designated for modulo buffer access from X-data space (or Y-data space). The code segment in Example 3-6 shows how initializing the modulo SFRs associated with the X-data space, could lead to unexpected results. A similar example can be made for initialization in Y-data space. Example 3-6: Incorrect Modulo Addressing Setup MOV #0x8FF4,w0 MOV w0, MODCON MOV MOV MOV MOV MOV #0x1200,w4 w4, XMODSRT #0x12FF,w0 w0, XMODEND [w4++], w5 ;Modulo addressing enabled ;in X-data space using w4 ;for buffer access ;XMODSRT is initialized ;XMODEND is initialized ;Incorrect EA generated To avoid this condition, insert a NOP, or perform any operation other than an indirect read that uses the W register designated for modulo buffer access, after initializing the modulo address SFRs. This is demonstrated in Example 3-7. Another alternative would be to enable modulo addressing in MODCON after initializing the modulo start and end address SFRs. Correct Modulo Addressing Setup MOV #0x8FF4,w0 MOV w0, MODCON MOV MOV MOV MOV NOP MOV Note: 3.4.2 Data Memory Example 3-7: #0x1200,w4 w4, XMODSRT #0x12FF,w0 w0, XMODEND [w4++], w5 ;Modulo addressing enabled ;in X-data space using w4 ;for buffer access ;XMODSRT is initialized ;XMODEND is initialized ;See Note below ;Correct EA generated here Alternately, execute other instructions that do not perform indirect read operations, using the W register designated for modulo buffer access. W Address Register Selection The X address space pointer W register to which modulo addressing is to be applied, is stored in the XWM bits of the Modulo and Bit-Reversed Addressing Control register (MODCON<3:0>). The XMODSRT, XMODEND and the XWM register selection are shared between the X RAGU and X WAGU. Modulo addressing is enabled for X data space when XWM<3:0> is set to any value other than 15 and the XMODEN bit (MODCON<15>) is set. W15 cannot be used as the pointer for modulo addressing because it is the dedicated software stack pointer. The Y address space pointer W register to which modulo addressing is to be applied, is stored in the YWM bits in the Modulo and Bit-Reversed Addressing Control register (MODCON<7:4>). Modulo addressing is enabled for Y data space when YWM<3:0> is set to any value other than 15 and the YMODEN bit (MODCON<14>) is set. Note: A write to the MODCON register should not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. © 2009-2011 Microchip Technology Inc. 3 DS70595C-page 3-15 dsPIC33E/PIC24E Family Reference Manual 3.4.3 Modulo Addressing Applicability Modulo addressing can be applied to the effective address calculation associated with the selected W register. It is important to realize that the address boundary tests look for addresses equal to or greater than the upper address boundary for incrementing buffers and equal to or less than the lower address boundary for decrementing buffers. Address changes can, therefore, jump over boundaries and still be adjusted correctly. The automatic adjustment of the W register pointer by the modulo hardware is unidirectional. That is, the W register pointer may not be adjusted correctly by the modulo hardware when the W register pointer for an incrementing buffer is decremented and vice versa. The exception to this rule is when the buffer length is an even power of 2 and the start and end addresses can be chosen to meet the boundary requirements for both incrementing and decrementing modulo buffers. A new EA can exceed the modulo buffer boundary by up to the length of the buffer and still be successfully corrected. This is important to remember when the Register Indexed ([Wb + Wn]) and Literal Offset ([Wn + lit10]) Addressing modes are used. In addition, the Register Indexed and Literal Offset Addressing modes do not change the value held in the W register. Only the indirect with Pre- and Post-modification Addressing modes ([Wn++], [Wn--], [++Wn], [--Wn]) will modify the W register address value. Modulo addressing operates within any EDS or PSV memory space. However, it will not operate across page boundaries. The only exception to this rule is when crossing a boundary into or out of page 0. 3.4.4 Modulo Addressing Initialization for Incrementing Modulo Buffer The following steps describe the setup procedure for an incrementing circular buffer. The steps are similar whether the X AGU or Y AGU is used. 1. 2. 3. 4. 5. 6. 7. 8. 9. Determine the buffer length in 16-bit data words. Multiply this value by 2 to get the length of the buffer in bytes. Select a buffer starting address that is located at a binary ‘zeros’ boundary based on the desired length of the buffer. Remember that the buffer length in words must be multiplied by 2 to obtain the byte address range. For example, a buffer with a length of 100 words (200 bytes) could use 0xXX00 as the starting address. Calculate the buffer end address using the buffer length chosen in Step 1 and the buffer start address chosen in Step 2. The buffer end address is calculated using Equation 3-1. Load DSxPAG with the appropriate page value. Load the XMODSRT or YMODSRT register with the buffer start address chosen in step 2. Load the XMODEND or YMODEND register with the buffer end address calculated in step 3. Write to the XWM bit (MODCON<3:0>) or the YWM bits (MODCON<7:4>) to select the W register that will be used to access the circular buffer. Set the XMODEN bit (MODCON<15>) or the YMODEN bit (MODCON<14>) to enable the circular buffer. Load the selected W register with an address that points to the buffer. The W register address will be adjusted automatically at the end of the buffer when an indirect access with pre/post increment is performed (see Figure 3-8). Note: The start address of an incrementing buffer can be suitably aligned to a binary 0’s boundary using the aligned (alignment) attribute provided by the MPLAB® C30 compiler, as follows: int x __attribute__((aligned(256))); DS70595C-page 3-16 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory Figure 3-8: Incrementing Buffer Modulo Addressing Operation Example Byte Address MOVPAG MOVPAG MOV MOV MOV MOV MOV MOV MOV MOV REPEAT MOV 0x1100 0x1163 #0x001,DSWPAG #0x001,DSRPAG #0x1100,W0 W0,XMODSRT #0x1163,W0 W0,XMODEND #0x8001,W0 W0,MODCON #0x0000,W0 #0x1100,W1 #49 W0,[W1++] ;set modulo start address ;set modulo end address ;enable W1, X AGU for modulo ;W0 holds buffer fill value ;point W1 to buffer ;fill the 50 buffer locations ;fill the next location ;W1 = 0x1100 when DO loop completes Start Addr = 0x9100 End Addr = 0x9163 Length = 50 Words The DSRPAG value can be different from that of DSWPAG. Refer to 3.2.2 “Paged Memory Scheme” for details. 3.4.5 Modulo Addressing Initialization for Decrementing Modulo Buffer The following steps describe the setup procedure for a decrementing circular buffer. The steps are similar whether the X AGU or Y AGU is used. 1. 2. 3. 4. 5. 6. 7. 8. 9. Determine the buffer length in 16-bit data words. Multiply this value by 2 to get the length of the buffer in bytes. Select a buffer end address that is located at a binary ‘ones’ boundary, based on the desired length of the buffer. Remember that the buffer length in words must be multiplied by 2 to obtain the byte address range. For example, a buffer with a length of 128 words (256 bytes) could use 0xXXFF as the end address. Calculate the buffer start address using the buffer length chosen in step 1 and the end address chosen in step 2. The buffer start address is calculated using Equation 3-2. Load DSxPAG with the appropriate page value. Load the XMODSRT or YMODSRT register with the buffer start address chosen in step 3. Load the XMODEND or YMODEND register with the buffer end address chosen in step 2. Write to the XWM bit (MODCON<3:0>) or the YWM bits (MODCON<7:4>) to select the W register that will be used to access the circular buffer. Set the XMODEN bit (MODCON<15>) or the YMODEN bit (MODCON<14>) to enable the circular buffer. Load the selected W register with an address that points to the buffer. The W register address will be adjusted automatically at the end of the buffer when an indirect access with pre/post-decrement is performed (see Figure 3-9). © 2009-2011 Microchip Technology Inc. DS70595C-page 3-17 Data Memory Note: 3 dsPIC33E/PIC24E Family Reference Manual Figure 3-9: Decrementing Buffer Modulo Addressing Operation Example Byte Address 0x11E0 0x11FF MOVPAG MOVPAG MOV MOV MOV MOV MOV MOV MOV MOV DO MOV #0x001,DSWPAG #0x001,DSRPAG #0x11E0,W0 W0,XMODSRT #0x11FF,W0 W0,XMODEND #0x8001,W0 W0,MODCON #0x000F,W0 #0x11FE,W1 #15,FILL W0,[W1--] FILL: DEC W0,W0 ;set modulo start address ;set modulo end address ;enable W1, X AGU for modulo ;W0 holds buffer fill value ;point W1 to buffer ;fill the 16 buffer locations ;fill the next location ;decrement the fill value ; W1 = 0x11FE when DO loop completes Start Addr = 0x91E0 End Addr = 0x91FF Length = 16 Words Note: The DSRPAG value can be different from that of DSWPAG. Refer to 3.2.2 “Paged Memory Scheme” for details. DS70595C-page 3-18 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory 3.5 BIT-REVERSED ADDRESSING (dsPIC33E DEVICES ONLY) 3.5.1 Introduction to Bit-Reversed Addressing Bit-reversed addressing is a special addressing mode that supports fast data reordering for radix-2 FFT algorithms. It is supported through the X WAGU only. Bit-reversed addressing is accomplished by effectively creating a mirror image of an address pointer by swapping the bit locations around the center point of the binary value, as shown in Figure 3-10. An example bit-reversed sequence for a 4-bit address field is shown in Table 3-3. Figure 3-10: Bit-Reversed Address Example b3 b2 b1 b0 Bit locations swapped left-to-right around center of binary value b0 b1 b2 b3 Bit-Reversed Result Table 3-3: Bit-Reversed Address Sequence (16-Entry) Normal Address A3 A2 A1 A0 Bit-Reversed Address Decimal A3 A2 A1 A0 Decimal 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 8 0 0 1 0 2 0 1 0 0 4 0 0 1 1 3 1 1 0 0 12 0 1 0 0 4 0 0 1 0 2 0 1 0 1 5 1 0 1 0 10 0 1 1 0 6 0 1 1 0 6 0 1 1 1 7 1 1 1 0 14 1 0 0 0 8 0 0 0 1 1 1 0 0 1 9 1 0 0 1 9 1 0 1 0 10 0 1 0 1 5 1 0 1 1 11 1 1 0 1 13 1 1 0 0 12 0 0 1 1 3 1 1 0 1 13 1 0 1 1 11 1 1 1 0 14 0 1 1 1 7 1 1 1 1 15 1 1 1 1 15 © 2009-2011 Microchip Technology Inc. DS70595C-page 3-19 Data Memory 0 0 3 dsPIC33E/PIC24E Family Reference Manual 3.5.2 Bit-Reversed Addressing Operation Bit-reversed addressing is supported only by the X WAGU and is controlled by the MODCON and X Write AGU Bit-Reversal Addressing Control (XBREV) SFRs. Bit-reversed addressing is invoked as follows: 1. 2. 3. Bit-reversed addressing is assigned to one of the W registers using the BWM control bits (MODCON<11:8>). Bit-reversed addressing is enabled by setting the BREN control bit (XBREV<15>). The X AGU bit-reverse modifier is set via the XB control bits (XBREV<14:0>). When enabled, the bit-reversed addressing hardware will generate bit-reversed addresses, only when the register indirect with Pre- or Post-increment Addressing modes are used ([Wn++], [++Wn]). Furthermore, bit-reverse addresses are only generated for Word mode instructions. It will not function for all other Addressing modes or Byte mode instructions (normal addresses will be generated). Note 1: A write to the MODCON register must not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. 2: If bit-reversed addressing has already been enabled by setting the BREN bit (XBREV<15>), a write to the XBREV register must not be followed by an indirect read operation using the W register, designated as the bit-reversed address pointer. Bit-reversed addressing operates within any EDS or PSV memory space. However, it will not operate across page boundaries. The only exception to this rule is when crossing a boundary into or out of page 0. 3.5.2.1 MODULO ADDRESSING AND BIT-REVERSED ADDRESSING Modulo addressing and bit-reversed addressing can be enabled simultaneously using the same W register, but bit-reversed addressing operation will always take precedence for data writes when enabled. As an example, the following setup conditions would assign the same W register to modulo and bit-reversed addressing: • • • • X modulo addressing is enabled (XMODEN = 1) Bit-reverse addressing is enabled (BREN = 1) W1 assigned to modulo addressing (XWM<3:0> = 0001) W1 assigned to bit-reversed addressing (BWM<3:0> = 0001) For data reads that use W1 as the pointer, modulo address boundary checking will occur. For data writes using W1 as the destination pointer, the bit-reverse hardware will correct W1 for data reordering. DS70595C-page 3-20 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory 3.5.3 Bit-Reverse Modifier Value The value loaded into the XBREV register is a constant that defines the size of the bit-reversed data buffer. The XB modifier values used with common bit-reversed buffers are summarized in Table 3-4. Table 3-4: Bit-Reversed Address Modifier Values Buffer Size (Words) Note: XB Bit-Reversed Address Modifier Value The bit-reverse addressing hardware modifies the W register address by performing a “reverse-carry” addition of the W contents and the XB modifier constant. A reverse-carry addition is performed by adding the bits from left-to-right instead of right-to-left. If a carry-out occurs in a bit location, the carry out bit is added to the next bit location to the right. Example 3-8 demonstrates the reverse-carry addition and subsequent W register values using 0x0008 as the XB modifier value. Note that the XB modifier is shifted one bit location to the left to generate word address values. Example 3-8: XB Address Calculation 0000 0000 0000 0000 +1 0000 0000 0000 0001 0000 +1 0000 0000 0000 0000 1000 +1 0000 0000 0000 0001 1000 +1 0000 0000 0000 0000 0100 +1 0000 0000 0000 0001 0100 © 2009-2011 Microchip Technology Inc. Wn points to word 0 Wn = Wn + XB Wn points to word 8 Wn = Wn + XB Wn points to word 4 Wn = Wn + XB Wn points to word 12 Wn = Wn + XB Wn points to word 2 Wn = Wn + XB Wn points to word 10 DS70595C-page 3-21 3 Data Memory 32768 0x4000 16384 0x2000 8192 0x1000 4096 0x0800 2048 0x0400 1024 0x0200 512 0x0100 256 0x0080 128 0x0040 64 0x0020 32 0x0010 16 0x0008 8 0x0004 4 0x0002 2 0x0001 Only the bit-reversed modifier values shown will produce valid bit-reversed address sequences. dsPIC33E/PIC24E Family Reference Manual When XB<14:0> = 0x0008, the bit-reversed buffer size will be 16 words. Bits 1-4 of the W register will be subject to bit-reversed address correction, but bits 5-15 (outside the pivot point) will not be modified by the bit-reverse hardware. Bit 0 is not modified because the bit-reverse hardware operates only on word addresses. The XB modifier controls the pivot point for the bit-reverse address modification. Bits outside of the pivot point will not be subject to bit-reversed address corrections. Figure 3-11: Bit-Reversed Address Modification for 16-Word Buffer 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 XB<14:0> = 0x0008 Bits 1-4 of address are modified 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Bit-Reversed Result Pivot Point 3.5.4 Bit-Reversed Addressing Code Example The code shown in Example 3-9 reads a series of 16 data words and writes the data to a new location in bit-reversed order. W0 is the read address pointer and W1 is the write address pointer subject to bit-reverse modification. Example 3-9: Bit-Reversed Addressing Code Example .section .data .global Input_Buf Input_Buf: .word 0x0000, 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888, 0x9999, 0xAAAA, 0xBBBB, 0xCCCC, 0xDDDD, 0xEEEE, 0xFFFF .section .bss .global Bit_Rev_Buf .align 32 Bit_Rev_Buf: .space 32 ; Start of code section .text .global _main _main: ; Set XBREV for 16-word buffer with bit-reversed addressing MOV #0x8008, W0 MOV W0, XBREV ; Set up W1 as a pointer for bit-reversed addressing MOV #0x01FF, W0 MOV W0, MODCON ; W0 points to sequential input data buffer MOV #Input_Buf, W0 ; W1 points to bit-reversed output data buffer MOV #Bit_Rev_Buf, W1 ; Re-order the data from Input_buf into Bit_Rev_Buf REPEAT #15 MOV [W0++], [W1++] done: BRA done RETURN DS70595C-page 3-22 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory 3.6 DMA RAM Some dsPIC33E/PIC24E devices contain DMA and dual-ported SRAM memory (DPSRAM). Only the DMA controller can write and read to/from addresses within the DPSRAM without arbitration and CPU stalls, resulting in maximized real-time performance. In addition, DMA can address all of data memory and EDS excluding SFR space. Access to data memory and EDS is arbitrated by the EDS arbiter, and therefore, may be subject to stalls. Note: The presence and size of DPSRAM is device specific. Refer to the specific dsPIC33E/PIC24E device data sheet for further details. Figure 3-6 shows a block diagram that demonstrates how the DMA integrates into the dsPIC33E/PIC24E internal architecture. The DMA channels communicate with Port 2 of the DPSRAM and the DMA port of each of the DMA-ready peripherals across a dedicated DMA bus. Refer to Section 22. “Direct Memory Access (DMA)” (DS70348) for more information. 3 Data Memory © 2009-2011 Microchip Technology Inc. DS70595C-page 3-23 dsPIC33E/PIC24E Family Reference Manual 3.7 CONTROL REGISTER DESCRIPTIONS The EDS Bus Master Priority Control register (MSTRPR) sets the access priority of the bus masters to the data memory. Register 3-1: MSTRPR: EDS Bus Master Priority Control Register R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 MSTRPR<15:8> bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 MSTRPR<7:0> bit 7 bit 0 Legend: r = Reserved R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared bit 15-0 Note 1: 2: 3: 4: x = Bit is unknown MSTRPR<15:0>: EDS Bus Master Priority bits Refer to 3.2.4 “EDS Arbitration and Bus Master Priority” for additional details. Default priority at reset is CPU (M0, highest), M1, M2, M3, ICD (M4, always lowest priority). All raised priority bus masters maintain the same priority relationship relative to each other: M1 (highest), M2, M3 (lowest). All bus masters whose priority remains below that of the CPU, maintain the same priority relationship relative to each other: M1 (highest), M2, M3 (lowest). The specific bus masters that are available varies depending on the device used. Refer to the specific device data sheet for further details. DS70595C-page 3-24 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory The following eight registers are used to control the data space page, modulo addressing and bit-reversed addressing. Register 3-2: DSRPAG: Data Space Read Page Register U-0 U-0 U-0 U-0 U-0 U-0 — — — — — — R/W-0 R/W-0 DSRPAG<9:8>(1) bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-1 DSRPAG<7:0>(1) bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared bit 15-10 Unimplemented: Read as ‘0’ bit 9-0 DSRPAG<9:0>: Data Space Read Page Pointer bits(1) Note 1: x = Bit is unknown Attempting to read from the paged DS window when DSRPAG = 0x000, will cause an address error trap. DSWPAG: Data Space Write Page Register U-0 U-0 U-0 U-0 U-0 U-0 U-0 R/W-0 — — — — — — — DSWPAG<8>(1) bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-1 DSWPAG<7:0>(1) bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared bit 15-9 Unimplemented: Read as ‘0’ bit 8-0 DSWPAG<8:0>: Data Space Write Page Pointer bits(1) Note 1: x = Bit is unknown Attempting to write from the paged DS window when DSWPAG = 0x000, will cause an address error trap. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-25 Data Memory Register 3-3: 3 dsPIC33E/PIC24E Family Reference Manual Register 3-4: MODCON: Modulo and Bit-Reversed Addressing Control Register R/W-0 R/W-0 U-0 U-0 XMODEN YMODEN — — R/W-0 R/W-0 R/W-0 R/W-0 BWM<3:0> bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 YWM<3:0> R/W-0 R/W-0 XWM<3:0> bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown bit 15 XMODEN: X RAGU and X WAGU Modulus Addressing Enable bit 1 = X AGU modulus addressing enabled 0 = X AGU modulus addressing disabled bit 14 YMODEN: Y AGU Modulus Addressing Enable bit 1 = Y AGU modulus addressing enabled 0 = Y AGU modulus addressing disabled bit 13-12 Unimplemented: Read as ‘0’ bit 11-8 BWM<3:0>: X WAGU Register Select for Bit-Reversed Addressing bits 1111 = Bit-reversed addressing disabled 1110 = W14 selected for bit-reversed addressing 1101 = W13 selected for bit-reversed addressing • • • 0000 = W0 selected for bit-reversed addressing bit 7-4 YWM<3:0>: Y AGU W Register Select for Modulo Addressing bits 1111 = Modulo addressing disabled 1010 = W10 selected for modulo addressing 1011 = W11 selected for modulo addressing All other settings of the YWM<3:0> control bits are reserved and should not be used. bit 3-0 Note: XWM<3:0>: X RAGU and X WAGU W Register Select for Modulo Addressing bits 1111 = Modulo addressing disabled 1110 = W14 selected for modulo addressing • • • 0000 = W0 selected for modulo addressing A write to the MODCON register should not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. DS70595C-page 3-26 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory Register 3-5: XMODSRT: X AGU Modulo Addressing Start Register R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 XS<15:8> bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 XS<7:1> 0 bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown bit 15-1 XS<15:1>: X RAGU and X WAGU Modulo Addressing Start Address bits bit 0 Unimplemented: Read as ‘0’ Note: A write to the XMODSRT register should not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. XMODEND: X AGU Modulo Addressing End Register R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 XE<15:8> bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 XE<7:1> U-1 1 bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared bit 15-1 XE<15:1>: X RAGU and X WAGU Modulo Addressing End Address bits bit 0 Unimplemented: Read as ‘1’ Note: x = Bit is unknown A write to the XMODEND register should not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-27 Data Memory Register 3-6: 3 dsPIC33E/PIC24E Family Reference Manual Register 3-7: YMODSRT: Y AGU Modulo Addressing Start Register R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 YS<15:8> bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 YS<7:1> 0 bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared bit 15-1 YS<15:1>: Y AGU Modulo Addressing Start Address bits bit 0 Unimplemented: Read as ‘0’ Note: x = Bit is unknown A write to the YMODSRT register should not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. Register 3-8: YMODEND: Y AGU Modulo Addressing End Register R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 YE<15:8> bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 YE<7:1> U-1 1 bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared bit 15-1 YE<15:1>: Y AGU Modulo Addressing End Address bits bit 0 Unimplemented: Read as ‘1’ Note: x = Bit is unknown A write to the YMODEND register should not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. DS70595C-page 3-28 © 2009-2011 Microchip Technology Inc. Section 3. Data Memory Register 3-9: XBREV: X Write AGU Bit-Reversal Addressing Control Register R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 BREN R/W-0 R/W-0 R/W-0 XB<14:8> bit 15 bit 8 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 XB<7:0> bit 7 bit 0 Legend: R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’ -n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared BREN: Bit-Reversed Addressing (X AGU only) Enable bit 1 = Bit-reversed addressing enabled 0 = Bit-reversed addressing disabled bit 14-0 XB<14:0>: X AGU Bit-Reversed Modifier bits 0x4000 = 32768 word buffer 0x2000 = 16384 word buffer 0x1000 = 8192 word buffer 0x0800 = 4096 word buffer 0x0400 = 2048 word buffer 0x0200 = 1024 word buffer 0x0100 = 512 word buffer 0x0080 = 256 word buffer 0x0040 = 128 word buffer 0x0020 = 64 word buffer 0x0010 = 32 word buffer 0x0008 = 16 word buffer 0x0004 = 8 word buffer 0x0002 = 4 word buffer 0x0001 = 2 word buffer Note: 3 Data Memory bit 15 x = Bit is unknown If the BREN bit is set, a write to the XB<14:0> bits should not be followed by an instruction that performs an indirect read operation using a W register. Unexpected results may occur. Some instructions perform an implicit indirect read. These are: POP, RETURN, RETFIE, RETLW and ULNK. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-29 REGISTER MAPS A summary of the registers associated with the dsPIC33E/PIC24E Data Memory module is provided in Table 3-5. Table 3-5: File Name Data Memory Control Register Map Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 DSRPAG — — — — — — DSWPAG — — — — — — — — — BMW3 BWM2 BWM1 BWM0 YWM3 YWM2 YWM1 YWM0 XWM3 XWM2 XWM1 XWM0 0000 MODCON XMODEN YMODEN Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 All Resets Bit 15 DSRPAG<9:0> 0001 DSWPAG<8:0> 0001 XMODSRT XS15 XS14 XS13 XS12 XS11 XS10 XS9 XS8 XS7 XS6 XS5 XS4 XS3 XS2 XS1 — xxxx XMODEND XE15 XE14 XE13 XE12 XE11 XE10 XE9 XE8 XE7 XE6 XE5 XE4 XE3 XE2 XE1 — xxxx YMODSRT YS15 YS14 YS13 YS12 YS11 YS10 YS9 YS8 YS7 YS6 YS5 YS4 YS3 YS2 YS1 — xxxx YMODEND YE15 YE14 YE13 YE12 YE11 YE10 YE9 YE8 YE7 YE6 YE5 YE4 YE3 YE2 YE1 — xxxx XBREV BREN XB14 XB13 XB12 XB11 XB10 XB9 XB8 XB7 XB6 XB5 XB4 XB3 XB2 XB1 XB0 0000 MSTRPR Legend: MSTRPR<15:0> x = unknown value on Reset, — = unimplemented, read as ‘0’. Reset values are shown in hexadecimal. 0000 © 2009-2011 Microchip Technology Inc. dsPIC33E/PIC24E Family Reference Manual DS70595C-page 3-30 3.8 Section 3. Data Memory 3.9 RELATED APPLICATION NOTES This section lists application notes that are related to this section of the manual. These application notes may not be written specifically for the dsPIC33E/PIC24E product family, but the concepts are pertinent and could be used with modification and possible limitations. The current application notes related to the Data Memory module are: Title Application Note # No related application notes at this time. Note: N/A Please visit the Microchip web site (www.microchip.com) for additional Application Notes and code examples for the dsPIC33E/PIC24E family of devices. 3 Data Memory © 2009-2011 Microchip Technology Inc. DS70595C-page 3-31 dsPIC33E/PIC24E Family Reference Manual 3.10 REVISION HISTORY Revision A (June 2009) This is the initial released version of this document. Revision B (August 2010) This revision includes the following updates: • Minor changes to text and formatting have been incorporated throughout the document • The Preliminary document status has been removed • The following sections pertain to dsPIC33E devices only: - 3.4 “Modulo Addressing (dsPIC33E Devices Only)” - 3.5 “Bit-Reversed Addressing (dsPIC33E Devices Only)” • All references to DMA RAM (with the exception of the section with the same name) have been changed to: DPSRAM • Note 2 was removed from the Example Data Memory Map (see Figure 3-1) • Added new examples on managing EDS access (see Example 3-1, Example 3-2, and Example 3-3) • The fourth paragraph in 3.2.2 “Paged Memory Scheme” has been updated and converted to a shaded note • The Paged Data Memory Space (Figure 3-5) has been replaced with the EDS Memory Map (formerly Figure 3-6) • The Pseudo-Linear Addressing Truth Table (Table 3-1) has been replaced with an entirely new table named Overflow and Underflow Scenarios at Page 0, EDS and PSV Space Boundaries • 3.2.4 “EDS Arbitration and Bus Master Priority” has been updated in its entirety • A shaded note referencing the aligned (alignment) attribute was added to 3.4.4 “Modulo Addressing Initialization for Incrementing Modulo Buffer” • The first two instructions and the Start and End Addr values in Figure 3-8 and Figure 3-9 have been changed • The paragraph in 3.5.2.2 DATA DEPENDENCIES ASSOCIATED WITH XBREV has been moved to Note 2 in the shaded note in 3.5.2 “Bit-Reversed Addressing Operation” • The Bit-Reversed Addressing Code Example (Example 3-9) has been updated in its entirety • The EDS Bus Mater Priority Control Register has been updated (see Register 3-1) • The notes in the Data Space Read Page (DSRPAG) and Data Space Write Page (DSWPAG) registers have been changed (see Register 3-2 and Register 3-3) • A note regarding writes to a register have been added to the following registers: - XMODSRT: X AGU Modulo Addressing Start Register (see Register 3-5) - XMODEND: X AGU Modulo Addressing End Register (see Register 3-6) - YMODSRT: Y AGU Modulo Addressing Start Register (see Register 3-7) - YMODEND: Y AGU Modulo Addressing End Register (see Register 3-8) - XBREV: X Write AGU Bit-Reversal Addressing Control Register (see Register 3-9) • The MSTRPR register has been updated in the Data Memory Control Register Map (see Table 3-5) Revision C (June 2011) This revision includes the following updates: • Updated the EDS Access code examples (see Example 3-1 and Example 3-2) • Changes to formatting and minor text updates were incorporated throughout the document DS70595C-page 3-32 © 2009-2011 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, dsPIC, KEELOQ, KEELOQ logo, MPLAB, PIC, PICmicro, PICSTART, PIC32 logo, rfPIC and UNI/O are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries. FilterLab, Hampshire, HI-TECH C, Linear Active Thermistor, MXDEV, MXLAB, SEEVAL 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, chipKIT, chipKIT logo, CodeGuard, dsPICDEM, dsPICDEM.net, dsPICworks, dsSPEAK, ECAN, ECONOMONITOR, FanSense, HI-TIDE, In-Circuit Serial Programming, ICSP, Mindi, MiWi, MPASM, MPLAB Certified logo, MPLIB, MPLINK, mTouch, Omniscient Code Generation, PICC, PICC-18, PICDEM, PICDEM.net, PICkit, PICtail, REAL ICE, rfLAB, Select Mode, Total Endurance, TSHARC, UniWinDriver, 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. © 2009-2011, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved. Printed on recycled paper. ISBN: 978-1-61341-306-7 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® MCUs and dsPIC® DSCs, KEELOQ® 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. © 2009-2011 Microchip Technology Inc. DS70595C-page 3-33 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://www.microchip.com/ support 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-3090-4444 Fax: 91-80-3090-4123 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 Cleveland Independence, OH Tel: 216-447-0464 Fax: 216-447-0643 Dallas Addison, TX Tel: 972-818-7423 Fax: 972-818-2924 Detroit Farmington Hills, MI Tel: 248-538-2250 Fax: 248-538-2260 Indianapolis Noblesville, IN Tel: 317-773-8323 Fax: 317-773-5453 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-8569-7000 Fax: 86-10-8528-2104 China - Chengdu Tel: 86-28-8665-5511 Fax: 86-28-8665-7889 Netherlands - Drunen Tel: 31-416-690399 Fax: 31-416-690340 China - Chongqing Tel: 86-23-8980-9588 Fax: 86-23-8980-9500 Korea - Seoul Tel: 82-2-554-7200 Fax: 82-2-558-5932 or 82-2-558-5934 China - Hangzhou Tel: 86-571-2819-3180 Fax: 86-571-2819-3189 Malaysia - Kuala Lumpur Tel: 60-3-6201-9857 Fax: 60-3-6201-9859 China - Hong Kong SAR Tel: 852-2401-1200 Fax: 852-2401-3431 Malaysia - Penang Tel: 60-4-227-8870 Fax: 60-4-227-4068 China - Nanjing Tel: 86-25-8473-2460 Fax: 86-25-8473-2470 Philippines - Manila Tel: 63-2-634-9065 Fax: 63-2-634-9069 China - Qingdao Tel: 86-532-8502-7355 Fax: 86-532-8502-7205 Singapore Tel: 65-6334-8870 Fax: 65-6334-8850 China - Shanghai Tel: 86-21-5407-5533 Fax: 86-21-5407-5066 Taiwan - Hsin Chu Tel: 886-3-6578-300 Fax: 886-3-6578-370 China - Shenyang Tel: 86-24-2334-2829 Fax: 86-24-2334-2393 Taiwan - Kaohsiung Tel: 886-7-213-7830 Fax: 886-7-330-9305 China - Shenzhen Tel: 86-755-8203-2660 Fax: 86-755-8203-1760 Taiwan - Taipei Tel: 886-2-2500-6610 Fax: 886-2-2508-0102 China - Wuhan Tel: 86-27-5980-5300 Fax: 86-27-5980-5118 Thailand - Bangkok Tel: 66-2-694-1351 Fax: 66-2-694-1350 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 - Xian Tel: 86-29-8833-7252 Fax: 86-29-8833-7256 China - Xiamen Tel: 86-592-2388138 Fax: 86-592-2388130 China - Zhuhai Tel: 86-756-3210040 Fax: 86-756-3210049 DS70595C-page 3-34 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781 Korea - Daegu Tel: 82-53-744-4301 Fax: 82-53-744-4302 05/02/11 © 2009-2011 Microchip Technology Inc.