Periph - Prog - Programming Peripheral in C
Periph - Prog - Programming Peripheral in C
ABSTRACT
Contents
1 Introduction .......................................................................................... 1
2 Traditional #define Approach ..................................................................... 3
3 Bit Field and Register-File Structure Approach ................................................. 5
4 Bit Field and Register-File Structure Advantages............................................. 12
5 Code Size and Performance Using Bit Fields ................................................. 13
6 Read-Modify-Write Considerations When Using Bit Fields .................................. 17
7 A Special Case: eCAN Control Registers...................................................... 21
8 References ......................................................................................... 23
List of Figures
1 SCI SCICCR Register.............................................................................. 9
2 SCI SCICTL1 Register ............................................................................. 9
3 Code Composer Studio 3.1 Autocomplete Feature .......................................... 12
4 Code Composer Studio Watch Window........................................................ 13
5 Peripheral Clock Control 0 Register (PCLKCR0) ............................................ 13
List of Tables
1 SCI-A, SCI-B Configuration and Control Registers ............................................ 3
2 SCI-A and SCI-B Common Register File ........................................................ 5
3 CPU-Pipeline Activity For Read-Modify-Write Instructions in Example 13 ................ 15
4 281x, 280x, 2801x, and 2804x Read-Modify-Write Sensitive Registers ................... 20
1 Introduction
The TMS320x28xx and TMS328x28xxx are members of the C2000 DSP generation for embedded control
applications. To facilitate writing efficient and easy-to-maintain embedded C/C++ code on these DSPs,
Texas Instruments provides a hardware abstraction layer method for accessing memory-mapped
peripheral registers. This method is the bit field and register-file structure approach. This application note
explains the implementation of this hardware abstraction layer and compares it to traditional #define
macros. Topics of code efficiency and special case registers are also addressed.
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 1
Submit Documentation Feedback
www.ti.com
Introduction
The hardware abstraction layer discussed in this application note has been implemented as a collection of
C/C++ header files available for download from Texas Instruments:
• C281x C/C++ Header Files and Peripheral Examples (SPRC097)
• C280x, C2801x C/C++ Header Files and Peripheral Examples (SPRC191)
• C2804x C/C++ Header Files and Peripheral Examples (SPRC324)
Depending on your current needs, SPRC097, SPRC191, and SPRC324 are learning tools or the basis for
a development platform.
• Learning Tool:
The C/C++ Header Files and Peripheral Examples include several example Code Composer Studio™
projects. These examples explain the steps required to initialize the device and utilize on-chip
peripherals. The examples can be copied and modified to quickly experiment with peripheral
configurations.
• Development Platform:
The header files can be incorporated into a project as a hardware abstraction layer for accessing
on-chip peripherals using C or C++ code. You can also pick and choose functions as needed and
discard the rest.
This application note does not provide a tutorial on C, C++, C28xx assembly, or emulation tools. The
reader should have a basic understanding of C code, access to the examples in SPRC097 or SPRC191,
and the ability to load and run code using Code Composer Studio. While knowledge of C28xx assembly is
not required to understand the hardware abstraction layer, it is useful to understand the code optimization
and read-modify-write sections. If you have assembly instruction-related questions, see the TMS320C28x
DSP CPU and Instruction Set Reference Guide (SPRU430).
Examples are based on the following software versions:
• C281x C/C++ Header Files and Peripheral Examples (SPRC097) V1.00
• C280x, C2801x C/C++ Header Files and Peripheral Examples (SPRC191) V1.41
• C2804x C/C++ Header Files and Peripheral Examples (SPRC324) V1.00
• C28x Compiler V4.1.1
The following abbreviations are used:
• C/C++ Header Files and Peripheral Examples refers to any of the header file packages: C281x C/C++
Header Files and Peripheral Examples (SPRC097) , C280x C2801x C/C++ Header Files and
Peripheral Examples (SPRC191) or C2804x C/C++ Header Files and Peripheral Examples (SPRC324)
• TMS320x280x and 280x refer to all devices in the TMS320x280x and TMS320x2801x family and the
UCD9501. For example: TMS320F2801, TMS320F2806, TMS320F2808, TMS320F28015 and
TMS320F28016.
• TMS320x2804x and 2804x refers all devices in the TMS320x2804x family. For example, the
TMS320F28044.
• TMS320x281x and 281x refer to all devices in the TMS320x281x family. For example: TMS320F2810,
TMS320F2811, and TMS320F2812, TMS320C2810, and so forth.
• C28x refers to the TMS320C28x CPU; this CPU is used on all of the above DSPs.
2 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
(1) The SCI is described in theTMS320x28xx, 28xxx Serial Communications Interface (SCI) Reference Guide (SPRU051).
(2) These registers are reserved on devices without the SCI-B peripheral. See the data manual for details.
A developer can implement #define macros for the SCI peripherals by adding definitions like those in
Example 1 to an application header file. These macros provide an address label, or a pointer, to each
register location. Even if a peripheral is an identical copy a macro is defined for every register. For
example, every register in SCI-A and SCI-B is specified separately.
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 3
Submit Documentation Feedback
www.ti.com
/********************************************************************
* Traditional header file
********************************************************************/
Each macro definition can then be used as a pointer to the register's location as shown in Example 2.
Example 2. Accessing Registers Using #define Macros
/********************************************************************
* Source file using #define macros
********************************************************************/
...
*SCICTL1A = 0x0003; //write entire register
*SCICTL1B |= 0x0001; //enable RX
...
4 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 5
Submit Documentation Feedback
www.ti.com
/********************************************************************
* SCI header file
* Defines a register file structure for the SCI peripheral
********************************************************************/
struct SCI_REGS {
Uint16 SCICCR_REG SCICCR; // Communications control register
Uint16 SCICTL1_REG SCICTL1; // Control register 1
Uint16 SCIHBAUD; // Baud rate (high) register
Uint16 SCILBAUD; // Baud rate (low) register
Uint16 SCICTL2_REG SCICTL2; // Control register 2
Uint16 SCIRXST_REG SCIRXST; // Receive status register
Uint16 SCIRXEMU; // Receive emulation buffer register
Uint16 SCIRXBUF_REG SCIRXBUF; // Receive data buffer
Uint16 rsvd1; // reserved
Uint16 SCITXBUF; // Transmit data buffer
Uint16 SCIFFTX_REG SCIFFTX; // FIFO transmit register
Uint16 SCIFFRX_REG SCIFFRX; // FIFO receive register
Uint16 SCIFFCT_REG SCIFFCT; // FIFO control register
Uint16 rsvd2; // reserved
Uint16 rsvd3; // reserved
Uint16 SCIPRI_REG SCIPRI; // FIFO Priority control
};
The structure definition in Example 3 creates a new type called struct SCI_REGS. The definition alone
does not create any variables. Example 4 shows how variables of type struct SCI_REGS are created in a
way similar to built-in types such as int or unsigned int. Multiple instances of the same peripheral use the
same type definition. If there are two SCI peripherals on a device, then two variables are created:
SciaRegs and ScibRegs.
Example 4. SCI Register-File Structure Variables
/********************************************************************
* Source file using register-file structures
* Create a variable for each of the SCI register files
********************************************************************/
6 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
The DATA_SECTION pragma allocates space for the symbol in the section called section name. In
Example 5, the DATA_SECTION pragma is used to assign the variable SciaRegs and ScibRegs to data
sections named SciaRegsFile and ScibRegsFile. The data sections are then directly mapped to the same
memory block occupied by the respective SCI registers.
Example 5. Assigning Variables to Data Sections
/********************************************************************
* Assign variables to data sections using the #pragma compiler statement
* C and C++ use different forms of the #pragma statement
* When compiling a C++ program, the compiler will define __cplusplus automatically
********************************************************************/
//----------------------------------------
#ifdef __cplusplus
#pragma DATA_SECTION("SciaRegsFile")
#else
#pragma DATA_SECTION(SciaRegs,"SciaRegsFile");
#endif
volatile struct SCI_REGS SciaRegs;
//----------------------------------------
#ifdef __cplusplus
#pragma DATA_SECTION("ScibRegsFile")
#else
#pragma DATA_SECTION(ScibRegs,"ScibRegsFile");
#endif
volatile struct SCI_REGS ScibRegs;
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 7
Submit Documentation Feedback
www.ti.com
/********************************************************************
* Memory linker .cmd file
* Assign the SCI register-file structures to the corresponding memory
********************************************************************/
MEMORY
{
...
PAGE 1:
SCIA : origin = 0x007050, length = 0x000010 /* SCI-A registers */
SCIB : origin = 0x007750, length = 0x000010 /* SCI-B registers */
...
}
SECTIONS
{
...
SciaRegsFile : > SCIA, PAGE = 1
ScibRegsFile : > SCIB, PAGE = 1
...
}
By mapping the register-file structure variable directly to the memory address of the peripheral's registers,
you can access the registers directly in C/C++ code by simply modifying the required member of the
structure. Each member of a structure can be used just like a normal variable, but its name will be a bit
longer. For example, to write to the SCI-A Control Register (SCICCR), access the SCICCR member of
SciaRegs as shown in Example 7. Here the dot is an operator in C that selects a member from a
structure.
Example 7. Accessing a Member of the SCI Register-File Structure
/********************************************************************
* User's source file
********************************************************************/
...
SciaRegs.SCICCR = SCICCRA_MASK;
ScibRegs.SCICCR = SCICCRB_MASK;
...
8 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
7 6 5 4 3 2 0
STOPBITS EVEN/ODD PRIORITY LOOPBACK ADDR/IDLE SCICHAR
PARITY ENABLE ENA Mode
R-0 R/W-0 R/W-0 R-0 R/W-0 R/W-0
LEGEND: R/W = Read/Write; R = Read only; -n = value after reset
7 6 5 4 3 2 1 0
Reserved RXERRINTENA SWRESET Reserved TXWAKE SLEEP TXENA RXENA
R-0 R/W-0 R/W-0 R-0 R/W-0 R/W-0 R/W-0 R/W-0
LEGEND: R/W = Read/Write; R = Read only; -n = value after reset
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 9
Submit Documentation Feedback
www.ti.com
/********************************************************************
* SCI header file
********************************************************************/
//----------------------------------------------------------
// SCICCR communication control register bit definitions:
//
struct SCICCR_BITS { // bit description
Uint16 SCICHAR:3; // 2:0 Character length control
Uint16 ADDRIDLE_MODE:1; // 3 ADDR/IDLE Mode control
Uint16 LOOPBKENA:1; // 4 Loop Back enable
Uint16 PARITYENA:1; // 5 Parity enable
Uint16 PARITY:1; // 6 Even or Odd Parity
Uint16 STOPBITS:1; // 7 Number of Stop Bits
Uint16 rsvd1:8; // 15:8 reserved
};
//-------------------------------------------
// SCICTL1 control register 1 bit definitions:
//
struct SCICTL1_BITS { // bit description
Uint16 RXENA:1; // 0 SCI receiver enable
Uint16 TXENA:1; // 1 SCI transmitter enable
Uint16 SLEEP:1; // 2 SCI sleep
Uint16 TXWAKE:1; // 3 Transmitter wakeup method
Uint16 rsvd:1; // 4 reserved
Uint16 SWRESET:1; // 5 Software reset
Uint16 RXERRINTENA:1; // 6 Receive interrupt enable
Uint16 rsvd1:9; // 15:7 reserved
};
/********************************************************************
* SCI header file
********************************************************************/
union SCICCR_REG {
Uint16 all;
struct SCICCR_BITS bit;
};
union SCICTL1_REG {
Uint16 all;
struct SCICTL1_BITS bit;
};
Once bit-field and union definitions are established for specific registers, the SCI register-file structure is
rewritten in terms of the union definitions as shown in Example 10. Note that not all registers have bit field
definitions; some registers, such as SCITXBUF, will always be accessed as a whole and a bit field
definition is not necessary.
10 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
/********************************************************************
* SCI header file
********************************************************************/
//---------------------------------------------------------------------------
// SCI Register File:
//
struct SCI_REGS {
union SCICCR_REG SCICCR; // Communications control register
union SCICTL1_REG SCICTL1; // Control register 1
Uint16 SCIHBAUD; // Baud rate (high) register
Uint16 SCILBAUD; // Baud rate (low) register
union SCICTL2_REG SCICTL2; // Control register 2
union SCIRXST_REG SCIRXST; // Receive status register
Uint16 SCIRXEMU; // Receive emulation buffer register
union SCIRXBUF_REG SCIRXBUF; // Receive data buffer
Uint16 rsvd1; // reserved
Uint16 SCITXBUF; // Transmit data buffer
union SCIFFTX_REG SCIFFTX; // FIFO transmit register
union SCIFFRX_REG SCIFFRX; // FIFO receive register
union SCIFFCT_REG SCIFFCT; // FIFO control register
Uint16 rsvd2; // reserved
Uint16 rsvd3; // reserved
union SCIPRI_REG SCIPRI; // FIFO Priority control
};
As with other structures, each member (.all or .bit) is accessed using the dot operator in C/C++ as shown
in Example 11. When the .all member is specified, the entire register is accessed. When the .bit member
is specified, then the defined bit fields can be directly accessed.
Note: Writing to a bit field has the appearance of writing to only the specified field. In reality,
however, the CPU performs what is called a read-modify-write operation; the entire
register is read, its contents are modified and the entire value is written back. Possible
side effects of read-modify-write instructions are discussed in Section 6.
/********************************************************************
* User's source file
********************************************************************/
// Access registers without a bit field definition (.all, .bit not used)
SciaRegs.SCIHBAUD = 0;
SciaRegs.SCILBAUD = 1;
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 11
Submit Documentation Feedback
www.ti.com
12 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
7 6 5 4 3 2 1 0
SPIDENCLK SPICENCLK Reserved I2CAENCLK ADCENCLK TBCLKSYNC Reserved
R/W-0 R/W-0 R-0 R/W-0 R/W-0 R/W-0 R-0
LEGEND: R/W = Read/Write; R = Read only; -n = value after reset
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 13
Submit Documentation Feedback
www.ti.com
The code in Example 13 enables the peripheral clocks on a TMS320x2801 device. The C28x compiler
generates one assembly code instruction for each C-code register access. This is very efficient; there is a
one-to-one correlation between the C instructions and the assembly instructions. The only overhead is the
initial instruction to set the data page pointer (DP).
Example 13. Assembly Code Generated By Bit Field Accesses
Note: EALLOW and EDIS are macros defined in the C/C++ Header Files and Peripheral
Examples. These macros expand to the EALLOW and EDIS assembly instructions.
The EALLOW protection mechanism prevents spurious CPU writes to several registers.
Executing EALLOW permits the CPU to write freely to protected registers and executing
EDIS protects them once more. For information on EALLOW protection and a list of
protected registers, see the TMS320x280x, 2801x, 2804x DSP System Control and
Interrupts (SPRU712) and TMS320x281x System Control and Interrupts (SPRU078)
reference guides.
14 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
Read 1 - Read Begins Read 2 - Data Latched Execute - Value Modified Write - Value written Cycle
AND @28,#0xFFFC 1
AND @28,#0xFFFC 2
AND @28,#0xFFFC 3
AND @28,#0xFFFC 4
AND @28,#0xFFFC 5
AND @28,#0xFFFC 6
AND @28,#0xFFFB 7
AND @28,#0xFFFB 8
AND @28,#0xFFFB 9
AND @28,#0xFFFB 10
AND @28,#0xFFFB 11
AND @28,#0xFFFB 12
OR @28,#0x0008 13
OR @28,#0x0008 14
OR @28,#0x0008 15
OR @28,#0x0008 16
OR @28,#0x0008 17
OR @28,#0x0008 18
OR @28,#0x0010
etc...
(1) For detailed CPU pipeline information, see theTMS320C28x DSP CPU and Instruction Set Reference Guide (SPRU430).
When code size and cycle counts must be kept to a minimum, it is beneficial to reduce the number of
instructions required to initialize a register to as few as possible. Here are some options for reducing code
size:
• Enable the compiler's optimizer:
As mentioned in Section 3.1, register-file variables are declared as volatile. For this reason, enabling
the optimizer alone will not reduce the number of instructions. The keyword volatile alerts the compiler
that the variable's value can change outside of the currently executing code. While removing the
volatile keyword would reduce code size, it is not recommended. Removing volatile must be done with
great care and only where the developer is certain doing so will not yield incorrect results.
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 15
Submit Documentation Feedback
www.ti.com
16 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
With a full CPU pipeline, a C28x based DSP can complete one read-modify-write operation to zero
wait-state SARAM every cycle. When accessing the peripheral registers or external memory, however,
required wait states must be taken into account. In addition, the pipeline protection mechanism can further
stall instructions in the CPU pipeline. This is described in more detail in Section 5 and in the TMS320C28x
DSP CPU and Instruction Set Reference Guide (SPRU430).
Read-modify-write instructions usually have no ill side effects. It is important, however, to realize that
read-modify-write instructions do not limit access to only specific bits in the register; these instructions
write to all of the register's bits. In some cases, the read-modify-write sequence can cause unexpected
results when bits are written to with the value originally read. Registers that are sensitive to
read-modify-write instructions fall into three categories:
1. Registers with bits that hardware can change after the read, but before the write.
2. Registers with write 1-to-clear bits.
3. Registers that have bits that must be written with a value different from what the bits read back.
Registers that fall into these three categories are typically found within older peripherals. To keep register
compatibility, the register files have not been redesigned to avoid this issue. Newer peripherals, such as
the ePWM, eCAP, and eQEP, however, have a register layout specifically designed to avoid these
problems.
This section describes in detail the three categories in which read-modify-write operations should be used
with care. In addition, an example of each type of register is given along with a suggested method for
safely modifying that register. At the end of the section a list of read-modify-write sensitive registers is
provided for reference.
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 17
Submit Documentation Feedback
www.ti.com
/********************************************************************
* User's source file
********************************************************************/
// Pseudo ISR
// Services the interrupt & the hardware clears the PIEIFR flag
// Re-maps the interrupt to the proper ISR
interrupt void PseudoISR(void)
{
EALLOW;
PieVectTable.XINT1 = TempISR;
EDIS;
}
Note: This rule does not apply to the CPU's IFR register. Special instructions are provided to
clear CPU IFR bits and will not result in missing interrupts. Use the "OR IFR" instruction to
set IFR bits, and use the "AND IFR" instruction to clear pending interrupts.
See the TMS320x280x, 2801x, 2804x DSP System Control and Interrupts Reference Guide (SPRU712)
and TMS320x281x System Control and Interrupts Reference Guide (SPRU078) reference guides for more
information on the PIE module.
18 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
The test for TIF in Example 18 will never be true even if an interrupt has been flagged. The OR assembly
instruction to set the TSS bit performs a read-modify-write operation on the TCR register. If the TIF bit is
set when the read-modify-write operation occurs, then TIF will be read as a 1 and also written back as a 1.
The TIF bit will always be cleared as a result of this write. To avoid this, the write to TIF bit always be 0.
The TIF bit ignores writes of 0, thus its value will be preserved. One possible implementation that
preserves TIF is shown in Example 19.
Example 19. Using a Shadow Register to Preserve Write 1-to-Clear Bits
The content of the TCR register is copied into a shadow register. Within the shadow register the TSS bit is
set, and the TIF bit is cleared. The shadow register is then written back to TCR; the timer is stopped and
the state of TIF is preserved. The assembly instructions were generated with optimization level -o2
enabled.
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 19
Submit Documentation Feedback
www.ti.com
/********************************************************************
* User's source file
********************************************************************/
SysCtrlRegs.WDCR = 0x0068;
See the TMS320x280x, 2801x, 2804x DSP System Control and Interrupts Reference Guide (SPRU712)
and TMS320x281x System Control and Interrupts Reference Guide (SPRU078) for more information on
the watchdog module.
20 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
Table 4. 281x, 280x, 2801x, and 2804x Read-Modify-Write Sensitive Registers (continued)
Module Register(s) Comments
Event Manager (EV) (1) CAPCONA CAPCONB CAPRES is a write-0-to-reset bit and always reads
back as 0.
CAPFIFOA CAPFIFOB If a write occurs at the same time that a CAPxFIFO
status bit is being updated, the write data takes
precedence. Thus if the bit changes between the
read and the write phase of a read-modify-write
instruction, the new bit value may be lost.
EVAIFRA/B/C EVBIFRA/B/C The EV interrupt flags are all write 1-to-clear bits.
eCAN CANTRS CANTRR The eCAN module can change the state of a bit
between the time the register is read and the time it
is written back.
CANTA CANAA These registers contain one or more write 1-to-clear
CANRMP CANRML bits.
CANRFP CANES
CANGIF0 CANGIF1
CANTOS
SPI SPIST Contains write 1-to-clear bits.
I2C (2) I2CSTR Contains write 1-to-clear bits.
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 21
Submit Documentation Feedback
www.ti.com
To force 32-bit accesses, the bit-field definitions and read-modify-write operations must not be used. The
register must be read and written using the ".all" member of the union definition and all 32-bits must be
read or written.
Unfortunately, not using bit fields or read-modify-write operations reduces the code readability. One
solution is to read the entire register into a shadow register, manipulate the value, and then write the new
32-bit value to the register using ".all". The code in Example 22 uses a shadow register to force a 32-bit
access. If more then one register is going to be accessed, then the whole eCAN register file can be
shadowed (i.e., struct ECAN_REGS shadowECanaRegs;).
Example 22. Using a Shadow Register to Force a 32-bit Access
22 Programming TMS320x28xx and 28xxx Peripherals in C/C++ SPRAA85A – November 2005 – Revised October 2006
Submit Documentation Feedback
www.ti.com
References
8 References
The following references include additional information on topics found in this application note:
C281x C/C++ Header Files and Peripheral Examples (SPRC097)
C280x, C2801x C/C++ Header Files and Peripheral Examples (SPRC191)
C2804x C/C++ Header Files and Peripheral Examples (SPRC324)
TMS320F2809, F2808, F2806, F2802, F2801, F2801x UCD9501, C2802, C2801 DSPs Data Manual
(SPRS230)
TMS320F2810, TMS320F2811, TMS320F2812, TMS320C2810, TMS320C2811, TMS320C2812 Digital
Signal Processors Data Manual (SPRS174)
TMS320C28x DSP CPU and Instruction Set Reference Guide (SPRU430)
TMS320C28x Optimizing C/C++ Compiler User's Guide (SPRU514)
TMS320C28x Assembly Language Tools User's Guide (SPRU513)
TMS320x28xx, 28xxx Serial Communications Interface (SCI) Reference Guide (SPRU051)
TMS320x281x System Control and Interrupts Reference Guide (SPRU078)
TMS320x280x, 2801x, 2804x System Control and Interrupts Reference Guide (SPRU712)
TMS320x28xx, 28xxx Enhanced Controller Area Network (eCAN) Reference Guide (SPRU074)
SPRAA85A – November 2005 – Revised October 2006 Programming TMS320x28xx and 28xxx Peripherals in C/C++ 23
Submit Documentation Feedback
IMPORTANT NOTICE
Texas Instruments Incorporated and its subsidiaries (TI) reserve the right to make corrections, modifications,
enhancements, improvements, and other changes to its products and services at any time and to discontinue
any product or service without notice. Customers should obtain the latest relevant information before placing
orders and should verify that such information is current and complete. All products are sold subject to TI’s terms
and conditions of sale supplied at the time of order acknowledgment.
TI warrants performance of its hardware products to the specifications applicable at the time of sale in
accordance with TI’s standard warranty. Testing and other quality control techniques are used to the extent TI
deems necessary to support this warranty. Except where mandated by government requirements, testing of all
parameters of each product is not necessarily performed.
TI assumes no liability for applications assistance or customer product design. Customers are responsible for
their products and applications using TI components. To minimize the risks associated with customer products
and applications, customers should provide adequate design and operating safeguards.
TI does not warrant or represent that any license, either express or implied, is granted under any TI patent right,
copyright, mask work right, or other TI intellectual property right relating to any combination, machine, or process
in which TI products or services are used. Information published by TI regarding third-party products or services
does not constitute a license from TI to use such products or services or a warranty or endorsement thereof.
Use of such information may require a license from a third party under the patents or other intellectual property
of the third party, or a license from TI under the patents or other intellectual property of TI.
Reproduction of information in TI data books or data sheets is permissible only if reproduction is without
alteration and is accompanied by all associated warranties, conditions, limitations, and notices. Reproduction
of this information with alteration is an unfair and deceptive business practice. TI is not responsible or liable for
such altered documentation.
Resale of TI products or services with statements different from or beyond the parameters stated by TI for that
product or service voids all express and any implied warranties for the associated TI product or service and
is an unfair and deceptive business practice. TI is not responsible or liable for any such statements.
Following are URLs where you can obtain information on other Texas Instruments products and application
solutions:
Products Applications
Amplifiers amplifier.ti.com Audio www.ti.com/audio
Data Converters dataconverter.ti.com Automotive www.ti.com/automotive
DSP dsp.ti.com Broadband www.ti.com/broadband
Interface interface.ti.com Digital Control www.ti.com/digitalcontrol
Logic logic.ti.com Military www.ti.com/military
Power Mgmt power.ti.com Optical Networking www.ti.com/opticalnetwork
Microcontrollers microcontroller.ti.com Security www.ti.com/security
Low Power Wireless www.ti.com/lpw Telephony www.ti.com/telephony
Video & Imaging www.ti.com/video
Wireless www.ti.com/wireless