AN_289 FT51A Programming Guide

Application Note
AN_289
FT51A Programming Guide
Version 1.0
Issue Date: 2015-12-21
This document provides a guide for using FT51A firmware libraries supplied
by FTDI and writing applications.
Use of FTDI devices in life support and/or safety applications is entirely at the user’s risk, and the
user agrees to defend, indemnify and hold FTDI harmless from any and all damages, claims, suits
or expense resulting from such use.
Future Technology Devices International Limited (FTDI)
Unit 1, 2 Seaward Place, Glasgow G41 1HH, United Kingdom
Tel.: +44 (0) 141 429 2777 Fax: + 44 (0) 141 429 2758
Web Site: http://ftdichip.com
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Table of Contents
1 Introduction .............................................................. 7
1.1 Overview .............................................................................7
1.2 Features ..............................................................................7
1.3 Scope ..................................................................................7
2 Hardware Reference .................................................. 9
2.1 Hardware Access ............................................................... 10
2.1.1
Registers Accessed by SFR ............................................................................. 10
2.1.2
Registers Accessed through I/O Ports .............................................................. 10
2.1.3
Register Descriptions .................................................................................... 11
2.2 Device Control Registers ................................................... 12
2.2.1
DEVICE_CONTROL_REGISTER ........................................................................ 13
2.2.2
SYSTEM_CLOCK_DIVIDER ............................................................................. 14
2.2.3
TOP_USB_ENABLE ........................................................................................ 16
2.2.4
PERIPHERAL_INT0 ........................................................................................ 17
2.2.5
PERIPHERAL_IEN0 ........................................................................................ 17
2.2.6
PERIPHERAL_INT1 ........................................................................................ 18
2.2.7
PERIPHERAL_IEN1 ........................................................................................ 19
2.2.8
PIN_CONFIG ................................................................................................ 19
2.2.9
MTP_CONTROL ............................................................................................. 19
2.2.10
MTP_ADDR_L, MTP_ADDR_U and MTP_PROG_DATA .......................................... 20
2.2.11
MTP_CRC_CTRL, MTP_CRC_RESULT_L and MTP_CRC_RESULT_U ........................ 21
2.2.12
PIN_PACKAGE_CONFIG ................................................................................. 22
2.2.13
TOP_ SECURITY_LEVEL ................................................................................. 22
2.3 SPI Master.........................................................................25
2.3.1
SPI_MASTER_CONTROL................................................................................. 27
2.3.2
SPI_MASTER_TX_DATA ................................................................................. 27
2.3.3
SPI_MASTER_RX_DATA ................................................................................. 27
2.3.4
SPI_MASTER_IEN ......................................................................................... 28
2.3.5
SPI_MASTER_INT ......................................................................................... 29
2.3.6
SPI_MASTER_SETUP ..................................................................................... 30
2.3.7
SPI_MASTER_CLK_DIV .................................................................................. 31
1
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.3.8
SPI_MASTER_DATA_DELAY ............................................................................ 31
2.3.9
SPI_MASTER_SS_SETUP ............................................................................... 32
2.3.10
SPI_MASTER_TRANSFER_SIZE ....................................................................... 32
2.3.11
SPI_MASTER_TRANSFER_PENDING................................................................. 33
2.3.12
Use Cases .................................................................................................... 33
2.4 SPI Slave ........................................................................... 36
2.4.1
SPI_SLAVE_CONTROL ................................................................................... 37
2.4.2
SPI_SLAVE_TX_DATA .................................................................................... 37
2.4.3
SPI_SLAVE_RX_DATA ................................................................................... 38
2.4.4
SPI_SLAVE_IEN ............................................................................................ 38
2.4.5
SPI_SLAVE_INT ............................................................................................ 39
2.4.6
SPI_SLAVE_SETUP ........................................................................................ 40
2.5 I2C Master.........................................................................41
2.5.1
I2CMSA ....................................................................................................... 41
2.5.2
I2CMCR ....................................................................................................... 42
2.5.3
I2CMSR ....................................................................................................... 43
2.5.4
I2CMBUF ..................................................................................................... 43
2.5.5
I2CMTP ....................................................................................................... 44
2.5.6
Use Case ..................................................................................................... 44
2.6 I2C Slave ........................................................................... 47
2.6.1
I2CSOA ....................................................................................................... 47
2.6.2
I2CSCR ....................................................................................................... 48
2.6.3
I2CSSR ....................................................................................................... 48
2.6.4
I2CSBUF ...................................................................................................... 49
2.6.5
Use Case ..................................................................................................... 49
2.7 UART ................................................................................. 51
2.7.1
UART_CONTROL ........................................................................................... 52
2.7.2
UART_DMA_CTRL ......................................................................................... 52
2.7.3
UART_RX_DATA ........................................................................................... 52
2.7.4
UART_TX_DATA............................................................................................ 52
2.7.5
UART_TX_IEN .............................................................................................. 53
2.7.6
UART_TX_INT .............................................................................................. 53
2.7.7
UART_RX_IEN .............................................................................................. 54
2.7.8
UART_RX_INT .............................................................................................. 54
2.7.9
UART_LINE_CTRL ......................................................................................... 55
2
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.7.10
UART_BAUD ................................................................................................. 56
2.7.11
UART Baud Rate Example .............................................................................. 57
2.7.12
UART_FLOW_CTRL ........................................................................................ 57
2.7.13
UART_FLOW_STAT........................................................................................ 58
2.8 GPIOs ................................................................................ 59
2.8.1
Digital GPIO Pads ......................................................................................... 59
2.8.2
Analogue GPIO Pads ..................................................................................... 60
2.9 IOMUX ............................................................................... 63
2.9.1
IOMUX_CONTROL ......................................................................................... 63
2.9.2
IOMUX_OUTPUT_PAD_SEL ............................................................................. 64
2.9.3
IOMUX_OUTPUT_SIG_SEL ............................................................................. 64
2.9.4
IOMUX_INPUT_SIG_SEL ................................................................................ 64
2.9.5
IOMUX_INPUT_PAD_SEL ............................................................................... 65
2.9.6
IOMUX Pad Values ........................................................................................ 65
2.9.7
IOMUX Output Signal Mapping Values ............................................................. 66
2.9.8
IOMUX Input Signal Mapping Values ............................................................... 68
2.9.9
Use Cases .................................................................................................... 69
2.10
Analogue IO Ports........................................................... 70
2.10.1
AIO_CONTROL ............................................................................................. 70
2.10.2
Implementation ............................................................................................ 71
2.10.3
AIO Configuration ......................................................................................... 71
2.10.4
AIO ADC Mode ............................................................................................. 74
2.10.5
AIO Interrupts .............................................................................................. 77
2.10.6
Global Mode ................................................................................................. 79
2.10.7
Differential Mode .......................................................................................... 82
2.10.8
Settling Times .............................................................................................. 83
2.10.9
ADC Programming Flow ................................................................................. 86
2.11
USB Full Speed Device Controller ....................................87
2.11.1
Endpoint Buffer Management ......................................................................... 87
2.11.2
Command Summary ..................................................................................... 91
2.11.3
Initialization Commands ................................................................................ 96
2.11.4
Data Flow Commands ................................................................................... 99
2.11.5
General Commands .....................................................................................105
2.12
Pulse Width Modulation ................................................ 106
3
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.12.1
PWM_CONTROL ...........................................................................................108
2.12.2
PWM_INT_CTRL...........................................................................................109
2.12.3
PWM_PRESCALER ........................................................................................109
2.12.4
PWM_CNT16_LSB ........................................................................................109
2.12.5
PWM_CNT16_MSB .......................................................................................110
2.12.6
PWM_CMP16_0_LSB - PWM_CMP16_7_LSB ....................................................110
2.12.7
PWM_CMP16_0_MSB - PWM_CMP16_7_MSB ...................................................110
2.12.8
PWM_OUT_TOGGLE_EN_0 - PWM_OUT_TOGGLE_EN_7 ....................................110
2.12.9
PWM_OUT_CLR_EN ......................................................................................111
2.12.10
PWM_CTRL_BL_CMP8 ...............................................................................111
2.12.11
PWM_INIT ...............................................................................................111
2.12.12
Use Cases ...............................................................................................111
2.13
Timers .......................................................................... 115
2.13.1
TIMER_CONTROL .........................................................................................116
2.13.2
TIMER_CONTROL_1 .....................................................................................117
2.13.3
TIMER_CONTROL_2 .....................................................................................117
2.13.4
TIMER_CONTROL_3 .....................................................................................117
2.13.5
TIMER_CONTROL_4 .....................................................................................118
2.13.6
TIMER_INT .................................................................................................118
2.13.7
TIMER_SELECT ............................................................................................119
2.13.8
TIMER_WDG ...............................................................................................119
2.13.9
TIMER_WRITE_LS ........................................................................................119
2.13.10
TIMER_WRITE_MS....................................................................................119
2.13.11
TIMER_PRESC_LS ....................................................................................119
2.13.12
TIMER_PRESC_MS ....................................................................................120
2.13.13
TIMER_READ_LS ......................................................................................120
2.13.14
TIMER_READ_MS .....................................................................................120
2.13.15
Use Cases ...............................................................................................121
2.14
DMA .............................................................................. 127
2.14.1
DMA_CONTROL_x ........................................................................................130
2.14.2
DMA_ENABLE_x ..........................................................................................131
2.14.3
DMA_IRQ_ENA_x .........................................................................................131
2.14.4
DMA_IRQ_x ................................................................................................132
2.14.5
DMA_SRC_MEM_ADDR_L_x ..........................................................................132
2.14.6
DMA_SRC_MEM_ADDR_U_x ..........................................................................132
4
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.14.7
DMA_DEST_MEM_ADDR_L_x ........................................................................132
2.14.8
DMA_DEST_MEM_ADDR_U_x ........................................................................133
2.14.9
DMA_IO_ADDR_L_x .....................................................................................133
2.14.10
DMA_SRC_MEM_ADDR_U_x ......................................................................133
2.14.11
DMA_TRANS_CNT_L_x ..............................................................................134
2.14.12
DMA_TRANS_CNT_U_x .............................................................................134
2.14.13
DMA_CURR_CNT_L_x ...............................................................................134
2.14.14
DMA_TRANS_CNT_U_x .............................................................................134
2.14.15
DMA_FIFO_DATA_x ..................................................................................134
2.14.16
DMA_AFULL_TRIGGER_x ...........................................................................135
2.14.17
Use Cases ...............................................................................................135
3 Application Guide .................................................. 137
3.1 Libraries .......................................................................... 137
3.1.1
Configuration Library ...................................................................................137
3.1.2
USB Library ................................................................................................138
3.1.3
DMA Library ................................................................................................141
3.1.4
UART Library ...............................................................................................142
3.1.5
SPI Master Library .......................................................................................143
3.1.6
I2C Master Library .......................................................................................144
3.1.7
I2C Slave Library .........................................................................................145
3.1.8
AIO Library .................................................................................................145
3.1.9
IOMUX Library .............................................................................................146
3.1.10
Watchdog Library ........................................................................................146
3.1.11
DFU Library ................................................................................................147
3.1.12
LCD Library.................................................................................................148
3.1.13
TMC Library ................................................................................................148
3.2 USB Applications ............................................................. 150
3.2.1
Initialising USB Device .................................................................................150
3.2.2
Descriptors .................................................................................................151
3.2.3
Standard Requests ......................................................................................153
3.2.4
Class and Vendor Requests ...........................................................................157
3.2.5
Call-backs...................................................................................................157
3.2.6
Main Function..............................................................................................158
3.2.7
Sending and Receiving Data ..........................................................................159
3.2.8
Link Power Management ...............................................................................159
5
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
4 Contact Information .............................................. 161
Appendix A – References ........................................... 162
Document References ............................................................. 162
Acronyms and Abbreviations................................................... 163
Appendix B – List of Tables & Figures ........................ 164
List of Tables........................................................................... 164
List of Figures ......................................................................... 168
Appendix C – Revision History ................................... 170
6
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
1 Introduction
This guide documents the registers and internal architecture of the FT51A. It also covers the
firmware libraries and samples provided for the FT51A by FTDI.
1.1 Overview
The FT51A series of devices provides a USB device interface, a built-in USB hub and an 8051
compatible microcontroller. The 8051 compatible component is referred to as the ‘core’.
There is 16kB of program storage in MTP (Multiple Time Programmable) memory, 16kB of Shadow
RAM (from where code is run), 8kB of data RAM and 128 bytes of internal RAM.
Details of the device are fully documented in the FT51A Series Datasheets which can be obtained
from the FTDI website. http://www.ftdichip.com/Products/ICs/FT51.html.
Additionally there are the following hardware interfaces:
-
GPIO
UART
PWM
SPI Master and Slave
I2C Master and Slave
FT245 Parallel
ADC
Additional Timers
The FT51A has an internal USB Full Speed device controller that is register compatible with an
FT122. An internal on-chip USB hub can optionally be enabled to allow a single downstream port
from the FT51A.
1.2 Features
The firmware libraries for the FT51A have the following features:
-
Abstracted access to USB functions for simple implementation of device emulation.
Functions for performing basic access to ADC, SPI Master, I2C Master, I2C Slave and UART
hardware interfaces.
Macros and definitions for hardware related features.
Additional libraries for LCD devices, DFU (Device Firmware Update), TMC (Test and
Measurement).
The use of the firmware libraries is shown in the sample applications:
-
DFU Firmware update,
Keyboard and Mouse demos,
Test and Measurement Class,
Interfacing to FT800 demos,
Interfacing to LCD screen.
1.3 Scope
This guide is intended for developers who are creating applications, extending FTDI provided
applications or implementing example applications for the FT51A.
In the reference of the FT51A, an “application” refers to firmware that runs on the FT51A;
“libraries” are source code provided by FTDI to help users access specific hardware features of the
chip.
7
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The FT51A Tools are currently only available for Microsoft Windows, and are tested on Windows 7
and Windows 8.1.
The following diagram shows the overall system structure:
8
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2 Hardware Reference
The FT51A has an 8051 compatible core. There are extended Special Function Registers (SFRs) to
enable access to the registers of all the peripherals and modules. Certain registers are accessed
directly through SFRs and others are accessed through I/O ports addressed though SFRs.
The SFR map is shown in Table 2.1.
SFRs
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x80
P0
SP
DPL0
DPH0
DPL1
DPH1
DPS
PCON
0x88
TCON
TMOD
TL0
TL1
TH0
TH1
CKCON
0x90
P1
EIF
0x98
SCON0
SBUF0
IO_ADDR_0 H
IO_ADDR_0 L
IO_DATA_0
IO_ADDR_1 H
IO_ADDR_1
L
IO_DATA_1
0xA0
P2
0xA8
IE
IO_ADDR_2
H
IO_ADDR_2 L
IO_DATA_2
0xB0
P3
IO_ADDR_3
H
IO_ADDR_3 L
IO_DATA_3
0xB8
IP
IO_ADDR_4
H
IO_ADDR_4 L
IO_DATA_4
0xC8
T2CON
T2IF
RCAP2L
RCAP2H
TL2
TH2
0xD0
PSW
IO_ADDR_5
H
IO_ADDR_5 L
IO_DATA_5
IO_ADDR_6
H
IO_ADDR_6 L
IO_DATA_6
IO_ADDR_7 L
IO_DATA_7
IO_DATA_9
0xC0
0xD8
0xE0
ACC
IO_ADDR_7
H
0xE8
EIE
STATUS
0xF0
B
I2CSOA
I2CSCR
I2CSBUF
I2CMSA
I2CMCR
I2CMBUF
I2CMTP
0xF8
EIP
IO_ADDR_8
H
IO_ADDR_8 L
IO_DATA_8
FT122_CMD
FT122_DATA
IO_ADDR_9
H
IO_ADDR_9
L
Table 2.1 FT51A SFR Map
9
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.1 Hardware Access
The SFRs contain registers to allow direct access to the USB Full Speed device controller, I2C
Master and I2C Slave peripherals.
There are 10 sets of I/O ports that permit access to the registers of the ADC, PWM, SPI Master,
SPI Slave, UART FTDI, 245 FIFO, DMA, Timers, Watchdog and IOMUX.
Table 2.2 summarises the methods required to access each module.
Name
Method
Name
Method
ADC
I/O
GPIO FTDI
I/O
PWM
I/O
GPIO
SFR
SPI Master
I/O
AIO
SFR
SPI Slave
I/O
Debugger
SFR
I2C Master
SFR
Device Control
I/O
I2C Slave
SFR
IOMUX
I/O
UART FTDI
I/O
Timers 0, 1, 2
SFR
UART DCD
SFR
Timers A, B, C, D
I/O
245 FIFO
I/O
Watchdog FTDI
I/O
DMA Controller
I/O
Watchdog 8051
SFR
USB Device Hub Port
SFR
Table 2.2 FT51A Peripherals
2.1.1
Registers Accessed by SFR
For peripherals and modules addressed directly through the SFRs, the SDCC compiler provides a
“__sfr” keyword to allow their registers to be used like variables. For example, specify
__sfr __at (0x80) P0; to allow access to port 0 via P0 variable. Refer to the SDCC
documentation for further information.
2.1.2
Registers Accessed through I/O Ports
To access a register via the I/O port method, the address of the register has to first be written to
one of the IO_ADDR_x SFRs; then the data can be read from, or written to, the matching IO_DATA_x
SFR.
The I/O port address space is 9 bits, 0x000 to 0x1FF. Therefore the IO_ADDR_x SFRs have a high
and a low byte. The high byte is normally zero because only the IO Cell Controller is located above
the address 0xFF.
The SFRs contain 10 separate I/O ports. Writing to the address register for one port does not
interfere with an address written previously for a different port.
Example macros for writing and reading I/O ports are presented below:
10
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
#define WRITE_IO_REG(address, data)
\
do
\
{
\
IO_ADDR_9_H = (unsigned char)((unsigned int)(address) >> 8); \
IO_ADDR_9_L = (unsigned char)(address);
\
IO_DATA_9 = (data);
\
}
\
while (0)
#define READ_IO_REG(address, data)
\
do
\
{
\
IO_ADDR_9_H = (unsigned char)((unsigned int)(address) >> 8); \
IO_ADDR_9_L = (unsigned char)(address);
\
(data) = IO_DATA_9;
\
}
\
while (0)
2.1.3
Register Descriptions
The hardware and peripheral descriptions in this chapter include register maps which define the
initial state of the registers, their behaviour and provide a description of the bit fields.
Bit type is the behaviour of the bit when accessed. It can be read only, read and write or write to
clear. The mnemonics used in this chapter are defined in Table 2.3.
Type
Definition
R
Read Only
R/W
Read/Write
W1C
Write ‘1’ to Clear
RFU
Reserved for Future Use
W1T
Write ‘1’ to Trigger, Reads as ‘0’
Table 2.3 Register Bit Type Definitions
The initial state of each register is given in the Reset column of the register descriptions.
11
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.2 Device Control Registers
These registers control and provide status on the FT51A device. They are collectively referred to as
the ‘top-level’ registers.
Address
Register Name
Description
0x00
DEVICE_CONTROL_REGISTER
Device Control Registers
0x01
SYSTEM_CLOCK_DIVIDER
System Clock Divider
0x02
TOP_USB_ENABLE
USB Top-Level Control Register
0x03
PERIPHERAL_INT0
Peripheral Interrupt Status 0
0x04
PERIPHERAL_IEN0
Peripheral Interrupt Enable 0
0x05
PERIPHERAL_INT1
Peripheral Interrupt status 1
0x06
PERIPHERAL_IEN1
Peripheral Interrupt Enable 1
0x09
PIN_CONFIG
Debugger State and BDC mode
0x2B
MTP_CONTROL
MTP Memory Control
0x2C
MTP_ADDR_L
MTP Lower Address
0x2D
MTP_ADDR_U
MTP Upper Address
0x2E
MTP_PROG_DATA
MTP Write Data
0x36
MTP_CRC_CTRL
16-bit CRC enable of MTP memory
0x37
MTP_CRC_RESULT_L
16-bit CRC Result Lower Byte
0x38
MTP_CRC_RESULT_U
16-bit CRC Result Lower Byte
0x34
PIN_PACKAGE_CONFIG
Device package Information
0x39
TOP_SECURITY_LEVEL
Device Security Status Register
Table 2.4 Device Control Register Addresses
In addition to the standard interrupts generated by the 8051 core, the FT51A supports other
modules and peripherals as sources. These interrupts can be queried in a hierarchical manner.
Once the top-level interrupt source is known by reading PERIPHERAL_INT0 or PERIPHERAL_INT1 the
interrupt status registers in the pertinent module can then be investigated to determine the lowlevel interrupt source.
To clear an interrupt, first the low-level interrupt with the module should be cleared, followed by
the high-level interrupt in the PERIPHERAL_INT0 or PERIPHERAL_INT1 registers.
Interrupt handler routines may need to check if a particular interrupt source is enabled in
INTERRUPT_EN_0 or PERIPHERAL_IEN1 before acting on the interrupt.
To perform a reset of the entire device the top_soft_reset bit in DEVICE_CONTROL_REGISTER must be
set, followed by the reset_8051 bit in the SYSTEM_CLOCK_DIVIDER register.
12
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.2.1
Clearance No.: FTDI# 483
DEVICE_CONTROL_REGISTER
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
RFU
R
0
Reserved
1
top_dev_en
R/W
0
This bit MUST be set to allow
write access to all top-level
registers.
0
top_soft_reset
R/W
0
When set will cause a reset of
the entire device. This bit will
always read as zero
Table 2.5 Device Control Register
The Device Control register provides top-level write enable and reset functions for all top-level
registers on the FT51A device. This encompasses only the registers described in this chapter and
not any 8051 core registers or other module’s registers.
Write access to the top-level registers is enabled by setting the top_dev_en bit to 1. Clearing this
bit will disable write access.
To reset all top-level registers, a 1 is written to the top_soft_reset bit. The module clears this bit
when a reset is performed and will therefore always read as ‘0’.
13
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.2.2
Clearance No.: FTDI# 483
SYSTEM_CLOCK_DIVIDER
Bit
Position
Bit Field Name
Type
Reset
Description
7..5
RFU
R
0
Reserved
0
Set to reset the 8051 core.
This will cause the 8051
state and registers to be
reset. The program
counter will return to its
RESET value 0x0000. All
other modules and
peripherals except the toplevel registers will be
reset.
4
3
R/W
reset_8051
system_stop_request
R/W
0
For reduced power
consumption. When set
will stop all internal clocks
and place the chip in a low
power state.
Alternatively use PCON
SFR (more below).
2..1
0
clk_sys_divisor
hub_suspend_en
R/W
R/W
0
0
1
0
Clock
division
0
0
1
0
1
2
1
0
4
1
1
8
Allow the hub to enter
suspend mode.
Table 2.6 System and Clock Divider Register
Note: When requesting a low power state and to obtain the lowest possible current
consumption the User must ensure all pad IO controls have no pull ups or downs enabled,
and are configured as an input. Also ensure that the external VCC3V3 is not under any
load conditions.
Note: When running with clock division set to divide-by-8 certain functions are affected:
debugger access is NOT possible; UART cannot run at 3M BAUD. A minimum of divide-by-4
is advised for such operations.
Note: Setting PCON SFR bit 0, so called Power Management Mode (PMM), reduces power
consumption by externally dividing the clock signal provided to the microcontroller,
causing it to operate at a reduced speed. When PMM is invoked, the external pin called
PMM is set into logic 1. It signalizes to external divider that CLK frequency should be
divided by 256. Note that all internal functions, on‐board timers (including serial port baud
rate generation), watchdog timer, and software timing loops will run at the reduced speed.
14
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
PMM is entered and exited by setting the PMM bit (PCON.0). In addition, use of the switchback
feature is possible to affect a return from PMM to the full speed mode. This allows both hardware
and software to cause an exit from PMM. It is the responsibility of the software to test for UART
activity before attempting to change speed, as a modification of the clock divider bits during a
UART operation will corrupt the data.
The switchback feature allows a system to burst to a faster mode when required by an external
event. Enable this feature by setting the PCON bit 2, a qualified interrupt (interrupt which has
occurred and been acknowledged) or serial port reception or transmission cause the
microcontroller to return to full speed mode. An interrupt must be enabled and not blocked by a
higher priority interrupt. Software should manually return the microcontroller to PMM after the
event is completed. The following sources can trigger the Switchback:





external interrupt 0/1,
serial start bit detected, UART,
transmit buffer loaded, UART,
reset,
external reset.
15
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.2.3
TOP_USB_ENABLE
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
RFU
R
0
Reserved
5
4
3
2
1
0
Clearance No.: FTDI# 483
hub_compd_dev
hub_remote_wakeup_en
hub_ext_localpwrsrc
ft122_enable
R/W
0
1- Enable remote wakeup:
Hub will respond to a host
get_status command with an ACK
0 - Disable remote wakeup:
Hub will respond to a host
get_status command with a STALL
0
On receipt of a non-zero-length
data packet, device will:
1 – Hub returns a STALL
0 – Hub returns an ACK
R/W
hub_stsnzdatahsk
hub_enable
R/W
Controls the way the hub module
identifies itself during
enumeration :
1 – Hub is part of a compound
device
0 – Hub is not part of a compound
device
R/W
The setting of this bit is used as a
power status flag which is returned
in response to a Host Get_Status
command :
1 – External power source
0 – Bus powered
R/W
0
Write to this bit to enable or disable
the Hub:
1 – Hub enabled
0 – Hub disabled
0
Write to this bit to enable or disable
USB functionality:
1 – USB enabled
0 – USB disabled
R/W
Table 2.7 USB Control Register
16
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.2.4
Clearance No.: FTDI# 483
PERIPHERAL_INT0
Bit
Position
Bit Field Name
Type
Reset
Description
7..5
RFU
R
0
Reserved
4
dma3_irq
0
Set when the memory contents
have been successfully copied.
Write '1' to clear interrupt.
3
dma2_irq
0
Set when the memory contents
have been successfully copied.
Write '1' to clear interrupt.
2
dma1_irq
0
Set when the memory contents
have been successfully copied.
Write '1' to clear interrupt.
1
dma0_irq
0
Set when the memory contents
have been successfully copied.
Write '1' to clear interrupt.
0
watchdog_irq
0
Set when a watchdog RESET is
generated after a timeout. Write '1'
to clear interrupt.
R/W1C
R/W1C
R/W1C
R/W1C
R/W1C
Table 2.8 Interrupt Status 0 Register
2.2.5
PERIPHERAL_IEN0
Bit
Position
Bit Field Name
Type
Reset
Description
7..5
RFU
R
0
Reserved
4
dma3_irq_ien
R/W
0
Set to enable the dma3 interrupt.
3
dma2_irq_ien
R/W
0
Set to enable the dma2 interrupt.
2
dma1_irq_ien
R/W
0
Set to enable the dma1 interrupt.
1
dma0_irq_ien
R/W
0
Set to enable the dma0 interrupt.
0
watchdog_irq_ien
R/W
0
Set to enable the watchdog reset
interrupt.
Table 2.9 Interrupt Enable 0 Register
17
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.2.6
Clearance No.: FTDI# 483
PERIPHERAL_INT1
Bit
Position
Bit Field Name
7
fifo_245_irq
6
timer_irq
5
pwm_irq
4
spi_slave_irq
3
spi_master_irq
2
uart_irq
1
io_cell_controller_irq
0
ft122_irq
Type
Reset
Description
0
Set when the 245 FIFO has
generated an interrupt. Write '1' to
clear interrupt.
0
Set when the TIMER has generated
an interrupt. Write '1' to clear
interrupt.
0
Set when the PWM has generated
an interrupt. Write '1' to clear
interrupt.
0
Set when the SPI slave has
generated an interrupt. Write '1' to
clear interrupt.
0
Set when the SPI master has
generated an interrupt. Write '1' to
clear interrupt.
0
Set when the UART has generated
an interrupt. Write '1' to clear
interrupt.
0
Set after the completion of an ADC
conversion. Write '1' to clear
interrupt.
0
Set when the USB has generated an
interrupt after a timeout. Write '1'
to clear interrupt.
R/W1C
R/W1C
R/W1C
R/W1C
R/W1C
R/W1C
R/W1C
R/W1C
Table 2.10 Interrupt Status 1 Register
18
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.2.7
Clearance No.: FTDI# 483
PERIPHERAL_IEN1
Bit
Position
Bit Field Name
7
fifo_245_irq_ien
6
timer_irq_ien
5
pwm_irq_ien
4
spi_slave_irq_ien
3
spi_master_irq_ien
2
uart_irq_ien
1
0
Type
Reset
Description
0
Set to enable the 245 FIFO
interrupt.
R/W
0
Set to enable the TIMER interrupt.
R/W
0
Set to enable the PWM interrupt.
0
Set to enable the SPI_SLAVE
interrupt.
0
Set to enable the SPI_MASTER
interrupt.
R/W
0
Set to enable the UART interrupt.
io_cell_controller_irq_ien
R/W
0
Set to enable the ADC interrupt.
ft122_irq_ien
R/W
0
Set to enable the USB interrupt.
R/W
R/W
R/W
Table 2.11 Interrupt Enable 1 Register
2.2.8
PIN_CONFIG
Bit
Position
Bit Field Name
Type
Reset
Description
7..1
RFU
R
0
Reserved
0
vbus_detect_mode
R/W
0
When set shall enable Battery
Charge Detection mode.
Table 2.12 Pin Config Register
2.2.9
MTP_CONTROL
The MTP area can be written with program code that is copied into the Shadow RAM at power-on
or reset.
19
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Bit
Position
7
6
5
Bit Field Name
Type
R/W
copy_mtp_2_ram
R/W
flash_mtp_mem
mtp_byte_prog_done
4
mtp_mem_wr_failure
3..0
RFU
R1C
Reset
Description
0
When set to 1 this shall copy the
contents of MTP block in to Shadow
RAM. The core is held in RESET and
code will start from address 0x0000
on completion of the copy.
The bit is cleared on completion of
the copy therefore the bit shall
always read as zero.
0
When set to 1 this shall copy the
contents of the Shadow RAM in to
MTP memory.
The bit is cleared on completion of
the copy.
0
R
R
Clearance No.: FTDI# 483
Set when MTP BYTE write has
completed (See registers 0x2C,
0x2D, 0x2E). Cleared upon reading.
Note: This bit does NOT indicate
completion of a copy to MTP (see
bit 6)
0
Set when a write fail occurs. A fail
can occur if the MTP byte write fails
to update to the new value within a
set programming time defined
internally.
0
Reserved
Table 2.13 MTP Control Register
When the copy_mtp_2_ram operation is performed it is advised to read the mtp_byte_prog_done
register flag in MTP_CONTROL for completion. Then the status of the write can then be read from the
mtp_mem_wr_failure bit.
2.2.10 MTP_ADDR_L, MTP_ADDR_U and MTP_PROG_DATA
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
Data
R/W
0
Low byte of MTP Address
Table 2.14 MTP Address (Lower) Register
20
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Bit
Position
Bit Field Name
Type
Reset
7..6
Reserved
R/W
0
5..0
Data
R/W
0
Clearance No.: FTDI# 483
Description
High bytes of MTP Address
Table 2.15 MTP Address (Upper) Register
Bit
Position
Bit Field Name
Type
Reset
7..0
Data
R/W
0
Description
Table 2.16 MTP Data Register
The MTP_ADDR_L, MTP_ADDR_U and MTP_PROG_DATA registers allow byte write access to the MTP.
The address registers should be written to with the address in the MTP to be modified. A write to
the MTP_PROG_DATA register will initiate the MTP byte write sequence.
It is advised to read the mtp_byte_prog_done register flag in MTP_CONTROL for completion. Then the
status of the write can then be read from the mtp_mem_wr_failure bit.
Byte programming the MTP cannot be performed on the 63 bytes at 0x3FC0 to 0x3FFE. These are
protected. However, writing to byte 0x3FFF is permitted. See TOP_SECURITY_LEVEL register.
2.2.11 MTP_CRC_CTRL, MTP_CRC_RESULT_L and MTP_CRC_RESULT_U
Bit
Position
Bit Field Name
Type
Reset
Description
7..1
RFU
R
0
Reserved
0
When set shall perform a CRC of
the MTP array (not including top 64
bytes) and returns the 16-bit result
into the MTP_CRC_RESULT
registers.
R/W
CRC_EN
Table 2.17 MTP CRC Control Register
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
Data
R/W
0
LOWER byte of 16-bit CRC result.
Table 2.18 MTP CRC Result (Lower) Register
21
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
Data
R/W
0
UPPER byte of 16-bit CRC result.
Table 2.19 MTP CRC Result (Upper) Register
2.2.12 PIN_PACKAGE_CONFIG
There are 3 package pin configurations available, 48/44, 32 or 28 pins. This is a read-only register
that encodes the package type.
Bit
Position
7..6
5..0
Bit Field Name
Pin Configuration
RFU
Type
R
Reset
Description
7
6
Package pins
0
0
28
0
1
RFU
1
0
32
1
1
48/44
0
R
0
Reserved
Table 2.20 Pin Package Type Register
2.2.13 TOP_ SECURITY_LEVEL
There are 3 security levels built into the FT51A.
Security Level 0 (SL0) – No security. Reads and writes possible from Program Memory.
Security Level 1 (SL1) – Reads are blocked via debugger to certain address sectors.
Security Level 2 (SL2) – Debugger is completely disabled.
This is a read only register and reflects the security level of the chip.
22
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Bit
Position
Bit Field Name
Type
Reset
Description
7..5
RFU
R
0
Reserved
Clearance No.: FTDI# 483
Set to protect sector:
Start Address: 0x0000
End Address: 0x3FBF
4
3
Global_Bit
Sector_4
R
R
0
0
0= Sector level security applied as
per bits[3:0].
1= All sectors are SL2. Security
bits[3:0] are overridden.
Set to protect sector:
Start Address: 0x3000
End Address: 0x3FBF
0= Sector level is SL0.
1= Sector level is SL1.
2
Sector_3
R
0
Set to protect sector:
Start Address: 0x2000
End Address: 0x2FFF
0= Sector level is SL0.
1= Sector level is SL1.
1
Sector_2
R
0
Set to protect sector:
Start Address: 0x1000
End Address: 0x1FFF
0= Sector level is SL0
1= Sector level is SL1.
0
Sector_1
R
0
Set to protect sector:
Start Address: 0x0000
End Address: 0x0FFF
0= Sector level is SL0
1= Sector level is SL1.
Table 2.21 Top Level Security Register
The security level is set in the top MTP byte at address 0x3FFF. This allows the level of security for
the chip to be set.
The value stored in MTP has the same bitmap as this register. It is copied into this register after an
external reset or power on.
The top byte can only be written through a flash_mtp_mem operation from the MTP_CONTROL register.
This copies the entire Shadow RAM into MTP.
23
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The security bits are categorised as write forward, as once a particular level has been set it is not
possible to go back to a lower security level.
If the flash_mtp_mem operation is used then Shadow RAM byte 0x3FFF must contain the
security requirements for the chip. The address 0x3FFF should be reserved for this purpose.
Do not modify the values stored at Shadow RAM addresses 0x3FF8, 0x3FF9 and 0x3FFA.
These contain factory programmed values.
24
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.3 SPI Master
The Serial Peripheral Interface Bus is an industry standard communications interface. Devices
communicate in Master / Slave mode, with the Master initiating the data transfer.
The SPI Master module has seven signals:
-
Clock
4 Slave Select lines (numbered 0 to 3)
MOSI (master out – slave in)
MISO (master in – slave out).
The SPI Master protocol by default does not support any form of handshaking and the only
available mode is unmanaged. Data is clocked out of the Master and clocked in from the Slave
simultaneously.
Figure 2.1 SPI Master Schematic Diagram
The SPI interface has 4 unique modes of clock phase (CPHA) and clock polarity (CPOL), known as
Mode 0, Mode 1, Mode 2 and Mode 3. Table 2.29 summarizes these modes.
The registers associated with the SPI Master are outlined in Table 2.22. These are accessed using
IO_ADDR_x SFRs to set the address, and the corresponding IO_DATA_x SFR to read and write the
data.
25
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
I/O
Address
Register Name
Description
0x50
SPI_MASTER_CONTROL
SPI Master top level control register
0x51
SPI_MASTER_TX_DATA
Transmit data register
0x52
SPI_MASTER_RX_DATA
Receive data register
0x53
SPI_MASTER_IEN
Interrupt Enable register
0x54
SPI_MASTER_INT
Interrupt Status register
0x55
SPI_MASTER_SETUP
Setup register
0x56
SPI_MASTER_CLK_DIV
Clock divisor register
0x57
SPI_MASTER_DATA_DELAY
Data delay register
0x58
SPI_MASTER_SS_SETUP
Slave select setup register
0x59
SPI_TRANSFER_SIZE_L (LOWER)
Transfer size setup register – lower
byte
0x5A
SPI_TRANSFER_SIZE_U (UPPER)
Transfer size setup register – upper
byte
0x5B
SPI_MASTER_TRANSFER_PENDING
Transfer pending register
Table 2.22 SPI Master Register Addresses
The SPI Master module uses four wire interfaces: MOSI, MISO, CLK and SS#. There are four SS#
lines to control four different SPI Slave devices. The connection diagram is shown in Figure 2.1.
The main purpose is to send data from main memory to the attached SPI slave, and or to receive
data and send it to main memory. The SPI Master is controlled by the internal CPU using memory
mapped I/O registers. It operates from the main system clock, though sampling of input data and
transmission of output data is controlled by the SPI clock (CLK).
An SPI transfer can only be initiated by the SPI Master and begins with the slave-select signal
(SS#) being asserted by setting the spi_ss_n bit in SPI_MASTER_SETUP register. This is followed
by a data byte being clocked out with the master supplying CLK. Once the master has transferred
the desired number of bytes, it terminates the transaction by de-asserting slave-select. The SPI
Master can abort a transfer at any time by clearing the spi_ss_n bit to de-assert slave-select.
The CPU may control data transfer using the interrupts/status register SPI_MASTER_INT. Data
received by the SPI Master can be read from the SPI_MASTER_RX_DATA register, and data to be sent
out is written to the SPI_MASTER_TX_DATA register. In the case of data being sent from the Master,
there are bits indicating when there is space to write into the Tx holding register. Also, there is a
Tx-overrun bit (which is set when the user attempts to write data to a full Tx register), a bit
indicating whether the state machine is busy processing a transfer, and a Tx-done interrupt when
a byte has been sent. In the case of data received by the Master, the RX-full interrupt indicates
new data is available, and the Rx-overrun bit indicates that data has been received when the Rx
register was full.
The SPI Master module also supports transfers of predefined data packets. This performs
automatic control over SS#. The size of the transfer is specified in SPI_TRANSFER_SIZE_U and
SPI_TRANSFER_SIZE_L
registers,
and
a
completed
transfer
is
indicated
by
the
26
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
transfer_size_done_int interrupt in SPI_MASTER_INT. The SPI_MASTER_DATA_DELAY register must
be non-zero to use this method.
Data transfers can also be controlled by DMA: more details can be found in the DMA section of this
document.
2.3.1
SPI_MASTER_CONTROL
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
spi_master_dev_en
R/W
0
Enable SPI Master
0
spi_master_soft_reset
R/W
0
Reset SPI Master
Table 2.23 SPI Master Control Register
The SPI Master Control register provides top-level enable and reset functions for the SPI Master
module.
The SPI Master module is enabled by setting the spi_master_dev_en bit to 1. Clearing this bit will
disable the module.
To reset the module, a 1 is written to the spi_master_soft_reset bit. This is cleared when the reset
is performed and will therefore always read as ‘0’.
2.3.2
SPI_MASTER_TX_DATA
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
Data
R/W
0
Byte of data to clock out on SPI
Master bus.
Table 2.24 SPI Master Transmit Register
This register contains data to transmit from the Master to the Slave. Writing to this register will
start an SPI Master Write if a Slave Select (SS#) line is asserted.
2.3.3
SPI_MASTER_RX_DATA
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
Data
R
0
Byte of data to clocked in on SPI
Master bus.
Table 2.25 SPI Master Receive Register
Data transmitted from the Slave to the Master is stored in this register. This will contain the data
clocked from the Slave during the previous Master Write.
27
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.3.4
Clearance No.: FTDI# 483
SPI_MASTER_IEN
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
RFU
R
0
Reserved
5
transfer_size_done_ien
R/W
0
When set will enable
transfer_size_done_int
4
rx_oe_ien
R/W
0
When set will enable rx_oe_int
3
rx_full_ien
R/W
0
When set will enable rx_full_int
2
tx_oe_ien
R/W
0
When set will enable tx_oe_int
1
tx_done_ien
R/W
0
When set will enable tx_done_int
0
hold_txe_ien
R/W
0
When set will enable hold_txe_int
Table 2.26 SPI Master Interrupt Enable Register
This register will enable or disable interrupts from the SPI Master module. When enabled, an
interrupt in the SPI_MASTER_INT register will lead to a top-level peripheral interrupt in the
spi_master_irq bit in the PERIPHERAL_INT1 register.
28
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.3.5
Clearance No.: FTDI# 483
SPI_MASTER_INT
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
RFU
R
0
Reserved
5
transfer_size_done_int
R/W1C
0
Indicates when a transmission of the
SPI_MASTER_TRANSFER_SIZE bytes has
completed.
4
rx_oe_int
R/W1C
0
Indicates an Rx overrun error when
data is received and
SPI_MASTER_RX_DATA is still full.
If this occurs the new data is
discarded.
3
rx_full_int
R/W1C
0
Indicates a Rx data register interrupt
that SPI_MASTER_RX_DATA has new
data to be read out.
2
tx_oe_int
R/W1C
0
Indicates a Tx overrun error when
data is written to SPI_MASTER_TX_DATA
while the register is still full. If this
occurs the old data is overwritten.
1
tx_done_int
R/W1C
0
Indicates when a transmission has
completed. Set when the data in
SPI_MASTER_TX_DATA has been sent.
0
hold_txe_int
R/W1C
0
Indicates a Tx holding register
interrupt. Set when the holding
register is empty.
Table 2.27 SPI Master Interrupt Status Register
The status of each SPI Master module interrupt is read from this register. When an interrupt is
enabled and the interrupt is active then a top level peripheral interrupt in the spi_master_irq bit in
the PERIPHERAL_INT1 register is set.
Clearing an interrupt bit is achieved by writing a 1 to the corresponding bit field. Writing a zero has
no effect.
29
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.3.6
Clearance No.: FTDI# 483
SPI_MASTER_SETUP
Bit
Position
Bit Field Name
Type
Reset
Description
7..4
RFU
R
0
Reserved
3
spi_ss_n
R/W
1
SPI Slave Select. Used when the CPU
wishes to control a SS# signal. When
LOW is sets SS# active, when HIGH it
set it inactive.
2
lsbfirst
R/W
0
When HIGH, data is transferred LSB
first. When LOW, data is transferred
MSB first.
1
cpol
R/W
0
SPI Clock Polarity (CPOL) Bit - selects
the polarity of the SPI clk.
0
cpha
R/W
0
SPI Clock Phase (CPHA) Bit - selects
the phase of the SPI clk.
Table 2.28 SPI Master Setup Register
When transmitting data between SPI modules, both modules must be using the same CPOL and
CPHA values. A change to either of these bits aborts a transmission in progress and returns the
SPI system into an idle state.
Combined, the CPOL and CPHA settings make 4 modes that are listed in Table 8.
Mode 0 and 1: CPOL = 0, the base (inactive) level of SCLK is 0.
When CPHA = 0, data is clocked in on the rising edge of SCLK, and data is clocked out on the
falling edge of SCLK.
When CPHA = 1, data is clocked in on the falling edge of SCLK, and data is clocked out on the
rising edge of SCLK
Mode 2 and 3: CPOL =1, the base (inactive) level of SCLK is 1.
When CPHA = 0, data is clocked in on the falling edge of SCLK, and data is clocked out on the
rising edge of SCLK
When CPHA =1, data is clocked in on the rising edge of SCLK, and data is clocked out on the
falling edge of SCLK.
Mode
CPOL
CPHA
0
0
0
1
0
1
2
1
0
3
1
1
Table 2.29 SPI Master Mode Numbers
30
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The SPI Slave Select signal is enabled or disabled with the spi_ss_n bit. The spi_ss_n bit should
NOT be used in conjunction with SPI Transfer Size register.
Note: When spi_ss_n is de-asserted the cpol bit should NOT be toggled at the same time.
Note: The lsbfirst bit does not affect the order in which data is stored in the rx and tx
registers, simply the order in which data is transmitted and received.
2.3.7
SPI_MASTER_CLK_DIV
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
clk_div
R/W
0
Clock divider register to determine
the frequency of the SPI clk signal.
Table 2.30 SPI Master Clock Divisor Register
The SPI Master clock can operate up to one half of the CPU system clock:
CPU running at 48Mhz would set the SPI maximum clock to 24Mhz
CPU running at 24Mhz would set the SPI maximum clock to 12Mhz
CPU running at 12Mhz would set the SPI maximum clock to 6hMz
The SPI Master clock frequency can be calculated:
Fsclk = (Fclk / 2) / div
Fsclk - SPI Master clock frequency.
Fclk – CPU system clock frequency.
div – Clock divider.
If the CPU runs at 48MHz a divider value of both 0 and 1 will result in an SPI clock frequency of
24MHz.
2.3.8
SPI_MASTER_DATA_DELAY
Bit
Position
7..0
Bit Field Name
data_delay
Type
R/W
Reset
Description
0
Inserts a fixed delay between SS#
going active and the first SCLK cycle.
The value of this register is the
number of SCLK periods to delay.
For example, if SCLK is 100 kHz, a
value of 255 gives a delay of
2.55 ms.
Table 2.31 SPI Master Data Delay Register
It is recommended that this value is non-zero when using the Transfer Size feature for automatic
control over SS#.
31
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.3.9
Clearance No.: FTDI# 483
SPI_MASTER_SS_SETUP
Bit
Position
Bit Field Name
Type
Reset
Description
7..3
RFU
R
0
Reserved
2..1
ss_route
R/W
0
SPI Slave Select Route. Two bits set
the active slave select out of the 4
different slave selects.
0
ss_idle_state
R/W
1
SPI Slave Select Idle State.
Table 2.32 SPI Master Slave Select Setup
When setting the value of ss_idle_state: '1' sets an idle state of high, therefore SS# is active low;
'0' is an idle state of low, therefore SS# is active high.
2.3.10 SPI_MASTER_TRANSFER_SIZE
The SPI_MASTER_TRANSFER_SIZE register contains 16 bits and is split over 2 registers;
SPI_MASTER_TRANSFER_SIZE_L at 0x69, and SPI_MASTER_TRANSFER_SIZE_U at 0x6A.
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
xfer_size_l
R/W
0
Lower 8 bits of transfer size register.
Table 2.33 SPI Master Transfer Size (Lower) Register
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
xfer_size_u
R/W
0
Upper 8 bits of transfer size register.
Table 2.34 SPI Master Transfer Size (Upper) Register
This allows the hardware to auto-control the assertion and de-assertion of slave select. Set the
lower byte first and then the upper byte. The SPI_MASTER_DATA_DELAY must be programmed with a
non-zero value when using these registers for automatic control over SS#.
Setting both bytes to 0 will abort a transfer in process.
If the transfer size is non-zero then the spi_ss_n bit in Section 0 should be set to ‘1’ (inactive).
32
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.3.11 SPI_MASTER_TRANSFER_PENDING
Bit
Position
Bit Field Name
Type
Reset
Description
7..1
RFU
R
0
Reserved
0
transfer_pending
R
0
The live status of the SPI Master. Set
to '1' when the SPI Master is busy
servicing a prior request.
Table 2.35 SPI Master Transfer Pending Register
The transfer_pending bit reports the status of the SPI Master in real time.
2.3.12 Use Cases
The SPI Master can be used in the following ways:
As a polled interface – writing a single byte at a time to the transmit register and reading single
byte responses from the receive register.
As an interrupt driven interface – an interrupt handler sends multiple bytes of data to the transmit
register and receives a corresponding amount of data from the receive register.
A DMA driven interface – two DMA engines are configured to send data to, and receive data from,
the SPI slave. Program code is not required to perform any actions during a transfer.
2.3.12.1 Interface Setup
To setup the SPI Master, go through the following steps:
1. Reset the SPI Master in the SPI_MASTER_CONTROL register.
2. Enable the SPI Master in the SPI_MASTER_CONTROL register.
3. Set the required frequency of SCLK via the clock divisor in the SPI_MASTER_CLK_DIV register.
4.
5.
6.
7.
Setup the SPI Master Mode and bit order as required in the SPI_MASTER_SETUP register.
Leave the Slave Select line inactive.
Set the desired Slave Select line and idle state in the SPI_MASTER_SS_SETUP register.
The interface is now ready to use.
Enabling and Disabling Slave Select:
Manual control over SS# is performed by enabling or disabling SS# under program control via the
spi_ss_n bit of the SPI_MASTER_SETUP register. The SPI_MASTER_TRANSFER_SIZE_L and
SPI_MASTER_TRANSFER_SIZE_U registers must be zero for this method.
Alternatively, automatic control (where the amount of data to transfer is known in advance) is
done by leaving the Slave Select line inactive and programming the number of bytes to transfer
into the SPI_MASTER_TRANSFER_SIZE registers. SS# is enabled when data is next written to the
SPI_MASTER_TX_DATA register and disabled automatically. To correctly enable SS# at the start of a
transfer program a non-zero value must be programmed into the SPI_MASTER_DATA_DELAY register.
Here is an example SPI Master setup that uses WRITE_IO_REG macro defined in 5.1.2.
WRITE_IO_REG(0x0050,
WRITE_IO_REG(0x0050,
WRITE_IO_REG(0x0056,
WRITE_IO_REG(0x0058,
|
WRITE_IO_REG(0x0055,
|
|
0x01); // Reset to a known state
0x02); // Enable SPI Master device before any setup not after.
0x60); // Divide the FT51A system clock by 0x60
1 << 0x00
// Set SS Idle State to High,
0 << 0x01); // Set SS number to 0
0 << 0x00
// Set SCLK phase to 0
0 << 0x01
// Set SCLK polarity to 0
0 << 0x02
// Set data order to MSB
33
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
| 1 << 0x03); // Set SS high, i.e. deactivate it
2.3.12.2 Polled Interface
The SPI Master device is used as a polled interface sending a command to an SPI slave and
reading a response.
1. Enable the Slave Select method required.
2. For each byte of data:
a. Write a byte to send to the slave into the SPI_MASTER_TX_DATA register.
b. Poll the SPI_MASTER_TRANSFER_PENDING register until the pending bit clears.
c. Read a byte from the slave from the SPI_MASTER_RX_DATA register.
3. Disable Slave Select.
The polled interface is useful for low-speed transactions where there are small amounts of data to
receive from, or send to, the SPI slave. It is particularly useful when there are decisions to be
taken depending on the contents of data returned from the SPI slave.
2.3.12.3 Interrupt Interface
An interrupt handler can be employed to speed up transmission and reception of multiple bytes of
data. This method requires the code to send the first byte of data to the SPI slave and an interrupt
handler routine to send subsequent bytes of data. The interrupt handler will also receive the data
returned from the SPI slave.
To setup an interrupt routine:




Clear the tx_done_int bit in the SPI_MASTER_INT register.
Enable the interrupt in the tx_done_ien in the SPI_MASTER_IEN register.
Initialise the buffer to transmit and buffer to receive data for use by the interrupt handler
routine.
o Enable the Slave Select method required.
o Write the first byte of data to the SPI_MASTER_TX_DATA register.
o Wait for the interrupt handler to signal that the transfer is complete.
o Disable Slave Select.
o Within the interrupt handler:

Check for tx_done_int bit in the SPI_MASTER_INT register to be set and
tx_done_ien in the SPI_MASTER_IEN register to be set.

Read a byte of data from the slave from the SPI_MASTER_RX_DATA register
and place it in the receive buffer.
Clear the tx_done_int bit in the SPI_MASTER_INT register.
If there is data still to transfer, write the next byte of the transmitting buffer to the
SPI_MASTER_TX_DATA register. If the transfer is complete, signal, transfer complete.
This method is useful for most transfers of data to and from an SPI slave. It is still under program
control so decisions on data flow can be made within the interrupt handler. It is, however,
recommended to have a minimum of code in any interrupt handler. An example Interrupt Service
Routine is presented below.
//ISR
void SPIM_interrupt_handler()
{
READ_IO_REG(0x54, SPIM_interrupt); //SPI_MASTER_STAT_1
if(SPIM_interrupt & (0x1<<3)) //Check for RX_FULL interrupt
{
SPIM_num_bytes_tx--;
READ_IO_REG(0x52, *SPIM_MISO_buf); //SPI_MASTER_DATA_RX_ADDR_1
34
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
SPIM_MISO_buf++;
WRITE_IO_REG(0x54, 0x1<<3); //Clear RX_FULL interrupt
}
if(SPIM_interrupt & 0x1) // Check for TX_HOLD interrupt
{
if(SPIM_num_bytes_tx > 1)
{
WRITE_IO_REG(0x51, *SPIM_MOSI_buf); //SPI_MASTER_DATA_TX_ADDR_1
SPIM_MOSI_buf++;
}
WRITE_IO_REG(0x54, 0x1); //Clear TX_HOLD interrupt
}
}
//It is up to the user to define the variables,
//initialise transfer and check if all bytes have been sent as follows:
//Variables
volatile uint8_t
SPIM_interrupt;
volatile uint16_t
SPIM_num_bytes_tx;
volatile uint8_t
*SPIM_MISO_buf;
volatile uint8_t
*SPIM_MOSI_buf;
//Initialise transfer
WRITE_IO_REG(0x51, *SPIM_MOSI_buf); //SPI_MASTER_DATA_TX_ADDR_1
SPIM_MOSI_buf++;
//Wait until all bytes have been sent by ISR
while(SPIM_num_bytes_tx != 0);
2.3.12.4 DMA Interface
Data transfers can also be controlled by DMA. Below is the sequence of steps required to control
transfer via DMA. Additional details on how to configure DMAs can be found in the DMA section of
this document.
1.
2.
3.
4.
5.
6.
7.
8.
9.
Initialise DMA;
Acquire DMA PUSH (Tx) and PULL (Rx) engines;
Configure DMA source, destination, data size, mode and function;
Activate Slave Select;
Enable the Rx DMA (nothing will happen yet);
Enable the Tx DMA (this starts both transfers);
Wait for the Tx DMA transfer to complete;
Wait for the Rx DMA transfer to complete (this will happen almost immediately);
Deactivate Slave Select;
At the end of the transfer, the master and slave will have exchanged data.
35
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.4 SPI Slave
The Serial Peripheral Interface Bus is an industry standard communications interface. Devices
communicate in Master or Slave modes, with the Master initiating the data transfer.
The SPI Slave module has four signals:
-
Clock
Slave Select
MOSI (master out – slave in)
MISO (master in – slave out).
The SPI Slave protocol by default does not support any form of handshaking and the only available
mode is unmanaged. Data is clocked out of the Master and clocked in from the Slave
simultaneously.
CLK
SS#
External - SPI Master
SPI Slave
MOSI
MISO
Figure 2.2 SPI Slave Schematic Diagram
The registers associated with the SPI Slave are outlined in Table 2.36.
I/O
Address
Register Name
Description
0x48
SPI_SLAVE_CONTROL
SPI Slave Control Register
0x4A
SPI_SLAVE_DATA_TX
Transmit data register
0x4B
SPI_SLAVE_DATA_RX
Receive data register
0x4C
SPI_SLAVE_IEN
Interrupt Enable register
0x4D
SPI_SLAVE_INT
Interrupt Status register
0x4E
SPI_SLAVE_SETUP
Setup register
Table 2.36 SPI Slave Register Addresses
The SPI Slave module uses a four wire interface: MOSI, MISO, CLK and SS# as shown in Figure
2.2
The main purpose is to send data from main memory to the attached SPI master, and or receive
data and send it to main memory. The SPI Slave is controlled by the internal CPU using internal
memory-mapped I/O registers. It operates from the main system clock, although sampling of
input data and transmission of output data is controlled by the SPI clock (CLK). An SPI transfer
can only be initiated by the SPI Master and begins with the slave select signal being asserted. This
36
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
is followed by a data byte being clocked out with the master driving CLK. The master always
supplies the first byte, which is called a command byte. After this the desired number of data
bytes are transferred before the transaction is terminated by the master de-asserting slave select.
An SPI Master is able to abort a transfer at any time by de-asserting its SS# output. This will
cause the Slave to end its current transfer and return to an idle state.
Data transfer can be controlled by the CPU using interrupts/status register SPI_SLAVE_INT. Data
sent to the SPI Slave block can be read out from the SPI_SLAVE_RX register and data to be sent out
has to be written to the SPI_SLAVE_TX register. In case of data being sent from the block there are
bits indicating when there is space to write into the Tx holding register. Also, there is a Tx overrun
bit which is set when data is attempted to be written to a full Tx register, a bit indicating whether
the state machine is busy processing a transfer and a Tx done interrupt when a byte has been
sent. In the case of data to be received by the block there is a RX full interrupt indicating new data
to be read out by the CPU and Rx overrun bit that indicates that data has been received when RX
register was full.
Data transfers can also be controlled by DMA. More details on how to configure DMAs to work with
the SPI Slave block can be found in the DMA section of this document.
2.4.1
SPI_SLAVE_CONTROL
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
spi_slave_dev_en
R/W
0
Enable SPI Slave
0
spi_slave_soft_reset
R/W
0
Reset SPI Slave
Table 2.37 SPI Slave Control Register
The SPI Slave Control register provides top-level enables and reset functions for the SPI Slave
module.
The SPI Slave module is enabled by setting the spi_slave_dev_en bit to 1. Clearing this bit will
disable the module.
To reset the module, a 1 is written to the spi_slave_soft_reset bit. This is cleared when the reset
is performed and will therefore always read as ‘0’.
2.4.2
SPI_SLAVE_TX_DATA
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
Data
R/W
0
Byte of data to be transmitted from
the SPI Slave module
Table 2.38 SPI Slave Transmit Register
This register contains data to be transmitted from the Slave to the Master.
37
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.4.3
Clearance No.: FTDI# 483
SPI_SLAVE_RX_DATA
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
Data
R
0
Byte of data received by the SPI
Slave module
Table 2.39 SPI Slave Receive Register
This register contains data that was sent from the SPI Master.
2.4.4
SPI_SLAVE_IEN
Bit
Position
Bit Field Name
Type
Reset
Description
7..5
RFU
R
0
Reserved
4
rx_oe_ien
R/W
0
When set will enable rx_oe_int
3
rx_full_ien
R/W
0
When set will enable rx_full_int
2
tx_oe_ien
R/W
0
When set will enable tx_oe_int
1
tx_done_ien
R/W
0
When set will enable tx_done_int
0
hold_txe_ien
R/W
0
When set will enable hold_txe_int
Table 2.40 SPI Slave Interrupt Enable Register
This register will enable or disable interrupts from the SPI Slave module. When enabled, an
interrupt in the SPI_SLAVE_INT register will lead to a top-level peripheral interrupt in the
spi_slave_irq bit in the PERIPHERAL_INT1 register.
38
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.4.5
Clearance No.: FTDI# 483
SPI_SLAVE_INT
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
RFU
R
0
Reserved
5
tx_busy
R
0
Indicates the module is busy
processing a transfer
4
rx_oe_int
R/W1C
0
Indicates a RX overrun error when
data is received and the
SPI_SLAVE_RX_DATA register is
still full. If this occurs the new data
is discarded.
3
rx_full_int
R/W1C
0
Indicates a Rx data register
interrupt that SPI_SLAVE_RX_DATA
has new data to be read out.
2
tx_oe_int
R/W1C
0
Indicates a Tx overrun error when
data is written to the
SPI_SLAVE_TX_DATA register while
the register is still full. If this occurs
the old data is overwritten.
1
tx_done_int
R/W1C
0
Indicates when a transmission has
completed. Set when the data in
SPI_SLAVE_TX_DATA has been sent.
0
hold_tx_int
R/W1C
0
Indicates a Tx holding register
interrupt. Set when the holding
register is empty.
Table 2.41 SPI Slave Interrupt Status Register
The status of each SPI Slave module interrupt is read from this register. When an interrupt is
enabled and the interrupt is active then a top level peripheral interrupt in the spi_slave_irq bit in
the PERIPHERAL_INT1 register is set.
Clearing an interrupt bit is achieved by writing a 1 to the corresponding bit field. Writing a zero has
no effect.
39
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.4.6
Clearance No.: FTDI# 483
SPI_SLAVE_SETUP
Bit
Position
Bit Field Name
Type
Reset
Description
7..3
RFU
R
0
Reserved
2
lsbfirst
R/W
0
When HIGH, data is transferred LSB
first. When LOW, data is transferred
MSB first.
1
Cpol
R/W
0
SPI Clock Polarity (CPOL) Bit selects the polarity of the SPI clk.
0
Cpha
R/W
0
SPI Clock Phase (CPHA) Bit - selects
the phase of the SPI clk.
Table 2.42 SPI Slave Setup Register
When transmitting data between SPI modules, both modules must be using the same CPOL and
CPHA values. A change to either of these bits aborts a transmission in progress and returns the
SPI system into an idle state.
Combined, the CPOL and CPHA settings make 4 modes that are listed in Table 5.
Mode 0 and 1: CPOL = 0, the base (inactive) level of SCLK is 0.


When CPHA = 0, data is clocked in, on the rising edge of SCLK, and data is clocked out, on
the falling edge of SCLK.
When CPHA = 1, data is clocked in, on the falling edge of SCLK, and data is clocked out,
on the rising edge of SCLK
Mode 2 and 3: CPOL = 1, the base (inactive) level of SCLK is 1.


When CPHA = 0, data is clocked in, on the falling edge of SCLK, and data is clocked out,
on the rising edge of SCLK
When CPHA = 1, data is clocked in, on the rising edge of SCLK, and data is clocked out, on
the falling edge of SCLK.
Mode
CPOL
CPHA
0
0
0
1
0
1
2
1
0
3
1
1
Table 2.43 SPI Slave Mode Numbers
Note: The lsbfirst bit does not affect the order, in which data is stored in the rx and tx
registers, simply the order in which data is transmitted and received.
40
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.5 I2C Master
The I2C is an industry standard communications interface. Devices communicate in Master or Slave
mode, with the Master initiating the data transfer.
The I2C Master module has two signals:
-
Clock (SCL)
Data (SDA)
The I2C Master transmits any data by prefixing it with an I2C Slave address. The Least Significant
Bit of the address specifies a Read or Write operation.
SCL
External I2C Slave
2
I C Master
SDA
Figure 2.3 I2C Master Schematic Diagram
The registers associated with the I2C Master are outlined in Table 2.44. These are accessed using
SFRs directly.
SFR
Address
Register Name
Description
0xF4
I2CMSA
Slave Address register.
0xF5
I2CMCR
Control register (write operation).
0xF5
I2CMSR
Status register (read operation).
0xF6
I2CMBUF
Transmitted/received data register.
0xF7
I2CMTP
Timer period register.
Table 2.44 I2C Master Register Addresses
2.5.1
I2CMSA
Bit
Position
Bit Field Name
Type
Reset
Description
7..1
Addr
R/W
0
Slave address MSB bits 7..1
0
R/S
R/W
0
Receive/Send
Table 2.45 I2C Master Slave Address Register
The Slave Address register sets the address of the I2C Slave. The most significant 7 bits of the
address are set in this register. The least significant bit is ‘1’ for a receive transaction or ‘0’ for a
send transaction.
41
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.5.2
Clearance No.: FTDI# 483
I2CMCR
The I2C Master Control register is accessed only during a write. If this register is read then it will
return the status value of the I2CMSA register.
Bit
Position
Bit Field Name
Type
Reset
Description
7
RSTB
W1T
0
Triggers a reset of the I2C Master
module.
6
SLRST
W1T
0
Performs a slave reset.
5
ADDR
W1T
0
Slave Address
4
HS
W1T
0
High-speed mode
3
ACK
W1T
0
Acknowledgment
2
STOP
W1T
0
When set, causes a stop after the first
data cycle. When clear, will allow
transfers to continue on to a burst.
1
START
W1T
0
When set, causes generation of
START or REPEATED START condition.
0
RUN
W1T
0
Run condition
Table 2.46 I2C Master Control Register
To reset a bus blocked by an I2C Slave device set SLRST and RUN. This will generate 9 SCKs and a
STOP.
42
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.5.3
Clearance No.: FTDI# 483
I2CMSR
The I2C Master Status register is accessed only during a read operation.
Bit
Position
Bit Field Name
Type
Reset
Description
7
Reserved
RFU
0
Reserved
6
BUS_BUSY
R
0
Indicates that the Bus is Busy, and
access is not possible; set/reset by
START and STOP conditions
5
IDLE
R
0
Indicates that the I2C Bus controller is
in the idle state
4
ARB_LOST
R
0
Indicates that due to the last
operation, the I2C Bus controller lost
the arbitration
3
DATA_ACK
R
0
Indicates that due to the last
operation the transmitted data was
not acknowledged
2
ADDR_ACK
R
0
Indicates that due to the last
operation the slave address was not
acknowledged
0
Indicates that due to the last
operation an error occurred: slave
address was not acknowledged,
transmitted data was not
acknowledged, or the I2C Bus
controller lost the arbitration
0
Indicates that the I2C Bus controller
receiving, or transmitting data on the
bus, and other bits of the Status
register are not valid
1
R
ERROR
0
R
BUSY
Table 2.47 I2C Master Status Register
2.5.4
I2CMBUF
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
data
R/W
0
Data register.
Table 2.48 I2C Master Data Buffer Register
The I2CMBUF register when read contains the data received during the last read operation. When
written the data in the register will be transmitted on the next send operation.
43
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.5.5
Clearance No.: FTDI# 483
I2CMTP
Bit
Position
Bit Field Name
Type
Reset
Description
7
HS_TIMER_SELECT
R/W
0
Set to select the timer period register
for HIGH speed I2C Master.
Clear for timer period register for
STANDARD, FAST and FAST+.
6..0
timer
R/W
0x01
Timer Period register.
Table 2.49 I2C Master Timer Period Register
Fscl = Fclk / (2 * (1 + timer) * 10)
Fscl – I2C Master clock frequency.
Fclk – CPU system clock frequency.
timer – Timer period divider.
The I2C Master will automatically adopt the relevant I2C mode (STANDARD, FAST, FASTPLUS, HIGH-SPEED) depending on the SCL frequency calculated. The maximum
frequency is limited to the lesser of one tenth of the system clock frequency or
3,400,000Hz. This will support the standard I2C modes:

100 kbit/s standard

400 kbit/s Fast

1 Mbit/s Fast+

3.4 Mbit/s High Speed
If the system clock frequency is changed then the value in this register will need to be recalculated
to ensure correct operation.
2.5.6
Use Case
The I2C Master can process single bytes or bursts of an indeterminate length from the I2C Slave.
2.5.6.1 Interface Setup
To setup the I2C Master the following steps have to be performed:


The I2C Master must first be reset by writing a ‘1’ to the RSTB bit in the I2CMCR register.
Set the frequency via the I2CMTP register.
// Reset I2C Master block
I2CMCR |= 0x80;
__asm NOP __endasm;
// Set freqency
I2CMTP = 0x20;
__asm NOP __endasm;
44
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.5.6.2 Send Data
To send data to an I2C Slave the following procedure is used:


For a single cycle:
o Write the slave address to the I2CMSA register and set bit R/S to 0.
o Write the first byte of data to the I2CMBUF register.
o Write to the Control Register I2CMCR with HS=0, STOP=1, START=1, RUN=1.
o Read the I2CMSR register until the BUSY bit is clear.
For multiple cycles:
o Write the slave address to the I2CMSA register and set bit R/S to 0.
o Write the first byte of data to the I2CMBUF register.
o Write to the Control Register I2CMCR with HS=0, STOP=0, START=1, RUN=1.
o Read the I2CMSR register until the BUSY bit is clear.
o For remaining bytes (except last byte):

Write the next byte of data to the I2CMBUF register.

Write to the Control Register HS=0, STOP=0, START=1, RUN=1.

Read the I2CMSR register until the BUSY bit is clear.
o Write the last byte of data to the I2CMBUF register.
o Write to the Control Register I2CMCR with HS=0, STOP=1, START=1, RUN=1.
o Read the I2CMSR register until the BUSY bit is clear.
To allow a burst write, change STOP bit to 0.
uint8_t
data;
// Set I2C Slave Address
I2CMSA = 0x22<<1;
__asm NOP __endasm;
I2CMBUF = data;
I2CMCR = 0x04 | 0x02 | 0x01; // I2C_FLAGS_STOP | I2C_FLAGS_START | I2C_FLAGS_RUN
__asm NOP __endasm;
__asm NOP __endasm;
__asm NOP __endasm;
do
{ // loop while busy
status = I2CMCR;
if (!(status & 0x01)) //I2C_STATUS_BUSY
{
if (status & 0x02) //I2C_STATUS_ERROR
return 0;
return 1;
}
}while( 1 );
2.5.6.3 Receive Data
To receive data from an I2C Slave the following procedure is used:


For single cycle:
o Write the slave address to the I2CMSA register and set bit R/S to 1.
o Write to the Control Register I2CMCR with HS=0, ACK=1, STOP=1, START=1, RUN=1.
o Read the I2CMSA register until the BUSY bit is clear.
o Read the first byte of data from the I2CMBUF register.
For multiple cycles:
o Write the slave address to the I2CMSA register and set bit R/S to 1.
o Write to the Control Register I2CMCR with HS=0, ACK=1, STOP=0, START=1, RUN=1.
45
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
o
o
o
o
o
o
uint8_t
uint8_t
Clearance No.: FTDI# 483
Read the I2CMSA register until the BUSY bit is clear.
Read the first byte of data from the I2CMBUF register.
For the remaining bytes (except the last byte):

Write to the Control Register I2CMCR with HS=0, ACK=1, STOP=0, START=1,
RUN=1.

Read the I2CMSA register until the BUSY bit is clear.

Read the next byte of data from the I2CMBUF register.
Write to the Control Register I2CMCR with HS=0, ACK=0, STOP=1, START=1, RUN=1.
Read the I2CMSA register until the BUSY bit is clear.
Read the last byte of data from the I2CMBUF register.
data;
nFlagData;
// Set I2C Slave Address
I2CMSA = 0x22<<1 | 0x01; \\I2C_READ_NOT_WRITE
__asm NOP __endasm;
do
{ // loop while busy
status = I2CMCR;
if (!(status & 0x01)) //I2C_STATUS_BUSY
{
if (status & 0x02) //I2C_STATUS_ERROR
return 0;
return 1;
}
}while( 1 );
I2CMCR
= 0x04 | 0x02 | 0x01; // I2C_FLAGS_STOP | I2C_FLAGS_START | I2C_FLAGS_RUN
do
{ // loop while busy
status = I2CMCR;
if (!(status & 0x01)) //I2C_STATUS_BUSY
{
if (status & 0x02) //I2C_STATUS_ERROR
return 0;
return 1;
}
}while( 1 );
data = I2CMBUF;
nFlagData = I2CMCR;
I2CMCR = nFlagData & ~0x08; // clear ack'ing
46
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.6 I2C Slave
The I2C Slave is an industry standard communications interface. Devices communicate in Master or
Slave mode, with the Master initiating the data transfer.
The I2C Slave module has two signals:
-
Clock (SCL)
Data (SDA)
The I2C Slave responds to an address transmitted by the I2C Master that prefixes any data
transferred. The Least Significant Bit of the address specifies Read or Write operation.
The I2C Slave is a polled interface. It will return data and acknowledge a read to the master only
when data has been written to the I2C Slave data register. Likewise, the I2C Slave will not
acknowledge a write by the master until data has been read from the I2C Slave data register.
SCL
External I2C Master
I2C Slave
SDA
Figure 2.4 I2C Slave Schematic Diagram
The registers associated with the I2C Slave are outlined in Table 2.50. These are accessed using
SFRs directly.
SFR
Address
Register Name
Description
0xF1
I2CSOA
Own Address register.
0xF2
I2CSCR
Control register (write operation).
0xF2
I2CSSR
Status register (read operation).
0xF3
I2CSBUF
Transmitted/received data
register.
Table 2.50 I2C Slave Register Addresses
2.6.1
I2CSOA
Bit
Position
Bit Field Name
Type
Reset
Description
7
Reserved
RFU
0
Reserved
6..0
addr
R/W
0
Own address bits 7..1. Note that own
address bit zero indicates direction.
Table 2.51 I2C Slave Address Register
47
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The Own Address register sets the address that the I2C Slave will respond to. The most significant
7 bits of the address are set in this register. The least significant bit is ‘1’ for a read by the I2C
Master or ‘0’ for a write.
2.6.2
I2CSCR
2
The I C Slave Control register is accessed only during a write operation. If this register is read
then it will return the value of the I2CSSR register.
Bit
Position
Bit Field Name
Type
Reset
Description
7
RSTB
W
0
Reset of I2C Slave function.
6
DA
W
0
Activate I2C Slave device.
5..4
Reserved
RFU
0
Reserved
3
RECFINCLR
W
0
Clear RECFIN bit in I2CSSR register.
2
SENDFINCLR
W
0
Clear SENDFIN bit in I2CSSR register.
1..0
Reserved
RFU
0
Reserved
Table 2.52 I2C Slave Control Register
The I2C Slave Control register provides top-level enables and reset functions for the I2C Slave
module. It allows the status of RECFIN and SENDFIN to be cleared in the I2CSSR (I2C Slave Status)
register.
2.6.3
I2CSSR
2
The I C Slave Status register is accessed only during a read operation.
Bit
Position
Bit Field Name
Type
Reset
Description
7
Reserved
RFU
0
Reserved
6
DA
R
0
I2C Slave activated.
5
Reserved
RFU
0
Reserved
4
BUSACTIVE
R
0
Send, receive, or address detection in
progress.
This
bit
is
cleared
automatically at the end of a transfer.
0
The I2C Master has completed a
transmit operation. Cleared by writing
‘1’ to RECFINCLR in the I2CSCR
register.
0
The I2C Master has completed a
receive operation. Cleared by writing
‘1’ to SENDFINCLR in the I2CSCR
register.
3
2
RECFIN
SENDFIN
R
R
48
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
1
TREQ
0
R
RREQ
R
Clearance No.: FTDI# 483
0
The I2C Slave has been addressed for
a read operation by the I2C Master
and must send a byte of data. This bit
is automatically cleared by a write to
I2CSBUF.
0
The I2C Slave has been addressed for
a write operation by the I2C Master
and must receive a byte of data. This
bit is automatically cleared by a read
from I2CSBUF.
Table 2.53 I2C Slave Status Register
When the SENDFIN and RECFIN bits are set then the I2C Slave asserts an interrupt to the EIE SFR.
2.6.4
I2CSBUF
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
data
R/W
0
Data register.
Table 2.54 I2C Slave Data Buffer Register
Writing to the I2C Slave Data register when TREQ is set in the I2CSCR register will send the byte of
data to the I2C Master. Conversely, reading the I2C Slave Data register when RREQ is set will
acknowledge a transmission from the I2C Master.
2.6.5
Use Case
The I2C Slave can process single bytes or bursts of an indeterminate length from the I2C Master.
The interrupts generated by the I2C Slave are for RECFIN and SENDFIN. These can be used for
chaining burst reads and writes efficiently using an interrupt handler. However, to detect when a
master has addressed the I2C Slave interface it is necessary to poll the TREQ and RREQ bits in the
I2CSSR register.
2.6.5.1 Interface Setup
To setup the I2C Slave the Own Address register must be written before the interface is activated.


Write the slave address to the I2CSOA register.
Enable the I2C Slave function by setting DA and clearing RSTB in the I2CSCR register. The
value 0x7F can be used.
2.6.5.2 Send Data
To send data to an I2C Master the following procedure is used:

For each byte of data:
o If I2CSCR register bit TREQ set to ‘1’:

Write byte of data to I2CSBUF.
o If I2CSSR register bit SENDFIN set to ‘1’:

Clear SENDFIN bit setting SENDFINCLR bit in write to I2CSCR.

Finish transaction.
This will allow a burst read to occur on the I2C Master. The master controls how many bytes will be
read from the I2C Slave.
49
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.6.5.3 Receive Data
To receive data from an I2C Master the following procedure is used:

For each byte of data:
o If I2CSCR register bit RREQ set to ‘1’:

Read byte of data from I2CSBUF.
o If I2CSCR register bit RECFIN set to ‘1’:

Clear RECFIN bit by setting RECFINCLR bit in write I2CSCR.

Finish transaction.
This will allow a burst write to occur on the I2C Master. The master controls how many bytes will
be written to the I2C Slave.
50
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.7 UART
The UART block provides:

Full RS232 support;

Baud Rate Generator;

Optional hardware flow control via RTS / CTS and DTR / DSR;

Optional DMA support
The registers associated with the UART are outlined in Table 2.55.
I/O
Address
Register Name
Description
0x60
UART_CONTROL
UART control register
0x61
UART_DMA_CTRL
UART DMA control register
0x62
UART_RX_DATA
UART Receive Data register
0x63
UART_TX_DATA
UART Transmit Data register
0x64
UART_TX_IEN
UART Tx Status Enable register
0x65
UART_TX_INT
UART Tx Status Register
0x66
UART_RX_IEN
UART Rx Status Enable Register
0x67
UART_RX_INT
UART Rx Status Register
0x68
UART_LINE_CTRL
UART Line Control Register
0x69
UART_BAUD_0
UART Baud Rate Register – lower
byte
0x6A
UART_BAUD_1
UART Baud Rate Register – middle
byte
0x6B
UART_BAUD_2
UART Baud Rate Register – upper
byte
0x6C
UART_FLOW_CTRL
UART Flow Control Register
0x6D
UART_FLOW_STAT
UART Flow Control Status Register
Table 2.55 UART Register Addresses
51
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.7.1
Clearance No.: FTDI# 483
UART_CONTROL
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
uart_dev_en
R/W
0
Write 1 to Enable UART
0
uart_soft_reset
R/W
0
Write 1 to Reset UART
Table 2.56 UART Control Register
The UART Control register provides top-level enables and reset functions for the UART module.
The UART module is enabled by setting the uart_dev_en bit to 1. Clearing this bit will disable the
module.
To reset the module, a 1 is written to the uart_soft_reset bit. This is cleared when the reset is
performed and will therefore always read as ‘0’.
2.7.2
UART_DMA_CTRL
Bit
Position
Bit Field Name
Type
Reset
Description
7..1
Reserved
RFU
0
Reserved
Write 1 to enable DMA mode.
0
R/W
uart_dma_en
0
Data can be transferred using DMA
when enabled.
See Section 0 for more details on
DMA.
Table 2.57 UART DMA Control Register
2.7.3
UART_RX_DATA
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
UART_RX_DATA
R/W
8’h00
Data received by the UART
Table 2.58 UART Data Receive Register
2.7.4
UART_TX_DATA
Bit
Position
Bit Field Name
Type
Reset
7..0
UART_TX_DATA
R/W
8’h00
Description
Data to be transmitted by the UART.
Data is transmitted automatically by
writing to this register
Table 2.59 UART Data Transmit Register
52
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.7.5
Clearance No.: FTDI# 483
UART_TX_IEN
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
Reserved
RFU
0
Reserved
5
dcd_ien
R/W
0
Interrupt enable bit for dcd_int
4
ri_ien
R/W
0
Interrupt enable bit for ri_int
3
dsr_ien
R/W
0
Interrupt enable bit for dsr_int
2
cts_ien
R/W
0
Interrupt enable bit for cts_int
1
tx_done_ien
R/W
0
Interrupt enable bit for tx_done_int
0
hold_txe_ien
R/W
0
Interrupt enable bit for hold_txe_int
Table 2.60 UART Transmit Status Interrupt Enable Register
2.7.6
UART_TX_INT
Bit
Position
Bit Field Name
Type
Reset
Description
7
Reserved
RFU
0
Reserved
6
tx_busy
RO
0
Set when the UART is transmitting
data
5
dcd_int
R/W1C
0
Set on any change in the state of the
Data_Carrier_Detect signal
4
ri_int
R/W1C
0
Set on any change in the state of the
Ring_Indicator signal
3
dsr_int
R/W1C
0
Set on any change in the state of the
Data_Set_Ready signal
2
cts_int
R/W1C
0
Set on any change in the state of the
Clear_To_Send signal
1
tx_done_int
R/W1C
0
Set when the UART has completed a
transfer
0
hold_txe_int
R/W1C
0
Set high when the Tx buffer becomes
empty
Table 2.61 UART Transmit Status Interrupt Register
53
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.7.7
Clearance No.: FTDI# 483
UART_RX_IEN
Bit
Position
Bit Field Name
Type
Reset
Description
7..5
Reserved
RFU
0
Reserved
4
break_rcvd_ien
R/W
0
Enable bit for break_rcvd_int
interrupt
3
stop_error_ien
R/W
0
Enable bit for stop_error_int
interrupt
2
parity_error_ien
R/W
0
Enable bit for parity_error_int
interrupt
1
rx_overflow_ien
R/W
0
Enable bit for rx_overflow_int
interrupt
0
rx_full_ien
R/W
0
Enable bit for rx_full_int interrupt
Table 2.62 UART Receive Status Interrupt Enable Register
2.7.8
UART_RX_INT
Bit
Position
Bit Field Name
Type
Reset
Description
7..5
Reserved
RFU
0
Reserved
4
break_rcvd_int
R/W
0
The interrupt bit is set when the
receive data line is held at ‘0’ for
more than the time it takes to send a
full word
3
stop_error_int
R/W
0
The interrupt bit is set to indicate that
the last bit received was not a stop bit
2
parity_error_int
R/W
0
The interrupt bit is set to indicate
there was a parity error with the data
received
1
rx_overflow_int
R/W
0
The interrupt indicates that data has
been received but the Rx Buffer had
not been emptied from the previous
transaction
0
rx_full_int
R/W
0
The interrupt indicates that the Rx
Data Register contains received data
Table 2.63 UART Receive Status Interrupt Register
54
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.7.9
Clearance No.: FTDI# 483
UART_LINE_CTRL
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
Reserved
RFU
0
Reserved
0
When set, the txd line goes into a
‘spacing’ state which causes a break
in the receiving UART.
5
set_break
R/W
Clear this bit to disable the break.
Parity Sel Bits
4..2
1
0
parity_sel
stop_2
size_7
R/W
R/W
R/W
xx0
No Parity
001
Odd Parity.
Parity bit will
be set to a ‘1’
or ‘0’ to ensure
an odd number
of 1s are sent
011
Even Parity.
Parity bit will
be set to a ‘1’
or ‘0’ to ensure
an even
number of 1s
are sent
101
High Parity.
Parity bit is
always set high
111
Low Parity.
Parity bit is
always set low
0
0
0
Parity
When 0, one stop bit generated
When 1, two stop bits are generated
When 0, eight bits of data are
transmitted and received
When 1, seven bits of data are
transmitted and received
Table 2.64 UART Line Control Register
55
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.7.10 UART_BAUD
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
uart_baud_0
R/W
0x88
Lower byte of the baud rate setting
Table 2.65 UART Baud Rate 0 Register
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
uart_baud_1
R/W
0x13
Middle byte of the baud rate setting
Table 2.66 UART Baud Rate 1 Register
Bit
Position
Bit Field Name
Type
Reset
Description
7
Reserved
RFU
0
Reserved
Tuning bits for the Baud Rate
controller. These bits allow the baud
clock to be extended by a fraction of
one clock cycle
6..4
uart_baud_frac
R/W
0
Tuning Bits
Clock
Extension
000
Nothing added
001
Add ½ clock
010
Add ¼ clock
011
Add 1/8 clock
100
Add 3/8 clock
101
Add 5/8 clock
110
Add 6/8 clock
111
Add 7/8 clock
3..2
Reserved
RFU
0
Reserved
1..0
uart_baud_2
R/W
0
Upper two bits of the baud rate
setting
Table 2.67 UART Baud Rate 2 Register
56
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.7.11 UART Baud Rate Example
Baud Rate Example
The Baud Rate is defined by the value programmed into registers UART_BAUD_0, UART_BAUD_1 and
UART_BAUD_2. This value is used as a divisor of the system clock frequency.
For a system clock frequency of 48MHz. The default value of the UART_BAUD_0, UART_BAUD_1, and
UART_BAUD_2 will be 0x88, 0x13 and 0x00 respectively.
This will set the baud rate divisor to be 0x1388 or 5000dec.
The final baud rate will be 48000000/5000 = 9600 baud
Figure 2.5 UART Baud Rate Example Calculations
2.7.12 UART_FLOW_CTRL
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
Reserved
RFU
0
Reserved
5
dtr_n_reg
R/W
0
When 0, the dtr_n signal is under the
control of the flow control block
When 1, the dtr_n output will be held
high
When 0, the rts_n signal is under the
control of the flow control block
4
rts_n_reg
R/W
0
3
Reserved
RFU
0
Reserved
2
Reserved
RFU
0
Reserved
1
dtr_dsr
R/W
0
When set, flow control is set to
DTR_DSR mode
0
rts_cts
R/W
0
When set, flow control is set to
RTS/CTS mode
When 1, the rts_n output will be held
high
Table 2.68 UART Flow Control Register
57
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.7.13 UART_FLOW_STAT
Bit
Position
Bit Field Name
Type
Reset
Description
7..4
Reserved
RFU
0
Reserved
3
ri_reg
RO
0
Status of the Ring Indicator signal
2
dcd_reg
RO
0
Status of the Data Carrier Detect
signal
1
dsr_n_reg
RO
0
Status of the Data_Set_Ready signal
0
cts_n_reg
RO
0
Status of the Clear_to_Send signal
Table 2.69 UART Flow Control Status Register
58
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.8 GPIOs
GPIOs are divided into Digital and Analogue pads. Digital inputs and outputs should be mapped to
the digital pads but can be mapped to analogue pads if required. Analogue inputs and outputs
must be mapped to the analogue pads.
2.8.1
Digital GPIO Pads
Up to 16 digital GPIO pads are available depending on package type. The digital pads are multispeed, multi-voltage and bidirectional I/O.
The digital GPIO is able to operate over wide voltage ranges and the GPIO voltage can be taken
above that of the internal supply rails (i.e. up to 5v).
Each of the 16 digital GPIO pads has its own control register as shown in Table 2.70.
I/O
Address
Register Name
Description
0x1A
DIGITAL_CONTROL_GPIO_0
Control register for DIO 0
0x1B
DIGITAL_CONTROL_GPIO_1
Control register for DIO 1
0x1C
DIGITAL_CONTROL_GPIO_2
Control register for DIO 2
0x1D
DIGITAL_CONTROL_GPIO_3
Control register for DIO 3
0x1E
DIGITAL_CONTROL_GPIO_4
Control register for DIO 4
0x1F
DIGITAL_CONTROL_GPIO_5
Control register for DIO 5
0x20
DIGITAL_CONTROL_GPIO_6
Control register for DIO 6
0x21
DIGITAL_CONTROL_GPIO_7
Control register for DIO 7
0x22
DIGITAL_CONTROL_GPIO_8
Control register for DIO 8
0x23
DIGITAL_CONTROL_GPIO_9
Control register for DIO 9
0x24
DIGITAL_CONTROL_GPIO_10
Control register for DIO 10
0x25
DIGITAL_CONTROL_GPIO_11
Control register for DIO 11
0x26
DIGITAL_CONTROL_GPIO_12
Control register for DIO 12
0x27
DIGITAL_CONTROL_GPIO_13
Control register for DIO 13
0x28
DIGITAL_CONTROL_GPIO_14
Control register for DIO 14
0x29
DIGITAL_CONTROL_GPIO_15
Control register for DIO 15
Table 2.70 GPIO DIO Digital Control Register Addresses
59
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.8.1.1 DIGITAL_CONTROL_GPIO_0 to DIGITAL_CONTROL_GPIO_15
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
RFU
R
0
Reserved
5
Sr
R/W
0
Slew Rate Control. When sr=0 slew
RATE is NORMAL. When sr=1 slew
RATE is SLOW
0
Schmitt Trigger Enable. When
smt=1 the Schmitt circuit is
enabled, giving hysteresis on the
input signal. When smt=0 there is
no hysteresis.
0
Pull down Enable. When this signal
is set, a weak internal pull down is
enabled to hold the pad in a "low"
logic state if the pad is left
unconnected or tri-state
0
Pull up Enable. When this signal is
set, a weak internal pull up is
enabled to hold the pad in a "high"
logic state if the pad is left
unconnected or tri-state
4
R/W
Smt
3
R/W
pdena
2
R/W
puena
Drive strength control.
1..0
drive_strength
R/W
0
bit 1
bit 0
Drive
0
1
Weak
0
0
Low
1
0
Medium
1
1
High
Table 2.71 GPIO DIO Digital Control Registers
Please refer to the FT51A series datasheet for electrical information.
Note: Do NOT set puena or pdena at the same time. This can place the port in an undetermined
state.
2.8.2
Analogue GPIO Pads
Up to 16 analogue I/O pads are available depending on package type. The analogue pads are
multi-speed, multi-voltage and bidirectional I/O. Each pad can function in either analogue or digital
mode, but not both modes at the same time.
For digital mode of operation each of the 16 AIO pads has its own control register shown in Table
2.72. The AIO_MODE register described in Section 2.10.3 is used to switch from analogue mode to
digital mode.
60
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
I/O
Address
Register Name
Description
0x0A
DIGITAL_CONTROL_AIO_0
Control register for AIO 0 in digital
mode
0x0B
DIGITAL_CONTROL_AIO_1
Control register for AIO 1 in digital
mode
0x0C
DIGITAL_CONTROL_AIO_2
Control register for AIO 2 in digital
mode
0x0D
DIGITAL_CONTROL_AIO_3
Control register for AIO 3 in digital
mode
0x0E
DIGITAL_CONTROL_AIO_4
Control register for AIO 4 in digital
mode
0x0F
DIGITAL_CONTROL_AIO_5
Control register for AIO 5 in digital
mode
0x10
DIGITAL_CONTROL_AIO_6
Control register for AIO 6 in digital
mode
0x11
DIGITAL_CONTROL_AIO_7
Control register for AIO 7 in digital
mode
0x12
DIGITAL_CONTROL_AIO_8
Control register for AIO 8 in digital
mode
0x13
DIGITAL_CONTROL_AIO_9
Control register for AIO 9 in digital
mode
0x14
DIGITAL_CONTROL_AIO_10
Control register for AIO 10 in digital
mode
0x15
DIGITAL_CONTROL_AIO_11
Control register for AIO 11 in digital
mode
0x16
DIGITAL_CONTROL_AIO_12
Control register for AIO 12 in digital
mode
0x17
DIGITAL_CONTROL_AIO_13
Control register for AIO 13 in digital
mode
0x18
DIGITAL_CONTROL_AIO_14
Control register for AIO 14 in digital
mode
0x19
DIGITAL_CONTROL_AIO_15
Control register for AIO 15 in digital
mode
Table 2.72 GPIO AIO Digital Control Register Addresses
61
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.8.2.1 DIGITAL_CONTROL_AIO_0 to DIGITAL_CONTROL_AIO_15
Bit
Position
Bit Field Name
Type
Reset
Description
7..4
RFU
R
0
Reserved
3
pdena
0
Pull down Enable. When this signal is set, a
weak internal pull down is enabled to hold the
pad in a "low" logic state if the pad is left
unconnected or tri-state
0
Pull up Enable. When this signal is set, a weak
internal pull up is enabled to hold the pad in a
"high" logic state if the pad is left unconnected
or tri-state
2
R/W
R/W
puena
Drive strength control.
1..0
drive_strength
R/W
0
bit 1
bit 0
Drive
0
1
Weak
0
0
Low
1
0
Medium
1
1
High
Table 2.73 GPIO AIO Digital Control Registers
Please refer to the FT51A series datasheet for electrical information.
Note: Do NOT set puena or pdena at the same time. This can place the port in an
undetermined state.
62
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.9 IOMUX
The IOMUX allows any peripheral interface input or output signal to be assigned to any of the
available IO pins. There are however some limitations:

Digital interfaces (SPI, I2C, UART, etc.) should be assigned to one of the Digital IO Pads.
However, the digital interfaces can be mapped to the analogue pads if required.
Analogue signals (ADC) must be mapped to the Analogue IO Pads.

In order to assign a signal to a particular pin, two register writes are required to select the signal
and select the pad. Pads are routed to specific IC pins depending on the IC package selected.
Pads are described in Section 2.9.6 and Input and Output signals are described in Sections 2.9.8
and 2.9.7 respectively.
The registers associated with the IOMUX are outlined in Table 2.74.
I/O
Address
Register Name
Description
0x40
IOMUX_CONTROL
Used to enable and reset the IOMUX
0x41
IOMUX_OUTPUT_PAD_SEL
Used to route an output signal to a
specific pad
0x42
IOMUX_OUTPUT_SIG_SEL
Used to select a pad for a specific
output signal
0x43
IOMUX_INPUT_SIG_SEL
Used to route an input signal from a
specific pad
0x44
IOMUX_INPUT_PAD_SEL
Used to select pad to be used with a
specific input signal
Table 2.74 IOMUX Register Addresses
2.9.1
IOMUX_CONTROL
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
iomux_dev_en
R/W
0
Write 1 to Enable IOMUX
0
iomux_soft_reset
R/W
0
Write 1 to Reset IOMUX
Table 2.75 IOMUX Control Register
The IOMUX Control register provides top-level enables and reset functions for the IOMUX module.
The IOMUX module is enabled by setting the iomux_dev_en bit to 1. Clearing this bit will disable the
module.
To reset the module, a 1 is written to the iomux_soft_reset bit. This is cleared when the reset is
performed and will therefore always read as ‘0’.
63
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.9.2
Clearance No.: FTDI# 483
IOMUX_OUTPUT_PAD_SEL
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
op_pad_sel
R/W
0x00
Pad to be used for an output
mapping.
Table 2.76 IOMUX Output Pad Select Register
This register selects the output pad for a signal mapping. The pad is selected from Table 2.80.
Note that the values in Table 2.80 are decimal values.
Writing to this register has no effect on the IOMUX module until a write to the
IOMUX_OUTPUT_SIG_SEL occurs. At this time, the value in this register is sampled and used for the
output pad in the mapping.
2.9.3
IOMUX_OUTPUT_SIG_SEL
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
op_sig_sel
R/W
0x00
Signal to be used for an output
mapping.
Table 2.77 IOMUX Output Signal Select Register
This describes a signal from Table 2.81 to be mapped to an output pad.
When this register is written the pad selected in the IOMUX_OUTPUT_PAD_SEL register is mapped to
the required signal.
Note: When selecting an output signal to map to a pad, write the op_pad_sel first and then the
op_sig_sel second.
2.9.4
IOMUX_INPUT_SIG_SEL
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
ip_sig_sel
R/W
0x00
Signal to be used for an input
mapping.
Table 2.78 IOMUX Input Signal Select Register
This describes a signal from Table 2.82 to be mapped to an input pad.
Writing to this register has no effect on the IOMUX module until a write to the IOMUX_INPUT_PAD_SEL
occurs. At this time, the value in this register is sampled and used for the input signal in the
mapping.
64
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.9.5
Clearance No.: FTDI# 483
IOMUX_INPUT_PAD_SEL
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
ip_pad_sel
R/W
0x00
Pad to be used for an input mapping.
Table 2.79 IOMUX Input Pad Select Register
This register selects the input pad for a signal mapping. The pad is selected from Table 2.80. Note
that the values in Table 2.80 are decimal values.
When this register is written the signal selected in the IOMUX_INPUT_SIG_SEL register is mapped to
the required pad.
Note: When selecting an input signal to map to a pad, write the ip_sig_sel first and then the
ip_pad_sel second.
2.9.6
IOMUX Pad Values
There are 32 pads available. 16 are analogue capable and 16 are digital.
Note: The values listed in Table 2.80 are decimal values.
65
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
IOMUX Pad
Value
IOMUX Pad
Value
AIO_0
0
DIO_0
16
AIO_1
1
DIO_1
17
AIO_2
2
DIO_2
18
AIO_3
3
DIO_3
19
AIO_4
4
DIO_4
20
AIO_5
5
DIO_5
21
AIO_6
6
DIO_6
22
AIO_7
7
DIO_7
23
AIO_8
8
DIO_8
24
AIO_9
9
DIO_9
25
AIO_10
10
DIO_10
26
AIO_11
11
DIO_11
27
AIO_12
12
DIO_12
28
AIO_13
13
DIO_13
29
AIO_14
14
DIO_14
30
AIO_15
15
DIO_15
31
Table 2.80 IOMUX Pad Values
2.9.7
IOMUX Output Signal Mapping Values
Table 2.81 contains the output signal selection values to map to output pads.
Note: The signal values used in Table 2.81 are in decimal.
66
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
IOMUX Output Signals
Value
IOMUX Output Signals
Value
I2C_MASTER_SDA
82
PWM_OUT_13
39
I2C_MASTER_SCL
81
PWM_OUT_03
38
HUB_P2_PWREN
80
I2C_MASTER_SCLH
37
GPIO_PORT3O_7
79
I2C_SDA
36
GPIO_PORT3O_6
78
I2C_SCL
35
GPIO_PORT3O_5
77
SPI_SLAVE_MOSI_OUT
34
GPIO_PORT3O_4
76
SPI_SLAVE_MISO
33
GPIO_PORT3O_3
75
SPI_MASTER_SS_N_0
32
GPIO_PORT3O_2
74
SPI_MASTER_SS_N_1
31
GPIO_PORT3O_1
73
SPI_MASTER_SS_N_2
30
GPIO_PORT3O_0
72
SPI_MASTER_SS_N_3
29
GPIO_PORT2O_7
71
SPI_MASTER_SCLK
28
GPIO_PORT2O_6
70
SPI_MASTER_MISO_
LOOPBACK
27
GPIO_PORT2O_5
69
SPI_MASTER_MOSI
26
GPIO_PORT2O_4
68
CLKOUT
25
GPIO_PORT2O_3
67
SUSPEND_OPEN_DRAIN
24
GPIO_PORT2O_2
66
SUSPEND
23
GPIO_PORT2O_1
65
GL_N
22
GPIO_PORT2O_0
64
UART_TX_ACTIVE
21
MISC_TRISTATE
63
UART_DTR_N
20
MISC_HIGH
62
UART_RTS_N
19
MISC_LOW
61
UART_TXD
18
MISC_DEBUGGER
60
UART_8051_RXD0O
17
MISC_BCD
56
UART_8051_TXD0
16
FIFO_245_RXF_N
55
GPIO_PORT1O_7
15
FIFO_245_TXE_N
54
GPIO_PORT1O_6
14
FIFO_245_DATA_READ_7
53
GPIO_PORT1O_5
13
FIFO_245_DATA_READ_6
52
GPIO_PORT1O_4
12
FIFO_245_DATA_READ_5
51
GPIO_PORT1O_3
11
FIFO_245_DATA_READ_4
50
GPIO_PORT1O_2
10
FIFO_245_DATA_READ_3
49
GPIO_PORT1O_1
9
FIFO_245_DATA_READ_2
48
GPIO_PORT1O_0
8
FIFO_245_DATA_READ_1
47
GPIO_PORT0O_7
7
FIFO_245_DATA_READ_0
46
GPIO_PORT0O_6
6
PWM_OUT_7
45
GPIO_PORT0O_5
5
PWM_OUT_6
44
GPIO_PORT0O_4
4
67
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
IOMUX Output Signals
Value
IOMUX Output Signals
Value
PWM_OUT_5
43
GPIO_PORT0O_3
3
PWM_OUT_44
42
GPIO_PORT0O_2
2
PWM_OUT_34
41
GPIO_PORT0O_1
1
PWM_OUT_24
40
GPIO_PORT0O_0
0
Table 2.81 IOMUX Output Signal Mapping Values
2.9.8
IOMUX Input Signal Mapping Values
Table 2.82 contains the input signal selection values to map to input pads.
Note: The signal values used in Table 2.82 are in decimal.
IOMUX Input Signals
Value
IOMUX Input Signals
Value
I2C_MASTER_SDA
60
FIFO_245_DATA_WRITE_1
29
I2C_MASTER_SCL
59
FIFO_245_DATA_WRITE_0
28
HUB_P2_OVER_CURRENT
58
I2C_SDA
27
HUB_P1_OVER_CURRENT
57
I2C_SCL
26
GPIO_PORT3I_7
56
SPI_SLAVE_SS_N
25
GPIO_PORT3I_6
55
SPI_SLAVE_SCLK
24
GPIO_PORT3I_5
54
SPI_SLAVE_MOSI_IN
23
GPIO_PORT3I_4
53
SPI_MASTER_MISO
22
GPIO_PORT3I_3
52
UART_DCD
21
GPIO_PORT3I_2
51
UART_RI
20
GPIO_PORT3I_1
50
UART_DSR_N
19
GPIO_PORT3I_0
49
UART_CTS_N
18
GPIO_PORT2I_7
48
UART_RXD
17
GPIO_PORT2I_6
47
UART_8051_RXD0I
16
GPIO_PORT2I_5
46
GPIO_PORT1I_7
15
GPIO_PORT2I_4
45
GPIO_PORT1I_6
14
GPIO_PORT2I_3
44
GPIO_PORT1I_5
13
GPIO_PORT2I_2
43
GPIO_PORT1I_4
12
GPIO_PORT2I_1
42
GPIO_PORT1I_3
11
GPIO_PORT2I_0
41
GPIO_PORT1I_2
10
MISC_VBUS_DETECTED
40
GPIO_PORT1I_1
9
MISC_PWM_TRIGGER
39
GPIO_PORT1I_0
8
MISC_WAKEUP_PIN
38
GPIO_PORT0I_7
7
FIFO_245_RD_N
37
GPIO_PORT0I_6
6
FIFO_245_WR_N
36
GPIO_PORT0I_5
5
FIFO_245_DATA_WRITE_7
35
GPIO_PORT0I_4
4
68
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
IOMUX Input Signals
Value
IOMUX Input Signals
Value
FIFO_245_DATA_WRITE_6
34
GPIO_PORT0I_3
3
FIFO_245_DATA_WRITE_5
33
GPIO_PORT0I_2
2
FIFO_245_DATA_WRITE_4
32
GPIO_PORT0I_1
1
FIFO_245_DATA_WRITE_3
31
GPIO_PORT0I_0
0
FIFO_245_DATA_WRITE_2
30
Table 2.82 IOMUX Input Signal Mapping Values
2.9.9
Use Cases
The following use cases represent methods for mapping input and output signals to different pads.
It should be noted that the IOMUX mapping MUST be performed during configuration of the device
and not while the signals being mapped are active.
2.9.9.1 Setup an Input Signal
To program the IOMUX to route DIO_6 to the input signal UART_RXD.


Select
o
o
Select
o
o
the signal:
Find UART_RXD in Table 2.82. Value is 17decimal.
Write 17decimal to IOMUX_INPUT_SIG_SEL.
the pad:
Find the pad DIO_6 in Table 2.80. Value is 22decimal.
Write 22decimal to IOMUX_INPUT_PAD_SEL.
2.9.9.2 Setup an Output Signal
To program the IOMUX to route UART_TXD signal to the output pad DIO_8.


Select
o
o
Select
o
o
the pad:
Find the pad DIO_8 in Table 2.80. Value is 24decimal.
Write 24decimal to IOMUX_OUTPUT_PAD_SEL
the signal:
Find UART_RXD in Table 2.81. Value is 18decimal.
Write 18decimal to IOMUX_OUTPUT_SIG_SEL.
69
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10 Analogue IO Ports
The FT51A has up to 16 Analogue IO pads available, depending on package type. The number of
pads for each package type is shown in Table 2.83.
Package
Number of Available AIOs
AIO Pads Available
48 pin
16
AIO0 to AIO15
44 pin
16
AIO0 to AIO15
32 pin
8
AIO4 to AIO7, AIO10,AIO11,AIO14,AIO15
28 pin
8
AIO4 to AIO7, AIO10,AIO11,AIO14,AIO15
Table 2.83 Available AIO Ports
Each AIO pad can be configured to operate in one of the following modes:


Digital – Where the Analogue ports behave as Digital I/Os and can be controlled in a similar
fashion to Digital ports. See Section 2.8.2.
ADC – Where the pad is an input and can be sampled to perform analogue to digital
conversion.
A special Global Mode is implemented to allow multiple ADC conversions to be run simultaneously.
Address
Register Name
Description
0x100
AIO_CONTROL
Used to enable and reset the Analogue
IO
Table 2.84 Analogue IO Register Addresses
2.10.1 AIO_CONTROL
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
aio_dev_en
R/W
0
Write 1 to Enable Analogue IO
0
aio_soft_reset
R/W
0
Write 1 to Reset Analogue IO
Table 2.85 Analogue IO Control Register
The Analogue IO Control register provides top-level enables and reset functions for the Analogue
IO module.
The Analogue IO module is enabled by setting the aio_dev_en bit to 1. Clearing this bit will disable
the module.
To reset the module, a 1 is written to the aio_soft_reset bit. This is cleared when the reset is
performed and will therefore always read as ‘0’.
70
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.2 Implementation
Analogue-to-digital conversion is implemented using a DAC to successively approximate (in
hardware) the output of a sample-and-hold circuit. Physically, there are four DACs, each shared
by four AIO ports, as illustrated below.
AIO_0
AIO_4
AIO_1
AIO_5
DAC_1
DAC_0
AIO_2
AIO_6
AIO_3
AIO_7
AIO_8
AIO_12
AIO_9
AIO_13
DAC_2
DAC_3
AIO_10
AIO_14
AIO_11
AIO_15
Figure 2.6 Pad Distribution
2.10.3 AIO Configuration
The mode of each AIO port can be selected by writing to the appropriate mode register. Each
register sets the mode for 4 AIO ports with the bits defined in Table 2.87.
71
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Address
Register Name
Description
0x102
AIO_MODE_0
Selects AIO ports 0 - 3
0x103
AIO_MODE_1
Selects AIO ports 4 - 7
0x104
AIO_MODE_2
Selects AIO ports 8 - 11
0x105
AIO_MODE_3
Selects AIO ports 12 - 15
Table 2.86 AIO Mode Control Register Addresses
mode1
mode0
Configuration
0
0
Analogue off. Pad configured for Digital Mode.
0
1
Reserved
1
0
ADC Mode
1
1
Reserved
Table 2.87 AIO Mode Control Bits
2.10.3.1 AIO_MODE_0
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
AIO_3_MODE
R/W
0
Analogue mode of operation for
AIO_3 port. See Table 2.87
5..4
AIO_2_MODE
R/W
0
Analogue mode of operation for
AIO_2 port. See Table 2.87
3..2
AIO_1_MODE
R/W
0
Analogue mode of operation for
AIO_1 port. See Table 2.87
1..0
AIO_0_MODE
R/W
0
Analogue mode of operation for
AIO_0 port. See Table 2.87
Table 2.88 AIO Mode Control 0 Register
72
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.3.2 AIO_MODE_1
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
AIO_7_MODE
R/W
0
Analogue mode of operation for
AIO_7 port. See Table 2.87
5..4
AIO_6_MODE
R/W
0
Analogue mode of operation for
AIO_6 port. See Table 2.87
3..2
AIO_5_MODE
R/W
0
Analogue mode of operation for
AIO_5 port. See Table 2.87
1..0
AIO_4_MODE
R/W
0
Analogue mode of operation for
AIO_4 port. See Table 2.87
Table 2.89 AIO Mode Control 1 Register
2.10.3.3 AIO_MODE_2
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
AIO_11_MODE
R/W
0
Analogue mode of operation for
AIO_11 port. See Table 2.87
5..4
AIO_10_MODE
R/W
0
Analogue mode of operation for
AIO_10 port. See Table 2.87
3..2
AIO_9_MODE
R/W
0
Analogue mode of operation for
AIO_9 port. See Table 2.87
1..0
AIO_8_MODE
R/W
0
Analogue mode of operation for
AIO_8 port. See Table 2.87
Table 2.90 AIO Mode Control 2 Register
2.10.3.4 AIO_MODE_3
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
AIO_15_MODE
R/W
0
Analogue mode of operation for
AIO_15 port. See Table 2.87
5..4
AIO_14_MODE
R/W
0
Analogue mode of operation for
AIO_14 port. See Table 2.87
3..2
AIO_13_MODE
R/W
0
Analogue mode of operation for
AIO_13 port. See Table 2.87
1..0
AIO_12_MODE
R/W
0
Analogue mode of operation for
AIO_12 port. See Table 2.87
Table 2.91 AIO Mode Control 3 Register
73
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.4 AIO ADC Mode
During ADC the incoming analogue signal to the AIO pad is sampled to provide a digital
representation of the wave.
The AIO_SAMPLE_0 and AIO_SAMPLE_1 registers determine which AIO ports shall be sampled by the
analogue to digital convertor.
Once the conversion is completed the interrupt bit for each AIO port is set in the
AIO_INTERRUPTS_0_7 or AIO_INTERRUPTS_8_15 register. This signals that the digital representation of
the analogue value can be read from the ADC data registers, AIO_x_ADC_DATA_L and
AIO_x_ADC_DATA_U. The reading is encoded into bits 0..9. The 2 lowest bits (0..1) should be
discarded.
74
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Address
Register Name
Description
0x108
AIO_SAMPLE_0
Sample AIO ports 0 – 7
0x109
AIO_SAMPLE 1
Sample AIO ports 8 – 15
0x13E
AIO_0_ADC_DATA_L
Lower byte of AIO_0 ADC data
0x13F
AIO_0_ADC_DATA_U
Upper 2 bits of AIO_0 ADC data
0x140
AIO_1_ADC_DATA_L
Lower byte of AIO_1 ADC data
0x141
AIO_1_ADC_DATA_U
Upper 2 bits of AIO_1 ADC data
0x142
AIO_2_ADC_DATA_L
Lower byte of AIO_2 ADC data
0x143
AIO_2_ADC_DATA_U
Upper 2 bits of AIO_2 ADC data
0x144
AIO_3_ADC_DATA_L
Lower byte of AIO_3 ADC data
0x145
AIO_3_ADC_DATA_U
Upper 2 bits of AIO_3 ADC data
0x146
AIO_4_ADC_DATA_L
Lower byte of AIO_4 ADC data
0x147
AIO_4_ADC_DATA_U
Upper 2 bits of AIO_4 ADC data
0x148
AIO_5_ADC_DATA_L
Lower byte of AIO_5 ADC data
0x149
AIO_5_ADC_DATA_U
Upper 2 bits of AIO_5 ADC data
0x14A
AIO_6_ADC_DATA_L
Lower byte of AIO_6 ADC data
0x14B
AIO_6_ADC_DATA_U
Upper 2 bits of AIO_6 ADC data
0x14C
AIO_7_ADC_DATA_L
Lower byte of AIO_7 ADC data
0x14D
AIO_7_ADC_DATA_U
Upper 2 bits of AIO_7 ADC data
0x14E
AIO_8_ADC_DATA_L
Lower byte of AIO_8 ADC data
0x14F
AIO_8_ADC_DATA_U
Upper 2 bits of AIO_8 ADC data
0x150
AIO_9_ADC_DATA_L
Lower byte of AIO_9 ADC data
0x151
AIO_9_ADC_DATA_U
Upper 2 bits of AIO_9 ADC data
0x152
AIO_10_ADC_DATA_L
Lower byte of AIO_10 ADC data
0x153
AIO_10_ADC_DATA_U
Upper 2 bits of AIO_10 ADC data
0x154
AIO_11_ADC_DATA_L
Lower byte of AIO_11 ADC data
0x155
AIO_11_ADC_DATA_U
Upper 2 bits of AIO_11 ADC data
0x156
AIO_12_ADC_DATA_L
Lower byte of AIO_12 ADC data
0x157
AIO_12_ADC_DATA_U
Upper 2 bits of AIO_12 ADC data
0x158
AIO_13_ADC_DATA_L
Lower byte of AIO_13 ADC data
0x159
AIO_13_ADC_DATA_U
Upper 2 bits of AIO_13 ADC data
0x15A
AIO_14_ADC_DATA_L
Lower byte of AIO_14 ADC data
75
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
0x15B
AIO_14_ADC_DATA_U
Upper 2 bits of AIO_14 ADC data
0x15C
AIO_15_ADC_DATA_L
Lower byte of AIO_15 ADC data
0x15D
AIO_15_ADC_DATA_U
Upper 2 bits of AIO_15 ADC data
Table 2.92 AIO ADC Register Addresses
2.10.4.1 AIO_SAMPLE_0
Bit
Position
Bit Field Name
Type
Reset
Description
7
AIO_7_SAMPLE
W
0
Sample AIO_7 port
6
AIO_6_SAMPLE
W
0
Sample AIO_6 port
5
AIO_5_SAMPLE
W
0
Sample AIO_5 port
4
AIO_4_SAMPLE
W
0
Sample AIO_4 port
3
AIO_3_SAMPLE
W
0
Sample AIO_3 port
2
AIO_2_SAMPLE
W
0
Sample AIO_2 port
1
AIO_1_SAMPLE
W
0
Sample AIO_1 port
0
AIO_0_SAMPLE
W
0
Sample AIO_0 port
Table 2.93 AIO ADC Sample Select 0 Register
2.10.4.2 AIO_SAMPLE_1
Bit
Position
Bit Field Name
Type
Reset
Description
7
AIO_15_SAMPLE
W
0
Sample AIO_15 port
6
AIO_14_SAMPLE
W
0
Sample AIO_14 port
5
AIO_13_SAMPLE
W
0
Sample AIO_13 port
4
AIO_12_SAMPLE
W
0
Sample AIO_12 port
3
AIO_11_SAMPLE
W
0
Sample AIO_11 port
2
AIO_10_SAMPLE
W
0
Sample AIO_10 port
1
AIO_9_SAMPLE
W
0
Sample AIO_9 port
0
AIO_8_SAMPLE
W
0
Sample AIO_8 port
Table 2.94 AIO ADC Sample Select 1 Register
76
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.4.3 AIO_x_ADC_DATA_L
Bit
Position
Bit Field Name
Type
Reset
Description
R
0
Digital representation of the
analogue value (lower).
LOWER DATA
7..0
Discard bits 0..1
Table 2.95 AIO ADC Sample Result (Lower) Registers
2.10.4.4 AIO_x_ADC_DATA_U
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Always reads as zero
1:0
UPPER DATA
R
0
Digital representation of the
analogue value (upper).
Table 2.96 AIO ADC Sample Result (Upper) Registers
2.10.5 AIO Interrupts
Address
Register Name
Description
0x16E
AIO_INTERRUPTS_0_7
Interrupts for Ports 0-7
0x170
AIO_INTERRUPTS_8_15
Interrupts for Ports 8-15
0x16F
AIO_INTERRUPT_ENABLES_0_7
Interrupt Enables for Ports 0-7
0x171
AIO_INTERRUPT_ENABLES_8_15
Interrupt Enables for Ports 8-15
Table 2.97 AIO Interrupt Register Addresses
77
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.5.1 AIO_INTERRUPTS_0_7
Bit
Position
Bit Field Name
Type
Reset
7
AIO_7_INT
RO
0
6
AIO_6_INT
RO
0
5
AIO_5_INT
RO
0
4
AIO_4_INT
RO
0
3
AIO_3_INT
RO
0
2
AIO_2_INT
RO
0
1
AIO_1_INT
RO
0
0
AIO_0_INT
RO
0
Description
Set when an A-D conversion is
complete for that particular Analogue
Cell.
Table 2.98 AIO Interrupts 0-7 Register
2.10.5.2 AIO_INTERRUPTS_8_15
Bit
Position
Bit Field Name
Type
Reset
7
AIO_15_INT
RO
0
6
AIO_14_INT
RO
0
5
AIO_13_INT
RO
0
4
AIO_12_INT
RO
0
3
AIO_11_INT
RO
0
2
AIO_10_INT
RO
0
1
AIO_9_INT
RO
0
0
AIO_8_INT
RO
0
Description
Set when an A-D conversion is
complete for that particular Analogue
Cell.
Table 2.99 AIO Interrupts 8-15 Register
78
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.5.3 AIO_INTERRUPT_ENABLES_0_7
Bit
Position
Bit Field Name
Type
Reset
7
AIO_7_IEN
RW
0
6
AIO_6_IEN
RW
0
5
AIO_5_IEN
RW
0
4
AIO_4_IEN
RW
0
3
AIO_3_IEN
RW
0
2
AIO_2_IEN
RW
0
1
AIO_1_IEN
RW
0
0
AIO_0_IEN
RW
0
Description
Interrupt Enable bit.
Write a 1 to enable the corresponding
interrupt bit in register
AIO_INTERRUPTS_0_7
Table 2.100 AIO Interrupt Enables 0-7 Register
2.10.5.4 AIO_INTERRUPT_ENABLES_8_15
Bit
Position
Bit Field Name
Type
Reset
7
AIO_15_IEN
RW
0
6
AIO_14_IEN
RW
0
5
AIO_13_IEN
RW
0
4
AIO_12_IEN
RW
0
3
AIO_11_IEN
RW
0
2
AIO_10_IEN
RW
0
1
AIO_9_IEN
RW
0
0
AIO_8_IEN
RW
0
Description
Interrupt Enable bit.
Write a 1 to enable the corresponding
interrupt bit in register
AIO_INTERRUPTS_8_15
Table 2.101 AIO Interrupt Enables 8-15 Register
2.10.6 Global Mode
Global mode allows multiple ADC ports to be sampled simultaneously, i.e. there is no need to
assert each individual sample bit. Any ADCs that are selected to be in Global mode will be
sampled when the Global Sample bit is asserted.
For ports that are in ADC mode, Global Update must be asserted in order to transfer the results to
the ADC Data registers once the sample is complete.
The following registers are used in Global Mode.
79
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Address
Register Name
Description
0x101
AIO_GLOBAL_CTRL
Interrupt enables and status bits
0x10B
AIO_GLOBAL_PORT_SELECT_0_7
Used to include ports 0-7 in the global
list
0x10C
AIO_GLOBAL_PORT_SELECT_8_15
Used to include ports 8-15 in the global
list
Table 2.102 AIO Global Mode Register Addresses
2.10.6.1 AIO_GLOBAL_CTRL
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
Reserved
RFU
0
Reserved
5
global_update_ien
R/W
0
Write 1 to enable the Global
Update interrupt bit,
global_update_int
4
global_update_int
R/W1C
0
Global Update Interrupt bit. Set
when ADC data has been
transferred from holding buffers
to AIO_ADC_DATA_L and
AIO_ADC_DATA_U registers
3
global_sample_ien
R/W
0
Write 1 to enable the Global
Sample Interrupt bit,
global_sample_int
0
Set when a global sample has
completed. This means that any
ADC conversions that were
initiated by a global_sample are
now complete
0
Write a 1 to transfer the
resulting data ADC conversions
from holding registers to the
AIO_ADC_DATA_L and
AIO_ADC_DATA_U registers
0
Write 1 to start a global sample.
This will initiate an ADC sample
for all ports that are in the
global list
2
1
0
global_sample_int
global_update
global_sample
R/W1C
R/W
R/W
80
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.6.2 AIO_GLOBAL_PORT_SELECT_0_7
Bit
Position
Bit Field Name
Type
Reset
Description
7
aio_port_7_active
R/W
0
Write 1 to include Port in Global List
6
aio_port_6_active
R/W
0
Write 1 to include Port in Global List
5
aio_port_5_active
R/W
0
Write 1 to include Port in Global List
4
aio_port_4_active
R/W
0
Write 1 to include Port in Global List
3
aio_port_3_active
R/W
0
Write 1 to include Port in Global List
2
aio_port_2_active
R/W
0
Write 1 to include Port in Global List
1
aio_port_1_active
R/W
0
Write 1 to include Port in Global List
0
aio_port_0_active
R/W
0
Write 1 to include Port in Global List
Table 2.103 AIO Global Mode Select 0-7 Register
2.10.6.3 AIO_GLOBAL_PORT_SELECT_8_15
Bit
Position
Bit Field Name
Type
Reset
Description
7
aio_port_15_active
R/W
0
Write 1 to include Port in Global List
6
aio_port_14_active
R/W
0
Write 1 to include Port in Global List
5
aio_port_13_active
R/W
0
Write 1 to include Port in Global List
4
aio_port_12_active
R/W
0
Write 1 to include Port in Global List
3
aio_port_11_active
R/W
0
Write 1 to include Port in Global List
2
aio_port_10_active
R/W
0
Write 1 to include Port in Global List
1
aio_port_9_active
R/W
0
Write 1 to include Port in Global List
0
aio_port_8_active
R/W
0
Write 1 to include Port in Global List
Table 2.104 AIO Global Mode Select 8-15 Register
Global mode limitations
Physically there are only four DACs on the device, shared amongst all available AIO pads (see
section 2.10.2 for more detail).
This creates a limitation in Global mode and there is a potential for drift to be seen on the output if
more than two ports sharing a DAC are used in Global mode.
Therefore, we recommend that Global mode ports are spread over multiple DACs. Table 2.105
describes the recommended Global port usage.
81
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
AIO Port
DAC Used
AIO_0
DAC_0
AIO_1
DAC_0
AIO_2
DAC_0
AIO_3
DAC_0
AIO_4
DAC_1
AIO_5
DAC_1
AIO_6
DAC_1
AIO_7
DAC_1
AIO_8
DAC_2
AIO_9
DAC_2
AIO_10
DAC_2
AIO_11
DAC_2
AIO_12
DAC_3
AIO_13
DAC_3
AIO_14
DAC_3
AIO_15
DAC_3
Clearance No.: FTDI# 483
Recommendation
For this shared DAC, use no
more than two ports in Global
mode
For this shared DAC, use no
more than two ports in Global
mode
For this shared DAC, use no
more than two ports in Global
mode
For this shared DAC, use no
more than two ports in Global
mode
Table 2.105. Recommended Global Port Selection
2.10.7 Differential Mode
In differential mode, two AIO pads are used together to form a pair of differential pads.
The voltage difference between the two pads will be the input to the ADC circuit.
Both inputs must be positive voltages
Address
Register Name
Description
0x2A
AIO_DIFFERENTIAL_ENABLE
This register is used to configure pairs
of pads in differential mode
Table 2.106 AIO Differential Register Addresses
82
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.7.1 AIO_DIFFERENTIAL_ENABLE
Bit
Position
Bit Field Name
Type
Reset
Description
7
diff_14_15
R/W
0
Write 1 to configure AIO Pads 14
and 15 as a differential pair
6
diff_12_13
R/W
0
Write 1 to configure AIO Pads 12
and 13 as a differential pair
5
diff_10_11
R/W
0
Write 1 to configure AIO Pads 10
and 11 as a differential pair
4
diff_8_9
R/W
0
Write 1 to configure AIO Pads 8 and
9 as a differential pair
3
diff_6_7
R/W
0
Write 1 to configure AIO Pads 6 and
7 as a differential pair
2
diff_4_5
R/W
0
Write 1 to configure AIO Pads 4 and
5 as a differential pair
1
diff_2_3
R/W
0
Write 1 to configure AIO Pads 2 and
3 as a differential pair
0
diff_0_1
R/W
0
Write 1 to configure AIO Pads 0 and
1 as a differential pair
Table 2.107 AIO Differential Enable Register
2.10.8 Settling Times
It is possible to vary the amount of time that the AIO module will wait for certain parts of the ADC
to complete their particular function.
Delays can be varied for the Sample & Hold circuit settling time and for the AIO clock divider.
The following registers are used to increase or decrease delays:
83
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Address
Register Name
Clearance No.: FTDI# 483
Description
This register allows the user to change
the amount of time that the AIO block
will wait for the Sample and Hold
circuit to complete its function.
0x176
AIO_SH_COUNTER_L
0x177
AIO_SH_COUNTER_U
0x17A
The value written to these registers
will dictate the number of clock cycles
that the AIO module will wait for the
S&H to complete. This is based on the
clock after the CLOCK_DIVIDER ratio has
been applied.
Write to this register to divide the
system clock supplied to the AIO
Module
AIO_CLOCK_DIVIDER
The divided clock is used to determine
the delays applied based on the above
registers.
Table 2.108 AIO Settling Times Register Addresses
2.10.8.1 AIO_SH_COUNTER
2.10.8.1.1 AIO_SH_COUNTER_L
Bit
Position
7:0
Bit Field Name
sh_settling_time_l
Type
R/W
Reset
Description
0x39
Lower byte of the value used to
calculate the number of clock cycles
to wait for the Sample & Hold circuit
to complete its function
Table 2.109 AIO Cell Sample and Hold Counter Lower Register
2.10.8.1.2 AIO_SH_COUNTER_U
Bit
Position
Bit Field Name
Type
Reset
Description
7:2
Reserved
RFU
0
Reserved
0x01
Upper two bits of the value used to
calculate the number of clock cycles
to wait for the Sample & Hold circuit
to complete its function
1:0
sh_settling_time_u
R/W
Table 2.110 AIO Cell Sample and Hold Counter Upper Register
84
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.8.2 Settling Time Examples (for optimal performance)
The ADC function has the following characteristics:
DAC max settling time
0.245µs
Sample & Hold, max settling time
11.8µs
Sample & Hold Settling time
Given the following settings:
System clock frequency
48MHz
Clk_div_sel
0
SH Settling Time Value
0x237 (567)
The divided clock is 48 MHz / (0+1) = 48 MHz, giving a period of 20.83 ns.
Therefore, the allowed Sample & Hold settling time will be 567×20.83 =11.8 us.
For optimal ADC performance, it is recommended that the AIO_SH_COUNTER
default value of 0x139 is overwritten with 0x237, i.e. overwrite the
AIO_SH_COUNTER_L register with the value 0x37 and the AIO_SH_COUNTER_H
register with the value of 0x02.
Assuming a system clock of 48MHz is used and an AIO Clock Division ratio of 0
(default value).
2.10.8.3 AIO_CLOCK_DIVIDER
Bit
Position
Bit Field Name
Type
Reset
Description
This value will be used to select the
division ratio used to divide the
system clock going to the AIO
module. The divided clock frequency
will be:
sys_clk/clk_div_sel+1
7:0
clk_div_sel
R/W
0
clk_div_sel bits
Clock Divider
000
1
001
2
010
3
011
4
100
5
…
…
111
256
Table 2.111 Clock Divider Register
85
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.10.9 ADC Programming Flow
Single Sample

Write to the appropriate mode register (AIO_MODE_0, AIO_MODE_1, AIO_MODE_2,
AIO_MODE_3) to select ADC mode (see AIO_MODE Control AIO_0_MODE to
AIO_15_MODE for more details)

Enable the corresponding interrupt bit
AIO_INTERRUPT_ENABLES_8_15 registers

Assert the corresponding Sample bit in the (AIO_SAMPLE_0, AIO_SAMPLE_1) registers

Wait for the corresponding interrupt bit to be set to indicate that the conversion is
complete (AIO_INTERRUPTS_0_7 or AIO_INTERRUPTS_8_15 registers)

Read digital data (10 bits) from the appropriate AIO_ADC_DATA registers and remove the
lower 2 bits.
in
the
AIO_INTERRUPT_ENABLES_0_7
or
Global Sample (see Global Mode for more details)

Write to the AIO_GLOBAL_CTRL registers to select which cells are to be included in global
sample

Write to the appropriate mode register (AIO_MODE_0, AIO_MODE_1, AIO_MODE_2,
AIO_MODE_3) to select ADC mode (see AIO_MODE Control AIO_0_MODE to
AIO_15_MODE for more details)

Enable the global_sample_int
AIO_GLOBAL_CTRL
interrupt
with
global_sample_int_en
in
register

Enable the global_update_int
AIO_GLOBAL_CTRL
interrupt
with
global_update_int_en
in
register

To initiate a global sample, set the Global_Sample bit in the AIO_GLOBAL_CTRL register

Once all ports included in the global list have completed their conversions, the
global_sample_int bit will be set in the AIO_GLOBAL_CTRL register.

The result for each ADC port will be stored in a holding register until the Global_Update bit
is asserted in the AIO_GLOBAL_CTRL register. At which point the contents of all ADC port
holding registers will be transferred into the ADC Data Register

When the global_update_int bit is set in the AIO_GLOBAL_CTRL register, the ADC result
can be read from the corresponding AIO_ADC_DATA registers.
86
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.11 USB Full Speed Device Controller
The FT51A contains USB Full Speed device controller based on the FT122 technology. The registers
to access the device are shown in Table 2.112.
SFR
Address
Register Name
Description
0xFC
FT122_CMD
Command register.
0xFD
FT122_DATA
Data register.
Table 2.112 USB Full Speed device controller Register Addresses
The device is addressed by writing the command code from Table 2.117 or Table 2.118 into the
FT122_CMD register and then optionally reading or writing data to the FT122_DATA register.
2.11.1 Endpoint Buffer Management
The USB Full Speed device controller has 2 modes of operation for command and memory
management: the default mode (FT120 compatible mode) and the enhanced mode. The buffer
management schemes are different in these two modes. Upon reset the default mode is functional.
The enhanced mode is activated when any of the Set Endpoint Configuration commands (0xB0 to
0xBF) is received.
2.11.1.1 Endpoint Buffer Management in Default Mode
In default mode, the USB Full Speed device controller has 3 bi-directional endpoints (EP0, EP1 and
EP2). EP0 is the control endpoint, with 16 bytes maximum packet size for both control OUT and
control IN transfers. EP1 can be used as either a bulk endpoint or an interrupt endpoint, with 16
bytes maximum packet size for both OUT and IN transfers. Table 2.113 shows the endpoint type
and maximum packet size for EP0 and EP1.
Endpoint
Number
(EP)
Endpoint
Index
(EPI)
Endpoint
Direction
Transfer Type
Max Packet
Size
0
0
1
OUT
IN
Control
Control
16
16
1
2
3
OUT
IN
Bulk/Interrupt
Bulk/Interrupt
16
16
Table 2.113 Endpoint Configuration for EP0 and EP1
EP2 is the primary endpoint. It can be configured for either bulk/interrupt or isochronous transfers.
The maximum packet size allowed for EP2 is configured using the Set Mode command. Table 2.114
shows all four endpoint configuration modes for EP2.
87
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
EP2
Endpoint
Configurati
on Mode
Endpoint
0
Clearance No.: FTDI# 483
Endpoint
Direction
Transfer Type
Max Packet
Size
4
OUT
Bulk/Interrupt
64
(default)
5
IN
Bulk/Interrupt
64
1
4
OUT
Isochronous
128
2
5
IN
Isochronous
128
3
4
5
OUT
IN
Isochronous
Isochronous
64
64
Index
(EPI)
Table 2.114 Endpoint Configuration for EP2
As the primary endpoint, EP2 is suitable for transmitting or receiving relatively large data. To
improve the data throughput, EP2 is implemented with double buffering. This allows concurrent
access by the USB bus and the FT51A core. For example, for EP2 IN endpoint (EPI5), the USB
host can read data from Buffer 0 while the FT51A core is writing to Buffer 1. The USB host can
subsequently read from Buffer 1 without waiting for it to be filled. Buffer switching is handled
automatically by the USB Full Speed device controller.
2.11.1.2 Endpoint Buffer Management in Enhanced Mode
In enhanced mode, the USB Full Speed device controller supports a dedicated 1 kB buffer for IN
packets and a dedicated 1 kB buffer for OUT packets. The OUT/IN buffer can be allocated to any
endpoint with the same direction, up to a maximum of 504 bytes double buffered (1008 bytes in
total) to one endpoint. 504 is the maximum byte count as there are 1024 bytes in total per
OUT/IN Buffer and 8 bytes for IN and OUT packets on control endpoint 0 must always be reserved.
Control, interrupt and bulk endpoints can have a maximum packet size of 64 bytes and only
isochronous endpoints can be allocated more than 64 bytes.
Isochronous modes can have larger buffer sizes as USB packets can be larger than 64 bytes for
isochronous transfers. The isochronous buffer is managed in the same way as bulk, interrupt and
control buffers – i.e. a buffer is for one USB packet only and will not span more than one USB
packet.
An example of buffer configurations follows, where Configuration 1 and 2 have larger isochronous
buffers. In this example, each row indicates a buffer of 64 bytes - control endpoints are therefore
64 bytes.
88
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Configuration 0
Clearance No.: FTDI# 483
Configuration 1
Configuration 2
EP
Buffer
EP
Buffer
7
(ISO)
1
(128 bytes)
7
(ISO)
0
(128 bytes)
5
(ISO)
1
(448 bytes)
5
(ISO)
0
(448 bytes)
EP
Buffer
7
1
7
0
6
1
6
0
5
1
6
1
5
0
6
0
4
1
2
1
4
0
2
0
3
1
3
0
1
(ISO)
1
(192 bytes)
2
1
2
0
1
1
1
0
0
0
1
(ISO)
0
(192 bytes)
1
0
1
0
1
0
0
0
0
0
Table 2.115 Example Buffer Configuration
The endpoint buffer configurations, settable using the Set Endpoint Configuration command, are as
follows:
89
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Endpoint buffer size register
setting (binary)
Non-isochronous
endpoint
Isochronous
endpoint
0000
8 bytes
16 bytes
0001
16 bytes
32 bytes
0010
32 bytes
48 bytes
0011
64 bytes
64 bytes
0100
-
96 bytes
0101
-
128 bytes
0110
-
160 bytes
0111
-
192 bytes
1000
-
256 bytes
1001
-
320 bytes
1010
-
384 bytes
1011
-
504 bytes
1100-1111
-
-
Table 2.116 Endpoint Maximum Packet Size
Note: 504 is the maximum byte count as there are 1024 bytes in total and 8 bytes IN and OUT
packets for control endpoint 0 must always be reserved.
90
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.11.2 Command Summary
Command Name
Target
Code (hex)
Data phase
Initialization Commands
Set Address Enable
Device
0xD0
Write 1 byte
Set Endpoint Enable
Device
0xD8
Write 1 byte
Set Mode
Device
0xF3
Write 2 bytes
Reserved
Device
0xFB
Write/Read 1 byte
Data Flow Commands
Read Interrupt Register
Device
0xF4
Read 2 bytes
Select Endpoint
Endpoint 0 OUT
0x00
Read 1 byte (optional)
Endpoint 0 IN
0x01
Read 1 byte (optional)
Endpoint 1 OUT
0x02
Read 1 byte (optional)
Endpoint 1 IN
0x03
Read 1 byte (optional)
Endpoint 2 OUT
0x04
Read 1 byte (optional)
Endpoint 2 IN
0x05
Read 1 byte (optional)
Endpoint 0 OUT
0x40
Read 1 byte
Endpoint 0 IN
0x41
Read 1 byte
Endpoint 1 OUT
0x42
Read 1 byte
Endpoint 1 IN
0x43
Read 1 byte
Endpoint 2 OUT
0x44
Read 1 byte
Endpoint 2 IN
0x45
Read 1 byte
Endpoint 0 OUT
0x80
Read 1 byte
Endpoint 0 IN
0x81
Read 1 byte
Endpoint 1 OUT
0x82
Read 1 byte
Endpoint 1 IN
0x83
Read 1 byte
Endpoint 2 OUT
0x84
Read 1 byte
Endpoint 2 IN
0x85
Read 1 byte
Read Buffer
Selected Endpoint
0xF0
Read multiple bytes
Write Buffer
Selected Endpoint
0xF0
Write multiple bytes
Set Endpoint Status
Endpoint 0 OUT
0x40
Write 1 byte
Endpoint 0 IN
0x41
Write 1 byte
Endpoint 1 OUT
0x42
Write 1 byte
Endpoint 1 IN
0x43
Write 1 byte
Endpoint 2 OUT
0x44
Write 1 byte
Endpoint 2 IN
0x45
Write 1 byte
Acknowledge Setup
Selected Endpoint
0xF1
None
Clear Buffer
Selected Endpoint
0xF2
None
Read Last Transaction
Status
Read Endpoint Status
91
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Command Name
Target
Code (hex)
Validate Buffer
Selected Endpoint
0xFA
Clearance No.: FTDI# 483
Data phase
None
General Commands
Read Current Frame
Number
Device
0xF5
Read 1 or 2 bytes
Send Resume
Device
0xF6
None
Table 2.117 Default Command Set
92
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Command Name
Target
Code (hex)
Clearance No.: FTDI# 483
Data phase
Initialization Commands
Set Address Enable
Device
0xD0
Write 1 byte
Set Endpoint Enable
Device
0xD8
Write 1 byte
Set Mode
Device
0xF3
Write 2 bytes
Reserved
Device
0xFB
Write/Read 2 bytes
Set Endpoint
Configuration
Endpoint 0 OUT
0xB0
Write 1 byte
Endpoint 0 IN
0xB1
Write 1 byte
Endpoint 1 OUT
0xB2
Write 1 byte
Endpoint 1 IN
0xB3
Write 1 byte
Endpoint 2 OUT
0xB4
Write 1 byte
Endpoint 2 IN
0xB5
Write 1 byte
Endpoint 3 OUT
0xB6
Write 1 byte
Endpoint 3 IN
0xB7
Write 1 byte
Endpoint 4 OUT
0xB8
Write 1 byte
Endpoint 4 IN
0xB9
Write 1 byte
Endpoint 5 OUT
0xBA
Write 1 byte
Endpoint 5 IN
0xBB
Write 1 byte
Endpoint 6 OUT
0xBC
Write 1 byte
Endpoint 6 IN
0xBD
Write 1 byte
Endpoint 7 OUT
0xBE
Write 1 byte
Endpoint 7 IN
0xBF
Write 1 byte
Data Flow Commands
Read Interrupt Register
Device
0xF4
Read 1 to 4 bytes
Select Endpoint
Endpoint 0 OUT
0x00
Read 1 byte (optional)
Endpoint 0 IN
0x01
Read 1 byte (optional)
Endpoint 1 OUT
0x02
Read 1 byte (optional)
Endpoint 1 IN
0x03
Read 1 byte (optional)
Endpoint 2 OUT
0x04
Read 1 byte (optional)
Endpoint 2 IN
0x05
Read 1 byte (optional)
Endpoint 3 OUT
0x06
Read 1 byte (optional)
Endpoint 3 IN
0x07
Read 1 byte (optional)
Endpoint 4 OUT
0x08
Read 1 byte (optional)
Endpoint 4 IN
0x09
Read 1 byte (optional)
Endpoint 5 OUT
0x0A
Read 1 byte (optional)
Endpoint 5 IN
0x0B
Read 1 byte (optional)
Endpoint 6 OUT
0x0C
Read 1 byte (optional)
93
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Command Name
Read Last Transaction
Status
Read Endpoint Status
Read Buffer
Target
Code (hex)
Clearance No.: FTDI# 483
Data phase
Endpoint 6 IN
0x0D
Read 1 byte (optional)
Endpoint 7 OUT
0x0E
Read 1 byte (optional)
Endpoint 7 IN
0x0F
Read 1 byte (optional)
Endpoint 0 OUT
0x40
Read 1 byte
Endpoint 0 IN
0x41
Read 1 byte
Endpoint 1 OUT
0x42
Read 1 byte
Endpoint 1 IN
0x43
Read 1 byte
Endpoint 2 OUT
0x44
Read 1 byte
Endpoint 2 IN
0x45
Read 1 byte
Endpoint 3 OUT
0x46
Read 1 byte
Endpoint 3 IN
0x47
Read 1 byte
Endpoint 4 OUT
0x48
Read 1 byte
Endpoint 4 IN
0x49
Read 1 byte
Endpoint 5 OUT
0x4A
Read 1 byte
Endpoint 5 IN
0x4B
Read 1 byte
Endpoint 6 OUT
0x4C
Read 1 byte
Endpoint 6 IN
0x4D
Read 1 byte
Endpoint 7 OUT
0x4E
Read 1 byte
Endpoint 7 IN
0x4F
Read 1 byte
Endpoint 0 OUT
0x80
Read 1 byte
Endpoint 0 IN
0x81
Read 1 byte
Endpoint 1 OUT
0x82
Read 1 byte
Endpoint 1 IN
0x83
Read 1 byte
Endpoint 2 OUT
0x84
Read 1 byte
Endpoint 2 IN
0x85
Read 1 byte
Endpoint 3 OUT
0x86
Read 1 byte
Endpoint 3 IN
0x87
Read 1 byte
Endpoint 4 OUT
0x88
Read 1 byte
Endpoint 4 IN
0x89
Read 1 byte
Endpoint 5 OUT
0x8A
Read 1 byte
Endpoint 5 IN
0x8B
Read 1 byte
Endpoint 6 OUT
0x8C
Read 1 byte
Endpoint 6 IN
0x8D
Read 1 byte
Endpoint 7 OUT
0x8E
Read 1 byte
Endpoint 7 IN
0x8F
Read 1 byte
Selected Endpoint
0xF0
Read n bytes
94
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Command Name
Target
Write Buffer
Set Endpoint Status
Clearance No.: FTDI# 483
Code (hex)
Data phase
Selected Endpoint
0xF0
Write n bytes
Endpoint 0 OUT
0x40
Write 1 byte
Endpoint 0 IN
0x41
Write 1 byte
Endpoint 1 OUT
0x42
Write 1 byte
Endpoint 1 IN
0x43
Write 1 byte
Endpoint 2 OUT
0x44
Write 1 byte
Endpoint 2 IN
0x45
Write 1 byte
Endpoint 3 OUT
0x46
Write 1 byte
Endpoint 3 IN
0x47
Write 1 byte
Endpoint 4 OUT
0x48
Write 1 byte
Endpoint 4 IN
0x49
Write 1 byte
Endpoint 5 OUT
0x4A
Write 1 byte
Endpoint 5 IN
0x4B
Write 1 byte
Endpoint 6 OUT
0x4C
Write 1 byte
Endpoint 6 IN
0x4D
Write 1 byte
Endpoint 7 OUT
0x4E
Write 1 byte
Endpoint 7 IN
0x4F
Write 1 byte
Acknowledge Setup
Selected Endpoint
0xF1
None
Clear Buffer
Selected Endpoint
0xF2
None
Validate Buffer
Selected Endpoint
0xFA
None
General Commands
Send Resume
Device
0xF6
None
Read Current Frame
Number
Device
0xF5
Read 1 or 2 bytes
Set Buffer Interrupt
Mode
Device
0xEC
None
Table 2.118 Enhanced Command Set
95
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.11.3 Initialization Commands
2.11.3.1
Set Address Enable
Command
: 0xD0
Data
: Write 1 byte
Bit
6..0
7
Symbol
Reset
Description
Address
0
USB assigned device address. A bus reset will reset all
address bits to 0.
Enable
0
Function enable. A bus reset will automatically enable
the function at default address 0.
Table 2.119 Address Enable Register
2.11.3.2
Set Endpoint Enable
Command
: 0xD8
Data
: Write 1 byte
Bit
Symbol
Reset
Description
0
EP_Enable
0
Enable all endpoints (Note EP0 is always enabled
regardless the setting of EP_Enable bit). Endpoints can
only be enabled when the function is enabled.
7..1
Reserved
0
Reserved, write to 0
Table 2.120 Endpoint Enable Register
2.11.3.3
Set Mode
Command
: 0xF3
Data
: Write 2 bytes
96
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Bit
0
1
2
3
Symbol
Reset
Reserved
No Suspend Clock
Clock Running
Interrupt Mode
Clearance No.: FTDI# 483
Description
0
Reserved, write to 0
1
0: CLKOUT switches to 30 kHz during USB suspend
1: CLKOUT remains unchanged during USB suspend
Note: The programmed value is not changed by a bus
reset.
1
0: internal clocks stop during USB suspend
1: internal clocks continue running during USB suspend
This bit must be set to ‘0’ for bus powered applications
in order to meet the USB suspend current requirement.
Note: The programmed value is not changed by a bus
reset.
1
0: an interrupt will not be generated on NAK or Error
transactions
1: an interrupt will be generated on NAK and Error
transactions
Note: The programmed value is not changed by a bus
reset.
4
DP_Pullup
0
0: Pullup resistor on DP pin disabled
1: Pullup resistor on DP pin enabled when Vbus is
present
Note: The programmed value is not changed by a bus
reset.
5
Reserved
0
Reserved, write to 0
0
Set the endpoint configuration mode for EP2.
00: Mode 0 (Non-ISO Mode)
01: Mode 1 (ISO-OUT Mode)
10: Mode 2 (ISO-IN Mode)
11: Mode 3 (ISO-IO Mode)
In Enhanced Mode, these 2 bits are reserved. The
Endpoint Configuration will be done through separate
commands. See “Set Endpoint Configuration”
commands.
7-6
Endpoint
Configuration Mode
Table 2.121 Configuration Register (Byte 1)
97
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Bit
Symbol
Clearance No.: FTDI# 483
Reset
Description
0xB
The Clock Division Factor value (CDF) determines the
output clock frequency on the CLKOUT pin. Frequency =
48 MHz / (CDF +1), where CDF ranges 1-12 or the
allowed CLKOUT frequency is 4-24 MHz. Default CLKOUT
is 4 MHz.
When the CDF is programmed to 0xF, the CLKOUT will
be turned off. It is recommended to turn off the CLKOUT
if it is not used, for power saving.
Note: The programmed value is not be changed by a
bus reset.
3-0
Clock Division Factor
5-4
Reserved
0
Reserved, write to 0
6
SET_TO_ONE
0
This bit must be set to 1
7
SOF-only Interrupt
Mode
0
0: normal operation
1: interrupt will generate on receiving SOF packet only.
Table 2.122 Clock Division Factor Register (Byte 2)
2.11.3.4
Set Endpoint Configuration (for Enhanced Mode)
Command
: 0xB0-0xBF
Data
: Write 1 byte
Bit
0
2-1
6-3
7
Symbol
Reset
Description
0
Enable or disable the endpoint index associated with the
command
0
Endpoint type
00: control
01: bulk or interrupt
10: isochronous
11: reserved
Max Packet Size
0
Maximum USB packet size for this endpoint. Defined by
the IN buffer or OUT buffer size for the endpoint. Refer
to Section 2.11.1 for full details on the buffer
configuration.
Reserved
0
Reserved, write to 0
Endpoint Enabled
Endpoint Type
Table 2.123 Endpoint Configuration Register
98
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.11.4 Data Flow Commands
2.11.4.1
Read Interrupt Register
Command
: 0xF4
Data
: Read 1 or 2 bytes (Default Mode); Read 1-4 bytes (Enhanced Mode)
Bit
Symbol
Reset
Description
0
Endpoint 0 Out
0
Interrupt for endpoint 0 OUT buffer. Cleared by Read
Last Transaction Status command.
1
Endpoint 0 In
0
Interrupt for endpoint 0 IN buffer. Cleared by Read Last
Transaction Status command.
2
Endpoint 1 Out
0
Interrupt for endpoint 1 OUT buffer. Cleared by Read
Last Transaction Status command.
3
Endpoint 1 In
0
Interrupt for endpoint 1 IN buffer. Cleared by Read Last
Transaction Status command.
4
Endpoint 2 Out
0
Interrupt for endpoint 2 OUT buffer. Cleared by Read
Last Transaction Status command.
5
Endpoint 2 In
0
Interrupt for endpoint 2 IN buffer. Cleared by Read Last
Transaction Status command.
6
Bus Reset
0
Interrupt for bus reset. This bit will be cleared after
reading.
0
Interrupt for USB bus suspend status change. This bit
will be set to ‘1’ when the USB Full Speed device
controller goes to suspend (missing 3 continuous SOFs)
or resumes from suspend. This bit will be cleared after
reading.
7
Suspend Change
Table 2.124 Interrupt Register Byte 1
Bit
7..0
Symbol
Reserved
Reset
0
Description
Reserved
Table 2.125 Interrupt Register Byte 2
99
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Bit
Symbol
Reset
Clearance No.: FTDI# 483
Description
0
Endpoint 3 Out
0
Interrupt for endpoint 3 OUT buffer. Cleared by Read
Last Transaction Status command.
1
Endpoint 3 In
0
Interrupt for endpoint 3 IN buffer. Cleared by Read Last
Transaction Status command.
2
Endpoint 4 Out
0
Interrupt for endpoint 4 OUT buffer. Cleared by Read
Last Transaction Status command.
3
Endpoint 4 In
0
Interrupt for endpoint 4 IN buffer. Cleared by Read Last
Transaction Status command.
4
Endpoint 5 Out
0
Interrupt for endpoint 5 OUT buffer. Cleared by Read
Last Transaction Status command.
5
Endpoint 5 In
0
Interrupt for endpoint 5 IN buffer. Cleared by Read Last
Transaction Status command.
6
Endpoint 6 Out
0
Interrupt for endpoint 6OUT buffer. Cleared by Read
Last Transaction Status command.
7
Endpoint 6 In
0
Interrupt for endpoint 6 IN buffer. Cleared by Read Last
Transaction Status command.
Table 2.126 Interrupt Register Byte 3 (for Enhanced Mode)
Bit
Symbol
Reset
Description
0
Endpoint 7 Out
0
Interrupt for endpoint 7 OUT buffer. Cleared by Read
Last Transaction Status command.
1
Endpoint 7 In
0
Interrupt for endpoint 7 IN buffer. Cleared by Read Last
Transaction Status command.
Reserved
0
Reserved
7..2
Table 2.127 Interrupt Register Byte 4 (for Enhanced Mode)
100
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.11.4.2
Select Endpoint
Command
: 0x00-0x05 (0x00-0x0F for Enhanced Mode)
Data
: Optional Read 1 byte
Bit
Symbol
Reset
Clearance No.: FTDI# 483
Description
0
Full/Empty
0
0: selected endpoint buffer is empty
1: selected endpoint buffer is full
1
Stall
0
0: selected endpoint is not stalled
1: selected endpoint is stalled
Reserved
0
Reserved
7..2
Table 2.128 Endpoint Status Register
2.11.4.3
Read Last Transaction Status
Command
: 0x40-0x45 (0x40-0x4F for Enhanced Mode)
Data
: Read 1 byte
Bit
Symbol
Reset
Description
Data
Receive/Transmit
Success
0
0: indicate USB data receive or transmit not OK
1: indicate USB data receive or transmit OK
Error Code
0
Refer to the error code Table 2.130
5
Setup Packet
0
0: indicates the packet is not a setup packet
1: indicates the last received packet has a SETUP token
6
Data 0/1 Packet
0
0: packet has a DATA0 token
1: packet has a DATA1 token
7
Previous Status not
Read
0
0: previous transaction status was read
1: previous transaction status was not read
0
4..1
Table 2.129 Endpoint Last Transaction Status Register
101
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Error Code
Result
0000
No error
0001
PID encoding error
0010
PID unknown
0011
Unexpected packet
0100
Token CRC error
0101
Data CRC error
0110
Time out error
0111
Reserved
1000
Unexpected EOP
1001
Packet NAKed
1010
Sent stall
1011
Buffer overflow
1101
Bit stuff error
1111
Wrong DATA PID
Clearance No.: FTDI# 483
Table 2.130 Transaction error code
102
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.11.4.4
Read Endpoint Status
Command
: 0x80-0x85 (0x80-0x8F for Enhanced Mode)
Data
: Read 1 byte
Bit
1..0
Symbol
Reset
Clearance No.: FTDI# 483
Description
Reserved
0
Reserved
Setup packet
0
0: indicates packet is not a setup packet
1: indicates last received packet has a SETUP token
Reserved
0
Reserved
5
Buffer 0 Full
0
0: buffer 0 is not filled up
1: buffer 0 is filled up
6
Buffer 1 Full
0
0: buffer 1 is not filled up
1: buffer 1 is filled up
7
Endpoint Stalled
0
0: endpoint is not stalled
1: endpoint is stalled
2
4..3
Table 2.131 Endpoint Buffer Status Register
2.11.4.5
Read Buffer
Command
: 0xF0
Data
: Read multiple bytes
The Read Buffer command is used to read the received packet from the selected endpoint OUT
buffer.
The data in the endpoint buffer is organized as follows:
byte 0: length of payload packet, MSB(for default mode this byte is ignored)
byte 1: length of payload packet, LSB
byte 2: Payload packet byte 1
byte 3: Payload packet byte 2
…
byte n+1: Payload packet byte n (n = packet length)
2.11.4.6
Write Buffer
Command
: 0xF0
Data
: Write multiple bytes
The Write Buffer command is used to write a payload packet to the selected endpoint IN buffer.
The data must be organized in the same way as described in the Read Buffer command. For the
default mode, byte 0 should always be set to 0x00.
103
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.11.4.7
Clear Buffer
Command
: 0xF2
Data
: None
Clearance No.: FTDI# 483
Following a Read Buffer command, the Clear Buffer command should be issued after all data has
been read out from the endpoint buffer. This is to free the buffer to receive next packet from the
USB host.
2.11.4.8
Validate Buffer
Command
: 0xFA
Data
: None
Following a Write Buffer command, the Validate Buffer command should be issued after all data
has been written to the endpoint buffer. This is to set the buffer full flag so that the packet can be
sent to the USB host when the IN token arrives.
2.11.4.9
Set Endpoint Status
Command
: 0x40-0x45 (0x40-0x4F for Enhanced Mode)
Data
: Write 1 byte
Bit
0
7..1
Symbol
Reset
Description
Stall
0
0: Disable the endpoint STALL state.
1: Enable the endpoint STALL state.
For EP0 OUT (control OUT endpoint) the STALL state will
automatically be cleared by a received SETUP packet.
When this bit is written to ‘0’, the endpoint will
reinitialise. Any data in the endpoint buffer will be
flushed away, and the PID for the next packet will carry
a DATA0 flag.
Reserved
0
Reserved
Table 2.132 Endpoint Control Register
2.11.4.10
Acknowledge Setup
Command
: 0xF1
Data
: None
When receiving a SETUP packet the USB Full Speed device controller will flush the IN buffer and
disable the Validate Buffer and Clear Buffer commands for both Control IN and Control OUT
endpoints. The MCU shall read and process the SETUP packet, and then issue the Acknowledge
Setup command to re-enable the Validate Buffer and Clear Buffer commands. The Acknowledge
Setup command must be sent to both Control IN and Control OUT endpoints.
104
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.11.5 General Commands
2.11.5.1
Read Current Frame Number
Command
: 0xF5
Data
: Read One or Two Bytes
Bit
7..0
Symbol
Reset
Frame Number LSB
0
Description
Frame number for last received SOF, byte 1 (least
significant byte)
Table 2.133 Frame Number LSB Register
Bit
Symbol
Reset
Description
2..0
Frame Number MSB
0
Frame number for last received SOF, byte 2 (Most
significant byte)
7..3
Reserved
0
Reserved
Table 2.134 Frame Number MSB Register
2.11.5.2
Send Resume
Command
: 0xF6
Data
: None
To perform remote-wakeup when suspended, the CPU needs to issue a Send Resume command.
The USB Full Speed device controller will send an upstream resume signal for a period of 10 ms. If
the clock is not running during suspend, the MCU needs to wakeup FT122USB Full Speed device
controller by drive SUSPEND pin to LOW, followed by Send Resume command.
2.11.5.3
Set Buffer Interrupt Mode
Command
: 0xEC (for Enhanced Mode)
Data
: none
The read or write buffer commands can be interrupted, typically by a read interrupt register or
read last transaction status command, and can be resumed without having to re-issue a read or
write buffer command. When the default command set is in use, a read or write buffer command
can be resumed after 2 bytes have been read with a read interrupt command. In this case the USB
Full Speed device controller design is primed to resume a read or write buffer command if another
command is not issued and a read or write occurs.
For the enhanced command set the read interrupt register command has been extended to read 4
bytes. The USB Full Speed device controller therefore needs to know whether to prime at 2 or 4
bytes. The Set Buffer Interrupt Mode command notifies the USB Full Speed device controller to
prime after 4 bytes.
105
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.12 Pulse Width Modulation
The Pulse Width Modulation (PWM) module provides a number of PWM outputs individually
controlled by the FT51A CPU.
The main purpose is to generate PWM signals which can be used to control motors, DC/DC
converters, AC/DC supplies, etc.
The PWM block can generate pulse width modulated signals where parameters such as period and
duty cycle are controlled by the CPU writing to memory mapped registers. All PWM outputs use a
common pre-scaler block and 16-bit counter. The PWM module has eight 16-bit comparators to
control up to eight toggles (four pulses where each period and duty cycle is individually set) of the
generated signals. The additional clr signal sets output to the initial state. The module also consists
of an output control block which enables PWM outputs (once, twice .... 255 times, forever) and
generates an interrupt.
The registers associated with the Pulse Width Modulation (PWM) are outlined below.
I/O
Address
Register Name
Description
0x80
PWM_CONTROL
PWM top level control register
0x81
PWM_INT_CTRL
PWM control register
0x82
PWM_PRESCALER
System clock pre-scaler register
0x83
PWM_CNT16_LSB
PWM counter LSB register
0x84
PWM_CNT16_MSB
PWM counter MSB register
0x85
PWM_CMP16_0_LSB
PWM comparator LSB register 0
0x86
PWM_CMP16_0_MSB
PWM comparator MSB register 0
0x87
PWM_CMP16_1_LSB
PWM comparator LSB register 1
0x88
PWM_CMP16_1_MSB
PWM comparator MSB register 1
0x89
PWM_CMP16_2_LSB
PWM comparator LSB register 2
0x8A
PWM_CMP16_2_MSB
PWM comparator MSB register 2
0x8B
PWM_CMP16_3_LSB
PWM comparator LSB register 3
0x8C
PWM_CMP16_3_MSB
PWM comparator MSB register 3
0x8D
PWM_CMP16_4_LSB
PWM comparator LSB register 4
0x8E
PWM_CMP16_4_MSB
PWM comparator MSB register 4
0x8F
PWM_CMP16_5_LSB
PWM comparator LSB register 5
0x90
PWM_CMP16_5_MSB
PWM comparator MSB register 5
0x91
PWM_CMP16_6_LSB
PWM comparator LSB register 6
106
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
0x92
PWM_CMP16_6_MSB
PWM comparator MSB register 6
0x93
PWM_CMP16_7_LSB
PWM comparator LSB register 7
0x94
PWM_CMP16_7_MSB
PWM comparator MSB register 7
0x95
PWM_OUT_TOGGLE_EN_0
PWM out toggle enable register 0
0x96
PWM_OUT_TOGGLE_EN_1
PWM out toggle enable register 1
0x97
PWM_OUT_TOGGLE_EN_2
PWM out toggle enable register 2
0x98
PWM_OUT_TOGGLE_EN_3
PWM out toggle enable register 3
0x99
PWM_OUT_TOGGLE_EN_4
PWM out toggle enable register 4
0x9A
PWM_OUT_TOGGLE_EN_5
PWM out toggle enable register 5
0x9B
PWM_OUT_TOGGLE_EN_6
PWM out toggle enable register 6
0x9C
PWM_OUT_TOGGLE_EN_7
PWM out toggle enable register 7
0x9D
PWM_OUT_CLR_EN
PWM out clear enable register
0x9E
PWM_CTRL_BL_CMP8
PWM control block register
0x9F
PWM_INIT
PWM initialization register
Table 2.135 PWM Register Addresses
Pulse Width Modulation (PWM) is the simplest form of duty cycle control. Consider the simple
square wave in the figure below.
Figure 2.7 Square wave with 50 % duty cycle
In this example, the width of the high pulse is equal to the width of the low pulse. This waveform
has a 50 % duty cycle. If the amplitude of this square wave is 5V, the RMS voltage can be
calculated as:
VRMS = VPEAK * SQRT (Duty Cycle)
VRMS = 5V * SQRT (.50)
VRMS = 3.54V
If the duty cycle is reduced, then the RMS voltage reduces. This is illustrated in the following
example which shows a waveform with a 20% duty cycle:
107
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Figure 2.8 Square wave with 20 % duty cycle
With the same 5V peak amplitude as the 50% duty cycle waveform, the 20% duty cycle waveform
has the following RMS voltage:
VRMS = 5V * SQRT (.20)
VRMS = 2.24V
By changing the duty cycle, the effective RMS is modified without changing the signal amplitude.
Why is this important?
By changing the amplitude and duty cycle of the signal, it is essentially generating an analogue
signal from a digital source. PWM is a method that can be used to interface to analogue hardware
using a digital source such as a microcontroller.
Real world applications of PWM include lamp brightness, electric motor control and servo control.
The FT51A has 8 independent PWM channels. The following describes all registers used to control
these PWM channels.
2.12.1 PWM_CONTROL
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
pwm_dev_en
R/W
0
Enable PWM
0
pwm_soft_reset
W1T
0
Reset PWM
Table 2.136 PWM Control Register
The PWM Control register provides top-level enable and reset functions for the PWM module.
The PWM module is enabled by setting the pwm_dev_en bit to 1. Clearing this bit will disable the
module.
To reset the module, a 1 is written to the pwm_soft_reset bit. This is cleared when the reset is
performed and will therefore always read as ‘0’.
108
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.12.2 PWM_INT_CTRL
Bit
Position
Bit Field Name
Type
Reset
Description
7..6
Reserved
RFU
0
Reserved
5
pwm_int
R/W
0
PWM interrupt
4
pwm_int_ien
R/W
0
PWM interrupt enable
3
pwm_busy
R
0
PWM busy
2
pwm_trigger_en_1
R/W
0
1
pwm_trigger_en_0
R/W
0
PWM trigger enable: 00 disabled,
01 positive edge, 01 negative edge
11 any edge
0
pwm_en
R/W
0
PWM enable connected to Control
block.
Table 2.137 PWM Ctrl 1 Register
This register allows enabling and detecting PWM interrupt, PWM busy, and setting up the trigger
edge.
2.12.3 PWM_PRESCALER
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
prescaler
R/W
0
8-bit prescaler value
Table 2.138 PWM Prescaler Register
This is a programmable counter that reduces the frequency of the system clock to the desired
frequency. The pre-scaler is shared by all 8 PWM channels.
2.12.4 PWM_CNT16_LSB
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
cnt16_lsb
R/W
0
LSB of a 16-bit counter value
Table 2.139 PWM Counter LSB Register
This is a LSB part of a programmable counter that determines the period of the PWM signal.
The input clock is from the pre-scaler block. The 16 bit counter is shared by all 8 PWM channels.
109
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.12.5 PWM_CNT16_MSB
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
cnt16_msb
R/W
0
MSB of a 16-bit counter value
Table 2.140 PWM Counter MSB Register
This is a MSB part of a programmable counter that determines the period of the PWM signal.
The input clock is from the pre-scaler block. The 16 bit counter is shared by all 8 PWM channels.
2.12.6 PWM_CMP16_0_LSB - PWM_CMP16_7_LSB
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
cmp16_lsb
R/W
0
LSB of a 16-bit comparator value
Table 2.141 PWM Comparator LSB Register
Up to 8 comparators can be used per PWM channel. The number of comparators assigned to
a PWM channel determines the toggle events (up to 8), which give up to 4 data pulses.
Simple duty cycle based pulse width modulation can be programmed with only two comparators.
There are a total of 8 comparators in the PWM module. Here only the first comparator is shown, as
the remaining seven are exact copies of it.
2.12.7 PWM_CMP16_0_MSB - PWM_CMP16_7_MSB
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
cmp16_msb
R/W
0
MSB of a 16-bit comparator value
Table 2.142 PWM Comparator MSB Register
This is a MSB part of a programmable comparator that determines the toggle events. The 16-bit
counter is shared across all 8 PWM channels. Here only the first comparator is shown, as the
remaining seven are exact copies of it.
2.12.8 PWM_OUT_TOGGLE_EN_0 - PWM_OUT_TOGGLE_EN_7
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
toggle_en
R/W
0
PWM Out toggle enable bits for each
of the 8 PWM channels.
Table 2.143 PWM Toggle Enable Register
There are eight Toggle Enable registers. Each is used to select which combination of PWM
comparators to use.
110
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.12.9 PWM_OUT_CLR_EN
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
clr_en
R/W
0
PWM Out Clear Enable bits for each of
the 8 PWM channels.
Table 2.144 PWM Out Clear Enable Register
2.12.10
Bit
Position
7..0
PWM_CTRL_BL_CMP8
Bit Field Name
Type
R/W
ctrl_bl_cmp8
Reset
Description
0
Control block CMP8 value.
0 continuous
1 one shot
2-255 repeat specified number of
times
Table 2.145 PWM Control Block Register
This controls the number of times to repeat the PWM waveform. The control block is shared across
all 8 PWM channels.
2.12.11
PWM_INIT
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
init
R/W
0
PWM Initialization register bits for
each of the 8 PWM channels.
Table 2.146 PWM Initialisation Register
2.12.12
Use Cases
The following section describes an example of how to generate a 4-pulse PWM waveform using the
FT51A, which toggles at the following counter states: 7, 8, 12, 14, 15, 16, 19, and 22.
Figure 2.9 Pulse Waveform generated by 8 comparators
In this example there are eight toggle events and all eight comparators are used. In this example,
the 16 bit counter is programmed to count 24 states and then restart, and four pulses are
generated.
111
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Comparator#
Programmed
Toggle Value
0
7
1
8
2
12
3
14
4
15
5
16
6
19
7
22
Clearance No.: FTDI# 483
Pulse Width
(clock cycles)
1
2
1
3
Table 2.147 Programming 8 FT51A comparators to generate above waveform
For a simple duty cycle PWM, where only a single pulse is required, only 2 comparators would be
necessary and only a single pulse is generated. For example, to generate a 50% duty cycle
waveform for the clock/counter combination, comparators 0 & 1 could be programmed as follows:
Comparator#
Programmed
Toggle Value
0
2
1
14
Pulse Width
(clock cycles)
12
Table 2.148 Programming 2 FT51A comparators for 50 % duty cycle
In this example, there are 24 clocks per cycle and the PWM output changes state (toggles) every
12 clocks (12/24). This produces a 50 % duty cycle. By programming different toggling values into
the FT51A comparators, a wide range of duty cycles can be generated.
First parameter to decide on is the frequency of the PWM Clock. The highest possible PWM
frequency is 48MHz (no pre-scaling).
To derive the PWM Clock, set up the FT51A System Clock pre-scaler.
Pre-scale by 1 to get the PWM Clock equalling to a half of the FT51A System Clock.
Pre-scale by 255 to get the PWM Clock equalling to the FT51A System Clock divided by 256, etc.
Therefore to get the required PWM Clock frequency use the following formula and code:
PWM Clock = FT51A System Clock / (prescaler+1)
//Set PWM prescaler to divide the FT51A System Clock by 2
WRITE_IO_REG(0x82,
0x01); //PWM_PRESCALER
To set the PWM sequence time, specify the number of PWM pulses to count from 0 to 65535:
PWM sequence period = (total PWM pulses) * (prescaler+1)/ FT51A System Clock,
where 0<= total PWM pulses <=65535.
And set the PWM counter value with the MSB and LSB registers as follows:
//Set PWM counter
WRITE_IO_REG(0x84,
0x12); //PWM_CNT16_MSB
WRITE_IO_REG(0x83,
0x34); //PWM_CNT16_LSB
112
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
For clarification, follow this example.
Specify the PWM Pre-scaler to divide the FT51A System Clock to get the 1MHz PWM clock.
Next, set the PWM counter, for example, to the maximum value of 0xFFFF. Hence, the time it
takes to reach value 0xFFFF is equal to 1us * 0xFFFF = 65535us. In brief, the duration (width) of
the PWM pulse is influenced by two parameters: PWM Clock and PWM Counter, giving two extreme
situations (min and max):
1 - (assuming the 48MHz FT51A System Clock) Set the PWM Clock to its maximum value of 48MHz
and increment PWM counter only by one to get the PWM pulse of roughly 20ns.
PWM Clock = 48MHz;
PWM Counter = 1;
PWM Pulse Duration = 20ns
2a - (assuming the 48MHz FT51A Clock) Set the PWM Clock to its minimum value of 187.5kHz
(assuming the 48MHz FT51A Clock) and increment PWM counter by 65535 to get the PWM pulse of
roughly 349.52ms.
PWM Clock = 187.5kHz;
PWM Counter = 65535;
PWM Pulse Duration = 349.52ms
2b - (assuming the 6MHz FT51A Clock) Set the PWM Clock to its minimum value of 23.437kHz and
increment PWM counter by 65535 to get the PWM pulse of roughly 2.8s.
PWM Clock = 23.437kHz;
PWM Counter = 65535;
PWM Pulse Duration = 2.8s
Hence the ranges become:
System Clock [MHz]
PWM Clock
PWM Pulse Duration
Min [Hz]
Max [MHz]
Min [ns]
Max [s]
48
187500
48
20.8ns
0.34952s
24
93750
24
41.6ns
0.69904s
12
46875
12
83.3ns
1.39808s
6
23437
6
166.6ns
2.79622s
Table 2.149. PWM Ranges
To specify the width of a specific PWM pulse, set the comparators at times required and enable
them by the toggle register. The following sets the width from 0 to 0xAAFF.
Note: The toggle register number relates to the PWM number assigned via IOMux.
113
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
// Assign PWM output pad
WRITE_IO_REG (0x41, 12); // IOMUX_OUTPUT_PAD_SEL, pad number AIO_12
WRITE_IO_REG (0x42, 38);// IOMUX_OUTPUT_SIG_SEL, PWM_OUT_03
WRITE_IO_REG(0x16, 1); // DIGITAL_CONTROL_AIO_12
//Set PWM Comparator 0
WRITE_IO_REG(0x86,
0x00); //PWM_CMP16_0_MSB
WRITE_IO_REG(0x85,
0x00); //PWM_CMP16_0_LSB
//Set PWM Comparator 1
WRITE_IO_REG(0x88, 0xAA); //PWM_CMP16_1_MSB
WRITE_IO_REG(0x87, 0xFF); //PWM_CMP16_1_LSB
// Set toggle enables for the two comparators above
WRITE_IO_REG(0x95, 0x03); //PWM_OUT_TOGGLE_EN_0
PWM initialization is performed as follows:
// Top level PWM soft reset
WRITE_IO_REG (0x80, 0x01); // PWM_CONTROL, PWM_SOFT_RESET
// Top level PWM enable
WRITE_IO_REG (0x80, 0x02); // PWM_CONTROL, PWM_DEV_EN
// Set initial output state
WRITE_IO_REG (0x9F, 0x00); // PWM_INIT
// Number of repetitions
WRITE_IO_REG (0x9E, 0x00); // PWM_CTRL_BL_CMP8
// Enable output
WRITE_IO_REG (0x81, 0x01); // PWM_INT_CTRL, PWM_EN
114
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.13 Timers
The FT51A is equipped with two types of timers: standard 8051 timers and FTDI timers. Standard
timers are Timer 0, 1 and 2 which are accessed through SFRs, while the FTDI timers comprise 16bit Timers A, B, C and D and are controlled by means of I/O registers. .
The four FTDI timers can be clocked off main clock or a common 16-bit pre-scaler. This can be
selected for each timer individually. These timers can be started, stopped and cleared or initialised
separately. Current values of all four “user timers” can be read from registers (one at a time common register, multiplexed access). All timers can count up or down and signal an interrupt
when they roll over. Each of them can be configured to be in one-shot or in continuous mode.
They are initialised from a common register set so only one may be initialised at a time
(multiplexed access).
The FTDI watchdog timer is clocked off the main clock. The watchdog is initialised with a 5-bit
register. The value of this register points to a single bit of a 32-bit counter that will be set. A timer
then decrements and signals an interrupt when it rolls over. Once started and initialised the
watchdog cannot be stopped. It can be cleared by writing into a register.
The pre-scaler block is a 16-bit timer/counter. It can be cleared / initialised by writing into a
register in the same way as other timers. However if one of the FTDI timers has already started
using the pre-scaler it cannot be cleared and the command is ignored. The pre-scaler
automatically stops after it is cleared. It also starts automatically when any of the FTDI timers
using it starts.
All timers (the 4 FTDI timers, pre-scaler and watchdog) are initialised with a start value if counting
up or 0 if counting down.
Below is a list of registers associated with the FTDI Timers:
115
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
I/O
Address
Register Name
Description
0x70
TIMER_CONTROL
Timers top level control register
0x71
TIMER_CONTROL_1
Timer start/stop control register
0x72
TIMER_CONTROL_2
Timer pre-scaler and watchdog
0x73
TIMER_CONTROL_3
Timer settings
0x74
TIMER_CONTROL_4
Clear timer and pre-scaler
0x75
TIMER_INT
Timer interrupts
0x76
TIMER_SELECT
Timer select/read
0x77
TIMER_WDG
Watchdog start value
0x78
TIMER_WRITE_LS
Timer start value
0x79
TIMER_WRITE_MS
Timer start value
0x7A
TIMER_PRESC_LS
Timer pre-scale value
0x7B
TIMER_PRESC_MS
Timer pre-scale value
0x7C
TIMER_READ_LS
Timer read value
0x7D
TIMER_READ_MS
Timer read value
Table 2.150 Timer Register Addresses
2.13.1 TIMER_CONTROL
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
timer_dev_en
R/W
0
Write a 1 to enable TIMER
0
timer_soft_reset
W1T
0
Write a 1 to reset TIMER
Table 2.151 Timer Control Register
The Timer Control register provides top-level enable and reset functions for the timer module.
The timer module is enabled by setting the timer_dev_en bit to 1. Clearing this bit will disable the
module.
To reset the module, a 1 is written to the timer_soft_reset bit. This is cleared when the reset is
performed and will therefore always read as ‘0’.
116
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.13.2 TIMER_CONTROL_1
Bit
Position
Bit Field Name
Type
Reset
Description
7
stop_D
W1T
0
Stop the timer D
6
stop_C
W1T
0
Stop the timer C
5
stop_B
W1T
0
Stop the timer B
4
stop_A
W1T
0
Stop the timer A
3
start_D
W1T
0
Start the timer D
2
start_C
W1T
0
Start the timer C
1
start_B
W1T
0
Start the timer B
0
start_A
W1T
0
Start the timer A
Table 2.152 Timer Control 1 Register
2.13.3 TIMER_CONTROL_2
Bit
Position
Bit Field Name
Type
Reset
Description
7..4
prescaler_en
R/W
0
Enable pre-scaler bits for timers A..D.
3
wdg_int_ien
R/W
0
Watchdog interrupt enable.
2
wdg_int
R/W
0
Watchdog interrupt.
1
clear_wdg
W1T
0
Clear watchdog.
0
start_wdg
W1T
0
Start watchdog.
Table 2.153 Timer Control 2 Register
2.13.4 TIMER_CONTROL_3
Bit
Position
Bit Field Name
Type
Reset
Description
7..4
direction
R/W
0
Write '1' for up counter for timer A
(bit 4) to D (bit 7). Default: Down
counter.
3..0
mode
R/W
0
Write '1' to enable one-shot from
timer A (bit 0) to D (bit 3). Default:
Continuous mode.
Table 2.154 Timer Control 3 Register
117
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.13.5 TIMER_CONTROL_4
Bit
Position
Bit Field Name
Type
Reset
Description
4
presc_clear
W1T
0
Pre-scaler clear.
3
clear_D
W1T
0
Clear Timer D.
2
clear_C
W1T
0
Clear Timer C.
1
clear_B
W1T
0
Clear Timer B.
0
clear_A
W1T
0
Clear Timer A.
Table 2.155 Timer Control 3 Register
2.13.6 TIMER_INT
Bit
Position
Bit Field Name
Type
Reset
Description
7
timer_int_D_ien
R/W
0
Timer D interrupt enable.
6
timer_int_D
R/W
0
The timer D interrupt.
5
timer_int_C_ien
R/W
0
Timer C interrupt enable.
4
timer_int_C
R/W
0
The timer C interrupt.
3
timer_int_B_ien
R/W
0
Timer B interrupt enable.
2
timer_int_B
R/W
0
The timer B interrupt.
1
timer_int_A_ien
R/W
0
Timer A interrupt enable.
0
timer_int_A
R/W
0
The timer A interrupt.
Table 2.156 Timer Control 3 Register
118
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.13.7 TIMER_SELECT
Bit
Position
3..2
1..0
Bit Field Name
timer_read_sel
Type
R/W
R/W
timer_sel
Reset
Description
0
Timer read select bits.
- 00 for timer A
- 01 for timer B
- 10 for timer C
- 11 for timer D
0
Timer select bits.
- 00 for timer A
- 01 for timer B
- 10 for timer C
- 11 for timer D
Table 2.157 Timer Control 3 Register
2.13.8 TIMER_WDG
Bit
Position
Bit Field Name
Type
Reset
Description
4..0
timer_wdg_write
R/W
0
Watchdog bit position to initialise
Table 2.158 Timer Watchdog Register
2.13.9 TIMER_WRITE_LS
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
timer_write_7_0
R/W
0
Bits 7 to 0 of the timer start value.
Table 2.159 Timer Write LSB Register
2.13.10
TIMER_WRITE_MS
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
timer_write_15_8
R/W
0
Bits 15 to 8 of the timer start value.
Table 2.160 Timer Write MSB Register
2.13.11
TIMER_PRESC_LS
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
timer_presc_7_0
R/W
0
Bits 7 to 0 of the pre-scale value.
Table 2.161 Timer Prescaler MSB Register
119
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.13.12
Clearance No.: FTDI# 483
TIMER_PRESC_MS
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
timer_presc_15_8
R/W
0
Bits 15 to 8 of the pre-scale value.
Table 2.162 Timer Prescaler MSB Register
2.13.13
TIMER_READ_LS
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
timer_read_7_0
R/W
0
Read bits 7 to 0 of the timer.
Table 2.163 Timer Read MSB Register
2.13.14
TIMER_READ_MS
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
timer_read_15_8
R/W
0
Read bits 15 to 8 of the timer.
Table 2.164 Timer Read MSB Register
120
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.13.15
Clearance No.: FTDI# 483
Use Cases
The table below presents normal operation of FTDI timers along with pre-scaler and watchdog.
FTDI timers
Prescaler
Watchdog
Select the timer to initialise by writing
timer_sel field in the TIMER_SELECT
register.
Write an initial value
into the TIMER_PRESC_LS
and TIMER_PRESC_MS
registers.
Write an initial value
into the TIMER_WDG
register to initialise one
of the 32 bits of the
timer.
Write into TIMER_CTRL_3 register direction
field to select up/down counting.
N/A
N/A
Write into TIMER_CTRL_3 register mode field
to select mode.
N/A
N/A
Write bit for selected timer to
TIMER_CTRL_4 register to initialise the
timer.
Write clear in
TIMER_CTRL_4 register to
initialise the prescaler (if
possible)
Write clear_wdg in
TIMER_CTRL_2 register to
clear watchdog.
Write the start bit for selected timer in
TIMER_CTRL_1 register to start the timer.
Write prescaler_en bit
in TIMER_CTRL_2 register
to enable prescaler and
it will automatically start
when the timer/timers
using it starts.
Write start_wdg bit in
TIMER_CTRL_2 register to
start watchdog.
Select the timer to read from by writing
the timer_read_sel field in the
TIMER_SELECT register.
N/A
N/A
N/A
N/A
Write initial/final value into the
TIMER_WRITE_MS and TIMER_WRITE_LS
registers.
Current value can be read from the
TIMER_READ_LS and TIMER_READ_MS
registers.
Write the stop bit for the selected timer in
the TIMER_CTRL_1 register to stop the
timer.
Table 2.165 Timers Normal Operation
121
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.13.15.1
Clearance No.: FTDI# 483
Timers
Below is a comparison of steps necessary to setup a standard 8051 Timer 0 versus the FTDI Timer
A.
Standard 8051 Timer 0
//Set the Timer 0 prescaler to 0 (0 – divide-by-12, 1 – divide-by-4)
//Note: CKCON bit 3 relates to Timer 0, bit 4 Timer 1
CKCON &= 0xF7;
// Set timer control mode, either timer mode, counter mode or UART mode.
TMOD &= 0xF0;
TMOD |= 0x01; //select timer mode 1, 16-bit timer THx and TLx are cascaded.
//Preload high and low timer value
TH0 = 0xAA;
TL0 = 0xAA;
//Enable interrupts
IE &= 0x7D;
//Timer control
TCON &= 0xCF; //reset
TCON |= 0x10; //run
while((TCON & 0x20) == 0); //loop until timer overflows
TCON &= 0xCF; // stop
122
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
FTDI Timer A
//Precautionary Top Level Soft Reset
WRITE_IO_REG(0x70, 0x01); //TIMER_CONTROL, TIMER_SOFT_RESET
//Initialize timer by clearing it and the prescaler
WRITE_IO_REG(0x74, 0x11); //TIMER_CONTROL_4, CLEAR_A | PRESC_CLEAR
//Top Level Enable
WRITE_IO_REG (0x70, 0x02); //TIMER_CONTROL, TIMER_DEV_EN
//Select timer
WRITE_IO_REG (0x76, 0x00); //TIMER_SELECT, TIMER A
//Write initial value
WRITE_IO_REG (0x79, 0xAA); //TIMER_WRITE_MS
WRITE_IO_REG (0x78, 0xAA); //TIMER_WRITE_LS
//Enable top-level interrupts
WRITE_IO_REG (0x05, 0x04); //TOP_INT1_0, TIMER_IRQ
//Enable timer interrupt
WRITE_IO_REG (0x75, 0x02); //TIMER_INT, TIMER_INT_A_IEN
//Set the prescaler
WRITE_IO_REG (0x72, 0x10); //TIMER_CONTROL_2, PRESCALER_EN_0
//Start timer A
WRITE_IO_REG (0x71, 0x01); //TIMER_CONTROL_1, START_A
FTDI Timers A, B, C and D require 1 cycle per instruction, whereas standard timers 0, 1 or 2
require either 12 (default) or 4 cycles per instruction. Additionally, the clock for Timers A, B, C and
D can also be pre-scaled, which changes the available time range. The maximum pre-scale value is
0xFFFF.
The delay range (in seconds) achievable with one 16-bit timer is shown in the table below. (Due to
the aforementioned 16-bit constraint, Timers 0 and 1 can only be in mode 1; timers A, B, C and D
can be in any mode.)
CLK
NUMBER OF CYCLES PER INSTRUCTION
12
4
1
48000000
0.00000025 - 0.01638375
8.33333E-08 - 0.00546125
2.08333E-08 - 0.001365313
24000000
0.0000005 - 0.0327675
1.66667E-07 - 0.0109225
4.16667E-08 - 0.002730625
12000000
0.000001
- 0.065535
3.33333E-07 - 0.021845
8.33333E-08 - 0.00546125
6000000
0.000002
- 0.13107
6.66667E-07 - 0.04369
1.66667E-07 - 0.0109225
Table 2.166 Available timer ranges (in seconds)
Yielding
MAX = 0.13107 s
MIN = 2.08333E-08 s
MAX-MIN = 0.131069979 s
123
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The most appropriate unit to accurately represent the delay is the nanosecond. The type has to be
able to contain value 131070000 (MAX-MIN), which requires four bytes, as number 131070000 =
0x07CFF830. Therefore, the delay parameter in an example function should be of uint32_t type.
With the uint32_t type, the timer range becomes:
CLK [Hz]
48000000
Timer range
Timer 0 - 2
84 ns - 16383750 ns
24000000
167 ns - 32767500 ns
42 ns - 4.3 s (179 s if not limited by the
uint32_t type)
12000000
334 ns - 65535000 ns
84 ns - 4.3 s (358 s if not
limited by the uint32_t type)
6000000
667 ns - 131070000 ns
167 ns - 4.3 s (720 s if not
limited by the uint32_t type)
Timer A – D
21 ns - 4294967295 ns (= 4.3 s)
(90 s if not limited by the
uint32_t type)
calculated by inverse of maximally
pre-scaled clock times max number of timer
increments = 1/(48MHz/65536))*65535
Figure 2.10 Timer range for uint32_t timer
2.13.15.2
Watchdog
Software must feed the watchdog within a set period (as determined by the timer_wdg_write bit of
the TIMER_WDG register) to verify proper software execution. If a hardware or software failure
prevents feeding the watchdog within the minimum timeout period, the FT51A reset is forced.
Once the system has undergone the reset, it is possible to check with the wdg_int bit of the
TIMER_CONTROL_2 register whether the reset was caused by a watchdog overflow or normal reset.
The watchdog timer is disabled only by power-on reset and during power-down. Once enabled, it
cannot be disabled. It is enabled by the start_wdg bit of the TIMER_CONTROL_2 register.
Below are example functions that could be incorporated into user’s code.
/**
@brief
@details
@param[in]
@return
Watchdog Enable
A function to start the watchdog.
start_value Watchdog start value (only bits from 0 to 4 used).
void
**/
void watchdog_enable(uint8_t
{
start_value)
// Initialise watchdog timer with the set Start Value.
WRITE_IO_REG(TIMER_WDG,
start_value & 0x1F);
// Watchdog interrupt enable.
WRITE_IO_REG(TIMER_CONTROL_2,
WDG_INT_IEN);
// Enable Timer.
WRITE_IO_REG(TIMER_CONTROL,
TIMER_DEV_EN);
// Clear the watchdog before the start is issued.
WRITE_IO_REG(TIMER_CONTROL_2,
124
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
CLEAR_WDG);
// Start the watchdog.
WRITE_IO_REG(TIMER_CONTROL_2,
MSTART_WDG);
}
/**
@brief
@details
@return
Watchdog Feed
The function feeds the watchdog in order to prevent it from
resetting the system.
void
**/
void watchdog_feed()
{
// Clear the watchdog. **/
WRITE_IO_REG(TIMER_CONTROL_2,
CLEAR_WDG);
}
/**
@enum RESET_REASON
@brief Explains the cause of the most recent reset.
**/
typedef enum
{
// Power supply was removed or interrupted.
NORMAL_RESET,
// Watchdog was not fed in time.
WATCHDOG_RESET
}
RESET_REASON;
/**
@brief
@details
@param[in]
@return
Reset cause.
A function to check what caused the reset:
i.e. whether the system started after a normal reset
or a watchdog reset.
reason Explains most-recent reset.
0 - success, 1 - failure
**/
int reset_cause(RESET_REASON *reason)
{
uint8_t data;
if (reason == NULL)
return 1;
*reason = NORMAL_RESET; // Assume normal reset until found otherwise.
// Check if a watchdog overflow occurred.
READ_IO_REG(TIMER_CONTROL_2,
1,
&data);
// Ensure that only the watchdog interrupt bit gets checked.
data &= WDG_INT;
if (data == WDG_INT)
{
*reason = WATCHDOG_RESET;
}
125
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
return 0;
}
/**
@brief
@details
@return
Main
Main program entry point.
No! Returning from main() is undefined!
**/
int main()
{
RESET_REASON
int
reset_reason = WATCHDOG_RESET;
i;
/**
Once the cause of the reset is known, the behaviour of the app can
be changed accordingly.
**/
reset_cause(&reset_reason);
if (reset_reason != WATCHDOG_RESET)
{
// Write code to do something if watchdog had not caused the reset
watchdog_enable(0x1A); // Enable watchdog
// Feed the watchdog for some time and go to an infinite loop
for(i=0; i<13; i++)
{
watchdog_feed();
}
}
else
{
// Write code to do something in the event watchdog had caused the reset.
}
//This infinite loop will cause the watchdog to time out and reset the system.
while(1);
}
126
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.14 DMA
The DMA relieves the CPU from performing a data/memory transfer. Below is a list of registers
associated with FTDI DMA feature. There are 4 DMA engines available.
I/O
Address
Register Name
Description
0xB0
DMA_CONTROL_1
Enable/reset for DMA 1
0xB1
DMA_ENABLE_1
IO Peripheral DMA enable/reset
register
0xB2
DMA_IRQ_ENA_1
IO Peripheral DMA interrupts enable
register
0xB3
DMA_IRQ_1
IO Peripheral DMA Interrupts
register
0xB4
DMA_SRC_MEM_ADDR_L_1
IO Peripheral DMA source memory
address LSB register
0xB5
DMA_SRC_MEM_ADDR_U_1
IO Peripheral DMA source memory
address MSB register
0xB6
DMA_DEST_MEM_ADDR_L_1
IO Peripheral DMA destination
memory address LSB register
0xB7
DMA_DEST_MEM_ADDR_U_1
IO Peripheral DMA destination
memory address MSB register
0xB8
DMA_IO_ADDR_L_1
IO Peripheral DMA IO Address LSB
Register
0xB9
DMA_IO_ADDR_U_1
IO Peripheral DMA IO Address MSB
Register
0xBA
DMA_TRANS_CNT_L_1
IO Peripheral DMA Transfer Byte
Count LSB Register
0xBB
DMA_TRANS_CNT_U_1
IO Peripheral DMA Transfer Byte
Count MSB Register
0xBC
DMA_CURR_CNT_L_1
IO Peripheral DMA Current Transfer
Byte Count LSB Register
0xBD
DMA_CURR_CNT_U_1
IO Peripheral DMA Current Transfer
Byte Count MSB Register
0xBE
DMA_FIFO_DATA_1
IO Peripheral DMA FIFO DATA
0xBF
DMA_AFULL_TRIGGER_1
IO Peripheral DMA Almost Full
Trigger Value
0xC0
DMA_CONTROL_2
Enable/reset DMA 2
127
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
0xC1
DMA_ENABLE_2
IO Peripheral DMA enable/reset
register
0xC2
DMA_IRQ_ENA_2
IO Peripheral DMA interrupts enable
register
0xC3
DMA_IRQ_2
IO Peripheral DMA Interrupts
register
0xC4
DMA_SRC_MEM_ADDR_L_2
IO Peripheral DMA source memory
address LSB register
0xC5
DMA_SRC_MEM_ADDR_U_2
IO Peripheral DMA source memory
address MSB register
0xC6
DMA_DEST_MEM_ADDR_L_2
IO Peripheral DMA destination
memory address LSB register
0xC7
DMA_DEST_MEM_ADDR_U_2
IO Peripheral DMA destination
memory address MSB register
0xC8
DMA_IO_ADDR_L_2
IO Peripheral DMA IO Address LSB
Register
0xC9
DMA_IO_ADDR_U_2
IO Peripheral DMA IO Address MSB
Register
0xCA
DMA_TRANS_CNT_L_2
IO Peripheral DMA Transfer Byte
Count LSB Register
0xCB
DMA_TRANS_CNT_U_2
IO Peripheral DMA Transfer Byte
Count MSB Register
0xCC
DMA_CURR_CNT_L_2
IO Peripheral DMA Current Transfer
Byte Count LSB Register
0xCD
DMA_CURR_CNT_U_2
IO Peripheral DMA Current Transfer
Byte Count MSB Register
0xCE
DMA_FIFO_DATA_2
IO Peripheral DMA FIFO DATA
0xCF
DMA_AFULL_TRIGGER_2
IO Peripheral DMA Almost Full
Trigger Value
0xD0
DMA_CONTROL_3
Enable/reset DMA 3
0xD1
DMA_ENABLE_3
IO Peripheral DMA enable/reset
register
0xD2
DMA_IRQ_ENA_3
IO Peripheral DMA interrupts enable
register
0xD3
DMA_IRQ_3
IO Peripheral DMA Interrupts
register
0xD4
DMA_SRC_MEM_ADDR_L_3
IO Peripheral DMA source memory
128
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
address LSB register
0xD5
DMA_SRC_MEM_ADDR_U_3
IO Peripheral DMA source memory
address MSB register
0xD6
DMA_DEST_MEM_ADDR_L_3
IO Peripheral DMA destination
memory address LSB register
0xD7
DMA_DEST_MEM_ADDR_U_3
IO Peripheral DMA destination
memory address MSB register
0xD8
DMA_IO_ADDR_L_3
IO Peripheral DMA IO Address LSB
Register
0xD9
DMA_IO_ADDR_U_3
IO Peripheral DMA IO Address MSB
Register
0xDA
DMA_TRANS_CNT_L_3
IO Peripheral DMA Transfer Byte
Count LSB Register
0xDB
DMA_TRANS_CNT_U_3
IO Peripheral DMA Transfer Byte
Count MSB Register
0xDC
DMA_CURR_CNT_L_3
IO Peripheral DMA Current Transfer
Byte Count LSB Register
0xDD
DMA_CURR_CNT_U_3
IO Peripheral DMA Current Transfer
Byte Count MSB Register
0xDE
DMA_FIFO_DATA_3
IO Peripheral DMA FIFO DATA
0xDF
DMA_AFULL_TRIGGER_3
IO Peripheral DMA Almost Full
Trigger Value
0xE0
DMA_CONTROL_4
Enable/reset DMA 4
0xE1
DMA_ENABLE_4
IO Peripheral DMA enable/reset
register
0xE2
DMA_IRQ_ENA_4
IO Peripheral DMA interrupts enable
register
0xE3
DMA_IRQ_4
IO Peripheral DMA Interrupts
register
0xE4
DMA_SRC_MEM_ADDR_L_4
IO Peripheral DMA source memory
address LSB register
0xE5
DMA_SRC_MEM_ADDR_U_4
IO Peripheral DMA source memory
address MSB register
0xE6
DMA_DEST_MEM_ADDR_L_4
IO Peripheral DMA destination
memory address LSB register
0xE7
DMA_DEST_MEM_ADDR_U_4
IO Peripheral DMA destination
memory address MSB register
129
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
0xE8
DMA_IO_ADDR_L_4
IO Peripheral DMA IO Address LSB
Register
0xE9
DMA_IO_ADDR_U_4
IO Peripheral DMA IO Address MSB
Register
0xEA
DMA_TRANS_CNT_L_4
IO Peripheral DMA Transfer Byte
Count LSB Register
0xEB
DMA_TRANS_CNT_U_4
IO Peripheral DMA Transfer Byte
Count MSB Register
0xEC
DMA_CURR_CNT_L_4
IO Peripheral DMA Current Transfer
Byte Count LSB Register
0xED
DMA_CURR_CNT_U_4
IO Peripheral DMA Current Transfer
Byte Count MSB Register
0xEE
DMA_FIFO_DATA_4
IO Peripheral DMA FIFO DATA
0xEF
DMA_AFULL_TRIGGER_4
IO Peripheral DMA Almost Full
Trigger Value
Table 2.167 DMA Register Addresses
2.14.1 DMA_CONTROL_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
dma_control_x_dev_en
R/W
0
Write a 1 to enable DMA engine x
0
dma_control_x_soft_reset
W1T
0
Write a 1 to reset DMA engine x
Table 2.168 DMA Control Register
The DMA Control register provides top-level enable and reset functions for the given DMA engine.
The DMA engine is enabled by setting the dma_control_x_dev_en bit to 1. Clearing this bit will
disable the module.
To reset the module, a 1 is written to the dma_control_x_soft_reset bit. This is cleared when the
reset is performed and will therefore always read as ‘0’.
130
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.14.2 DMA_ENABLE_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..2
Reserved
RFU
0
Reserved
1
dma_stop
R/W
0
IO Peripheral DMA Stop
0
dma_start
W1T
0
IO Peripheral DMA Start
Table 2.169 DMA Enable/Reset Register
2.14.3 DMA_IRQ_ENA_x
Bit
Position
Bit Field Name
Type
Reset
Description
7
Reserved
RFU
0
Reserved
IO Peripheral DMA Set FIFO
Size:
00 == 64,
6..5
dma_fifo_size
R/W
0
01 == 128,
10 == 256,
11 == 512 Bytes
IO Peripheral DMA Mode:
00 == PUSH (push data
from memory to IO),
4..3
R/W
dma_mode
0
01 == PULL (pull data from
IO to memory),
10 == MEM_COPY (copy
data from one memory
location to another memory
location),
11 == FIFO
2
dma_fifo_davail_ien
R/W
0
IO Peripheral DMA FIFO
Data Available IRQ Enable
1
dma_fifo_full_ien
R/W
0
IO Peripheral DMA FIFO Full
IRQ Enable
0
dma_done_ien
W1T
0
IO Peripheral DMA Done
IRQ Enable
Table 2.170 DMA Interrupts Enable Register
131
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.14.4 DMA_IRQ_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..3
Reserved
RFU
0
Reserved
2
dma_fifo_davail_int
R/W
0
IO Peripheral DMA FIFO Data
Available IRQ
1
dma_fifo_full_int
R/W
0
IO Peripheral DMA FIFO Full IRQ
0
dma_done_int
W1T
0
IO Peripheral DMA Done IRQ
indicating an interrupt for DMA in
either Push, Pull or FIFO mode.
Table 2.171 DMA Interrupts Register
2.14.5 DMA_SRC_MEM_ADDR_L_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
dma_src_mem_addr_l
R/W
0
IO Peripheral DMA Source Memory
Address Register [7..0]
Table 2.172 IO Peripheral DMA Source Memory Address LSB Register
2.14.6 DMA_SRC_MEM_ADDR_U_x
Bit
Position
Bit Field Name
Type
Reset
Description
IO Peripheral DMA Source Memory
Address Increment/decrement:
7
dma_src_mem_addr_id
R/W
0
0 == inc mem addr,
1 == dec mem addr
6..0
dma_src_mem_addr_u
R/W
0
IO Peripheral DMA Source Memory
Address Register [14..8]
Table 2.173 IO Peripheral DMA Source Memory Address MSB Register
2.14.7 DMA_DEST_MEM_ADDR_L_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
dma_dest_mem_addr_l
R/W
0
IO Peripheral DMA Destination
Memory Address Register [7..0]
Table 2.174 IO Peripheral DMA Destination Memory Address LSB Register
132
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
2.14.8 DMA_DEST_MEM_ADDR_U_x
Bit
Position
7
Bit Field Name
dma_dest_mem_addr_id
Type
R/W
Reset
0
Description
IO Peripheral DMA Destination
Memory Address
Increment/decrement:
0 == inc mem addr,
1 == dec mem addr
6..0
dma_dest_mem_addr_u
R/W
0
IO Peripheral DMA Destination
Memory Address Register [14..8]
Table 2.175 IO Peripheral DMA Destination Memory Address MSB Register
2.14.9 DMA_IO_ADDR_L_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
dmaio_io_addr_l
R/W
0
IO Peripheral DMA IO Address
Register [7..0]
Table 2.176 IO Peripheral DMA IO Address LSB Register
2.14.10
Bit
Position
DMA_IO_ADDR_U_x
Bit Field Name
Type
Reset
Description
Bits 4 to 7 determine which flow
control signals to use:
0 UART,
1 SPI Master,
2 SPI Slave,
7..4
dma_fctrl
R/W
0
3 Parallel245,
4 DMA_FIFO,
5 unused,
6 unused,
7 unused
3..1
Reserved
RFU
0
Reserved
0
dmaio_io_addr_u
R/W
0
IO Peripheral DMA IO Address
Register [8]
Table 2.177 IO Peripheral DMA IO Address MSB Register
133
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.14.11
Clearance No.: FTDI# 483
DMA_TRANS_CNT_L_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
dma_trans_cnt_l
R/W
0
IO Peripheral DMA Transfer Byte
Count Register [7..0]
Table 2.178 IO Peripheral DMA Transfer Byte Count LSB Register
2.14.12
DMA_TRANS_CNT_U_x
Bit
Position
Bit Field Name
Type
Reset
Description
5..0
dma_trans_cnt_u
R/W
0
IO Peripheral DMA Transfer Byte
Count Register [13..8]
Table 2.179 IO Peripheral DMA Transfer Byte Count MSB Register
2.14.13
DMA_CURR_CNT_L_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
dma_curr_cnt_l
R
0
IO Peripheral DMA Current Transfer
Byte Count Register [7..0]
Table 2.180 IO Peripheral DMA Current Transfer Byte Count LSB Register
2.14.14
DMA_CURR_CNT_U_x
Bit
Position
Bit Field Name
Type
Reset
Description
5..0
dma_curr_cnt_u
R
0
IO Peripheral DMA Current Transfer
Byte Count Register [13..8]
Table 2.181 IO Peripheral DMA Current Transfer Byte Count MSB Register
2.14.15
DMA_FIFO_DATA_x
Bit
Position
Bit Field Name
Type
Reset
Description
7..0
dma_fifo_data
R/W
0
IO Peripheral DMA FIFO DATA
Table 2.182 IO Peripheral DMA FIFO DATA Register
134
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
2.14.16
Clearance No.: FTDI# 483
DMA_AFULL_TRIGGER_x
Bit
Position
Bit Field Name
Type
Reset
Description
5..0
dma_afull_trigger
R/W
0
IO Peripheral DMA Almost Full Trigger
Value
Table 2.183 IO Peripheral DMA Almost Full Trigger Value
2.14.17
Use Cases
DMA can be configured in three modes: Push, Pull and FIFO. The first two perform a one-shot
transfer, while the last one is for continuous reception of data.
Push is used to transfer data from memory to I/O register, while Pull and FIFO are used to transfer
data in the opposite direction. Below is a list of steps necessary to setup DMA engine 1 in the Push
mode.
1. Enable global and ‘External 0’ interrupts via SFR IE register.
IE |= (IE_GLOBAL | IE_EXTERNAL_0);
2. Enable interrupts on the DMA engine.
WRITE_IO_REG(DMA_IRQ_ENA_1, DMA0_IRQ_IEN);
3. Enable individual DMA engine.
WRITE_IO_REG(DMA_CONTROL_1, DMA_CONTROL_0_DEV_EN);
4. Enable interrupts for the Push mode.
WRITE_IO_REG(DMA_IRQ_ENA_1, (DMA_IRQ_DONE_IEN | (0 << MASK_DMA_MODE)));
5. Specify transfer size.
WRITE_IO_REG(DMA_TRANS_CNT_U_1, transfer_size >>8 );
WRITE_IO_REG(DMA_TRANS_CNT_L_1, transfer_size);
6. Define source.
WRITE_IO_REG(DMA_SRC_MEM_ADDR_U_1, source >>8 );
WRITE_IO_REG(DMA_SRC_MEM_ADDR_L_1, source);
7. Define destination along with specifying flow control.
destination |= ((uint16_t)(flow_control) << 8);
WRITE_IO_REG(DMA_IO_ADDR_U_1, destination >> 8);
WRITE_IO_REG(DMA_IO_ADDR_L_1, destination);
8. Start the DMA engine.
WRITE_IO_REG(DMA_ENABLE_1, DMA_START)
The DMA relieves the CPU from performing the transfer. In the case of Push mode, the only time
when the CPU gets interrupted is when the transfer has completed. In the case of Pull/FIFO mode,
the DMA may also interrupt when its buffer has been filled to a specified level, as set by the
DMA_AFULL_TRIGGER_1 register.
Preferably, one would want to react on any received interrupt, for example, by calling some callback function. The implementation of such scenario is presented below.
135
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
// Check what engine interrupted
void INT0_ISR(void) __interrupt (0)
{
uint8_t
events = 0;
READ_IO_REG(TOP_INT0, events);
events &= (DMA0_IRQ | DMA1_IRQ | DMA2_IRQ | DMA3_IRQ);
if (events && DMA0_IRQ != NULL)
{
user_callback();
}
// Clear the event flags
WRITE_IO_REG(TOP_INT0, events);
}
It is important to note that while called back, the function must clear the DMA engine-specific
interrupts that triggered the interrupt: dma_fifo_davail_int, dma_fifo_full_int or dma_done_int.
136
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3 Application Guide
FTDI provide sample code and source code libraries as part of the FT51A Software Development
Kit
to
enable
fast
project
development.
The
FT51A
SDK
Installer
(see
AN_352_FT51A_Installation_Guide) will install the source code for the libraries described in this
section. It will also install sample code which will demonstrate the use of these source code
libraries.
The source code libraries provide functions that can be used to facilitate various features reducing
the amount of additional code being required. They are intended to implement hardware features
only. The algorithms and methods used are recommended and tested by FTDI.
Several of the source code libraries implement a framework that can be used or adapted in an
application.
3.1 Libraries
The source code libraries are provided to show how to implement and manage features of the
FT51A. They can be modified as required.
Source code is normally provided with one or two functions in each file. The filename is the name
of the function prepended with the name of the library. The reason for this is that the SDCC linker
will optimize-out entire files which are not called but will not normally optimize-out unused
functions within files. This reduces code size in an application without requiring manual
examination of calling graphs.
The intention is that only functions (and hence files) that are required for an application are
included in the project.
The USB device library, Interrupts library and DMA library provide frameworks for an application to
use to exploit the features in hardware.
The function descriptions in this section are only brief overviews of the functions. Please also refer
to the library header files which contain Dioxygen compatible comments for each exposed function.
The Doxygen comments contain descriptions, parameters and return values of functions. Hence,
there are no comments describing functions in the source files.
The filename containing the function is noted along with any other files that the function requires.
3.1.1
Configuration Library
This library contains functions or macros to properly initialise the FT51A, query or set the system
clock frequency (6, 12, 24 or 48 MHz) and determine the IC package.
Source Folder: general_configuration
3.1.1.1 device_initialise()
File: ft51_general_config_device_initialise.c
This is used to initialise the registers in the FT51’s 8051 core registers and enable FT51A
peripheral register access.
This should be called once at the very start of an application.
3.1.1.2 get_ic_package()
File: ft51_general_config_get_ic_package.c
This will return an enumerated value indicating the package type and hence pin count of the
device.
137
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3.1.1.3 get_system_clock()
File: ft51_general_config_get_system_clock.c
The function returns an enumerated value allowing the current frequency of the FT51A clock to be
determined.
3.1.1.4 set_system_clock()
File: ft51_general_config_set_system_clock.c
The system clock frequency can be adjusted by changing the SYSTEM_CLOCK_DIVIDER register.
This function abstracts the process using one of the enumerated clock frequency values.
3.1.2
USB Library
The USB library is designed to manage the interface from the FT51A device to the host. The library
invokes call-back functions in the application code when certain events happen, such as the host
issuing a standard request, or resetting the bus.
There are 2 control endpoints, IN and OUT; in default mode there are 2 other pairs of endpoints;
in extended mode there are 6 other pairs of endpoints. The control endpoints are always enabled;
however, other endpoints must be enabled by code when required.
Call-backs are nominated using the USB_initialise() function call. This function will also setup an
interrupt handler for USB interrupts and create the control endpoints that are always required in a
USB device.
The USB_process() function is called during the application’s main loop to perform required USB
operations via the call-back functions. This allows the call-backs to be run by the application and
not at interrupt level.
Non-control endpoints must be created by a call to USB_create_endpoint() before being used. An
endpoint is described in this library by both the endpoint number and its direction. Once created,
an endpoint can be removed with USB_free_endpoint().
The application will use the USB_transfer() function to send information to the host via IN
endpoints. The same function called on an OUT endpoint will receive any data pending from the
host.
There is a memory structure associated with an endpoint and code to process interrupts. Therefore
the number of endpoints to be used can be defined in the application as a build definition. When
building the USB library files add the following macro to the SDCC compiler command line (where
x is the number of endpoints):
–D USB_MAX_ENDPOINT_COUNT=x
Additional parameters checking for endpoint functions can be enabled by setting the following
macro:
–D USB_ENDPOINT_CHECKS=1
This is normally disabled to save code space.
Source Folder: usb
3.1.2.1 USB_initialise
File: ft51_usb_initialise.c
Requires: ft51_usb_remote_wakeup_feature.c, ft51_usb_endpoint.c, ft51_interrupts.c
This is called to initialise the USB library with call-back functions, configure the hub device and set
the initial size for the control endpoints. It will also enable and configure the USB peripheral device
to a state where it can receive and respond to SETUP packets from the host.
The call-back functions passed to this function will allow the USB device to be enumerated by the
host and respond to all required SETUP requests from the host device driver.
138
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The function will initialise memory structures for control IN and OUT endpoints and register an
interrupt handler for peripheral interrupts from the USB device. The hub will be configured as
requested and the USB Full Speed device controller device will be enabled ready to be discovered
by the host.
This should only be called once in the application.
3.1.2.2 USB_req_set_address
File: ft51_usb_address.c
Requires: ft51_usb_transfer.c, ft51_usb_endpoint_features.c
Sets the USB address of the device during enumeration. This is called from the call-back function
which deals with standard requests when a SET_ADDRESS request is received.
3.1.2.3 USB_req_set_configuration
File: ft51_usb_configuration.c
Requires: ft51_usb_transfer.c
The last step of enumeration is the SET_CONFIGURATION request. This is a standard request and
this function is called from the standard request call-back function.
3.1.2.4 USB_req_get_configuration
File: ft51_usb_configuration.c
This function will return the current configuration for the GET_CONFIGURATION request to the
host. This is a standard request and this function is called from the standard request call-back
function.
3.1.2.5 USB_clear_endpoint
File: ft51_usb_endpoint_features.c
This is called by the standard CLEAR_FEATURE request when an endpoint stall clear is required.
When this request is received by the application then it should call this handler to clear the
selected endpoint. The application standard request handler must then return a zero length
acknowledge packet to the host.
This may also be called by an application to manage an endpoint.
3.1.2.6 USB_stall_endpoint
File: ft51_usb_endpoint_features.c
This can be called by the standard SET_FEATURE request when an endpoint stall is required. When
this request is received by the application then it should call this handler to stall the selected
endpoint. The application standard request handler must then return a zero length acknowledge
packet to the host.
This may also be called by an application to manage an endpoint when a stall is required. For
instance when request for an unimplemented SETUP transaction is received.
3.1.2.7 USB_free_endpoint
File: ft51_usb_endpoint.c
This function can be used to disable an endpoint.
3.1.2.8 USB_create_endpoint
File: ft51_usb_endpoint.c
This function can be used to enable an endpoint. It will return a status indicating if the endpoint
was created.
139
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The USB_initialise function will call this function for the control endpoints. It is not necessary to
call this function from elsewhere to create control endpoints.
3.1.2.9 USB_ep_buffer_full
File: ft51_usb_ep_buffer_full.c
OUT endpoints can be polled to see if there is data requiring action. This function is used to check
an OUT endpoint for data received from the host. A non-zero value indicates that there is data
received.
For IN endpoints, the return value indicates that data is waiting to be transmitted to the host at
the next IN request.
3.1.2.10 USB_get_ep_stalled
File: ft51_usb_endpoint_features.c
This will return a non-zero value if the endpoint is stalled.
3.1.2.11 USB_get_state
File: ft51_usb_state.c
This function will return the current state of the USB device. This is defined in Section 9.1 of the
USB Specifications.
3.1.2.12 USB_set_state
File: ft51_usb_state.c
Calling this function will set the current state of the USB device. This is defined in Section 9.1 of
the USB Specifications.
3.1.2.13 USB_transfer
File: ft51_usb_transfer.c
Performs a data transfer from the USB device to or from the USB host. This will use an endpoint
handle to select the endpoint used for the transfer. A zero length packet for a control endpoint
acknowledge can be sent via this function.
3.1.2.14 USB_process
File: ft51_usb_process.c
Requires: ft51_usb_endpoint_features.c, ft51_usb_remote_wakeup_feature.c
When the application is running it should call this function to process events received by the USB
device. Processing will result in the activation of call-back functions if required.
3.1.2.15 USB_isr
File: ft51_usb_isr.c
This is the routine that handles interrupts from the USB Full Speed device controller device on the
FT51A. It will check and clear interrupt status bits and call handler routines accordingly.
When USB_initialise is called, it will register this function as the handler for USB interrupts.
3.1.2.16 USB_finalise
File: ft51_usb_finalise.c
Will release all resources held by the USB device and disable all endpoints.
140
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
3.1.3
Clearance No.: FTDI# 483
DMA Library
The UART, 245 FIFO and SPI interfaces can send/receive data directly to/from RAM without the
intervention of the 8051 core using the DMA controller. It can also send data around RAM without
using a peripheral interface.
This library provides functions to configure these fixed-size transfers and also continuous reads,
where each byte arriving at an interface is copied into a First-In-First-Out buffer in data memory.
After initialisation, one of the 4 DMA engines can be acquired with DMA_acquire(). The function
returns one of the 4 engines. If there are no engines free then it will return an error.
The engine must then be configured with DMA_configure() to be push, pull or FIFO. The configure
function also specifies either a memory or I/O address to use as source or sink locations and the
length of the transfer.
Once configured, the DMA_enable() command will set a DMA engine to run to complete the
transfer. As this does not block until completion the DMA_wait_on_complete() call is used to wait
until the transfer is finished.
When the DMA engine is no longer required then DMA_release() will allow the DMA engine to be
used again.
Source Folder: dma
3.1.3.1 DMA_initialise
File: ft51_dma_initialise.c
Requires: ft51_interrupts.c
Initialise the DMA controller. This must be called before any other DMA operation.
3.1.3.2 DMA_acquire
File: ft51_dma_acquire.c
Request a DMA engine to use. This will call calloc() to allocate memory from the heap.
3.1.3.3 DMA_configure
File: ft51_dma_configure.c
Configure a DMA engine source and destination addresses, transfer length, mode and flow control
method. The source and destination addresses may be registers or memory addresses.
The mode is one of push or pull. FIFO mode is configured with the DMA_configure_fifo() function.
3.1.3.4 DMA_enable
File: ft51_dma_enable.c
Start a DMA engine to run until the transfer is complete. FIFO DMAs will run indefinitely.
3.1.3.5 DMA_disable
File: ft51_dma_disable.c
Stop a DMA engine when a transfer is incomplete.
3.1.3.6 DMA_wait_on_complete
File: ft51_dma_wait_on_complete.c
Wait until a DMA engine has completed its transfer.
3.1.3.7 DMA_configure_fifo
File: ft51_dma_configure_fifo.c
141
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
The FIFO mode is always paired with a pull DMA engine. Flow control can be enabled for certain
peripherals such as the UART to activate and deactivate flow control depending on the amount of
data stored in a FIFO buffer.
3.1.3.8 DMA_purge_fifo
File: ft51_dma_purge_fifo.c
Remove all data in the FIFO buffer. This is currently not implemented.
3.1.3.9 DMA_get_fifo_count
File: ft51_dma_get_fifo_count.c
Get the number of bytes in the FIFO buffer.
3.1.3.10 DMA_get_fifo_data
File: ft51_dma_get_fifo_data.c
Get a number of bytes from the FIFO buffer.
3.1.3.11 DMA_switch_fifo
File: ft51_dma_switch _fifo.c
Change the destination buffer of a FIFO.
3.1.3.12 DMA_is_complete
File: ft51_dma_is_complete.c
Checks whether a DMA is complete.
3.1.3.13 DMA_release
File: ft51_dma_release.c
Requires: ft51_dma_reset.c
There are no more uses for this DMA engine and it can be disabled and released. This function
calls free() to remove allocated memory from the heap.
3.1.3.14 DMA_reset
File: ft51_dma_reset.c
Reset one of the DMA engines.
3.1.4
UART Library
The peripheral UART is capable of sending and receiving data at up to 3 Mbaud. The library
contains functions to claim the UART, configure it (number of data bits, stop bits, baud rate etc.)
and send or receive individual messages.
The default configuration for the UART at power on is 9600 baud, 8 data bits, 1 stop bit, no parity,
and no flow control.
Source Folder: uart
3.1.4.1 UART_initialise
File: ft51_uart_initialise.c
Initialise the UART. This must be called before any other UART operation.
3.1.4.2 UART_set_baud_rate
File: ft51_uart_set_baud_rate.c
142
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Requires: ft51_general_config_get_system_clock.c
This function will calculate the baud rate divisor values for the UART_BAUD_0, UART_BAUD_1 and
UART_BAUD_2, taking into account the speed of the system clock.
It requires that the Configuration library is included for the get_system_clock() function.
The calculation utilises 32 bit arithmetic and will therefore include SDCC system libraries for 32 bit
calculations. These can add a significant amount of code to a program. If space is an issue then
the baud rate divisor can be pre-calculated and programmed directly into the divisor registers
without making the calculation.
3.1.4.3 UART_set_data_bits
File: ft51_uart_set_data_bits.c
Set the number of data bits for the UART to 7 or 8.
3.1.4.4 UART_set_flow_control
File: ft51_uart_set_flow_control.c
Configure the UART to enable or disable flow control. If it is enabled then it can be set to CTS/RTS
or DTR/DSR modes.
3.1.4.5 UART_set_parity
File: ft51_uart_set_parity.c
Enable or disable parity bit generation and checking on the UART.
3.1.4.6 UART_set_stop_bits
File: ft51_uart_set_stop_bits.c
Set the number of stop bits in a UART character to 1 or 2.
3.1.4.7 UART_read
File: ft51_uart_read.c
Read a number of bytes from the UART interface. This will use interrupts to manage the
transaction and will block until the required amount of data has been received.
3.1.4.8 UART_write
File: ft51_uart_write.c
Write a number of bytes from a buffer to the UART interface. This uses interrupts to manage the
transaction. It will block until the data has been transmitted.
3.1.5
SPI Master Library
This library has functions to send and receive messages using the SPI master interface. It
includes variants which are interrupt-driven (per byte) or DMA-driven (per block). Interrupt and
DMA driven options cannot be used at the same time within a project.
To use the SPI Master in interrupt mode, call the function SPIM_initialise_ints() to enable the
hardware interface before configuring it to match the communication method of a SPI Slave with
SPIM_configure_slave(). Then calling SPIM_transceive_ints() is used to exchange data with the
slave device.
To use the SPI Master in DMA mode, call the function SPIM_initialise_DMA() to enable the
hardware interface before configuring it to match the communication method of a SPI Slave with
SPIM_configure_slave(). Then calling SPIM_transceive_DMA() is used to exchange data with the
slave device.
Source Folder: spi_master
143
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3.1.5.1 SPIM_configure_slave
File: ft51_spim_configure_slave.c
This function is used to configure the SPI Master to connect to a slave device with the required
communication properties. The master’s bit order, clock speed, clock mode and slave select idle
and polarity matched to the slave device.
3.1.5.2 SPIM_initialise_ints
File: ft51_spim_transceive_ints.c
This is called first to initialise the SPI Master to use interrupts.
3.1.5.3 SPIM_transceive_ints
File: ft51_spim_transceive_ints.c
A transaction sending data to and receiving data from the SPI Slave will be started. The call will
block until all data is sent (and received). Interrupts are used to wait for completion of the
transfers.
3.1.5.4 SPIM_initialise_DMA
File: ft51_spim_transceive_dma.c
Requires: ft51_dma_initialise.c, ft51_dma_acquire.c, ft51_dma_release.c
This is called first to initialise the SPI Master to use DMA.
It requires that the DMA library is included.
3.1.5.5 SPIM_transceive_DMA
File: ft51_spim_transceive_dma.c
Requires: ft51_dma_configure.c, ft51_dma_enable.c, ft51_dma_wait_on_complete.c
A transaction sending data to and receiving data from the SPI Slave will be started. The call will
block until all data is sent (and received). DMAs are used to wait for completion of the transfers.
It is necessary to include the DMA library.
3.1.6
I2C Master Library
The I2C Master library provides a simple read and write interface to the I 2C Master peripheral.
There is a function to abstract setting the timer period register.
It is possible to use interrupt methods to perform both reads and write. This is not implemented in
this library.
Source Folder: i2c
3.1.6.1 I2C_master_initialise
File: ft51_i2c_master.c
This function will reset and initialise the I2C Master peripheral. By default a value of 0x40 is
programmed into the I2CMTP register resulting in a frequency of 36.9 kHz. A dummy slave address
(0x22) is programmed into the I2CMSA register.
3.1.6.2 I2C_master_set_timer
File: ft51_i2c_master.c
This function will change the setting of the I2CMTP register to change the frequency and the mode
of the I2C Master. High-speed mode can be selected along with the timer counter value.
144
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3.1.6.3 I2C_master_get_status
File: ft51_i2c_master.c
This function returns the value of the I2CMSR register.
3.1.6.4 I2C_master_write
File: ft51_i2c_master.c
This will perform an I2C write to a specified slave address. The first byte sent is designated to be a
command byte and is passed separately from the optional data packet in the function parameters.
3.1.6.5 I2C_master_read
File: ft51_i2c_master.c
This will perform an I2C read from a specified slave address. The first byte sent is designated to be
a command byte and is passed separately from the optional data packet in the function
parameters. The command byte is written before the I2C bus direction is changed to read from the
slave address.
3.1.7
I2C Slave Library
The I2C Slave library provides functions to receive data from and transmit data to an I2C Master.
It is possible to use interrupt methods to perform both reads and write. This is not implemented in
this library.
Source Folder: i2c
3.1.7.1 I2C_slave_initialise
File: ft51_i2c_slave.c
This function will reset and initialise the I2C Slave peripheral. The requested slave address is
passed as a parameter and programmed into the I2CSOA register.
3.1.7.2 I2C_slave_get_status
File: ft51_i2c_ slave.c
This function returns the value of the I2CSSR register.
3.1.7.3 I2C_slave_write
File: ft51_i2c_ slave.c
This will respond to read operations from an I2C Master.
3.1.7.4 I2C_slave_read
File: ft51_i2c_ slave.c
This will perform an I2C read from a specified slave address. The first byte sent is designated to be
a command byte and is passed separately from the optional data packet in the function
parameters. The command byte is written before the I2C bus direction is changed to read from the
slave address.
3.1.8
AIO Library
The analogue library can sample an analogue voltage. It is a simple interface to the ADC
peripheral on the device.
There are 16 analogue pads which can be used for this, AIO_0 to AIO_15. These are at fixed pins
on the device and cannot be routed with the IOMUX Library.
Source Folder: aio
145
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3.1.8.1 AIO_intialise
File: ft51_aio_initialise.c
Set up the AIO Cell Controller.
3.1.8.2 AIO_read
File: ft51_aio_read.c
Perform an ADC operation on one analogue pad and wait for the result.
The ADC function can capture a signal in the range of 0 to 3.3 V and express it as an 8 bit integer
(0 to 255).
3.1.9
IOMUX Library
Each pin on the device can be configured to act as the input or output pins from almost any
peripheral. There are exclusions due to differences between analogue and digital signals.
Source Folder: iomux
3.1.9.1 IOMUX_initialise
File: ft51_iomux_initialise.c
Enable the IOMUX hardware to allow mappings of external pins to signals on internal peripherals.
This must be called before any other IOMUX accesses.
3.1.9.2 IOMUX_INPUT
This is a macro to connect a pad to a signal to receive data for a peripheral.
3.1.9.3 IOMUX_OUTPUT
This is a macro to connect a signal to a pad to transmit data from a peripheral.
3.1.9.4 IOMUX_set_pad_config
File: ft51_iomux_set_pad_config.c
Permits the drive current, trigger levels, slew rates and pull parameters of a pad to be configured.
3.1.9.5 IOMUX_get_pad_config
File: ft51_iomux_get_pad_config.c
Retrieves the settings for the drive current, trigger levels, slew rates and pull parameters of a pad.
3.1.10 Watchdog Library
The watchdog timer library will allow a watchdog timer to be started with a configurable period.
When the watchdog expires it will reset the device. To prevent the watchdog from expiring it needs
regular feeding.
When the device is powered up it is possible to see if the watchdog was the cause of the reset.
Source Folder: watchdog
3.1.10.1 watchdog_enable
File: ft51_watchdog_enable.c
Setup the watchdog timer with a start value of 0 to 31. The start value is used to set a single bit in
a 32 bit timer register. The timer counts down from this value and will reset the device when it
reaches zero.
146
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3.1.10.2 watchdog_feed
File: ft51_watchdog_feed.c
Feed the watchdog and therefore restore the start value to the watchdog timer.
3.1.10.3 reset_cause
File: ft51_watchdog_reset_cause.c
Get the reason for the last reset of the device. This can be a normal reset or a watchdog reset.
3.1.11 DFU Library
The DFU library provides functions for handling the Device Firmware Update class.
described in the following document:
The class is
http://www.usb.org/developers/docs/devclass_docs/DFU_1.1.pdf
It will manage a detach timer for transitioning to the DFU mode from Run Time mode and control
the state machine when updating the firmware via download requests.
The firmware may still be required to reset the device after the firmware is downloaded when a
USB reset is seen on the bus. The device cannot do a bus detach-attach sequence so the
bitWillDetach in the bmAttributes will need to be set to 0 (for no).
It supports downloading of firmware only (bitCanDnload) but does not support manifest checking
(bitManifestationTolerant).
This library is in a single file
Source Folder: dfu
File: ft51_usb_dfu.c
Requires: ft51_usb_transfer.c, ft51_usb_endpoint_features.c
3.1.11.1 dfu_is_runtime
Returns non-zero if the current state of the DFU machine is runtime, i.e. DFU are not active.
3.1.11.2 dfu_class_req_detach
Handler for the DFU_DETACH class request. This will change the state from appIDLE to dfuDETACH
and allow entering DFU mode on a USB reset. Starts a detach timer which will return to normal
runtime mode (appIDLE) if it expires before a USB reset.
3.1.11.3 dfu_timer
Decrements the detach timer. If it expires then return to the appIDLE state.
3.1.11.4 dfu_class_req_download
Handles DFU_DNLOAD requests and programs the MTP memory with data received.
3.1.11.5 dfu_class_req_getstatus
Returns the current DFU state machine enumeration, and increments the state from dfuMANIFESTSYNC to dfuMANIFEST-WAIT-RESET or dfuDNLOAD-SYNC to dfuDNLOAD-IDLE.
Returns current error status if set.
3.1.11.6 dfu_class_req_clrstatus
Clears a dfuERROR state back to dfuIDLE.
3.1.11.7 dfu_class_req_abort
Cancels the current DFU operation and returns back to dfuIDLE.
147
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3.1.11.8 dfu_class_req_getstate
Return the current DFU state machine enumeration.
3.1.11.9 dfu_reset
Resets the DFU state machines for dfuDETACH to appIDLE for a cancelled detach, dfuMANIFESTWAIT-RESET to appIDLE for a successful firmware download. If it is called at dfuDNLOAD-IDLE
then this will flag an error as there is an incomplete firmware download.
3.1.12 LCD Library
The LCD library provides functions and methods for using an ST7036 LCD display and compatibles.
It requires the I2C Master library to provide the communication between the FT51A and the LCD
display.
This library is in a single file
Source Folder: lcd
File: ft51_lcd_st7036.c
Requires: ft51_i2c_master.c
3.1.12.1 lcd_initialise
Send commands to the LCD to setup the display preferences.
It will enable a 2 line display with single height characters; set the bias and contrast; cursor off
and blink off; clear the display and set the entry mode.
3.1.12.2 lcd_clear
Send the clear command to remove text from the display.
3.1.12.3 lcd_home
Move the cursor to the top left of the display.
3.1.12.4 lcd_position
Set the position of the cursor to the desired location on the display.
3.1.12.5 lcd_display
Writes a string to the display from the current cursor position.
3.1.13 TMC Library
The TMC library provides functions for handling the Test and Measurement class. The class is
described in the following document (Test & Measurement Class section):
http://www.usb.org/developers/docs/devclass_docs/
The library will receive two types of packets from the host: a Message Out, which is a command;
or a Request Message In, which is a request to return data to the host. After the latter packet, the
host will do a Message In operation to receive a packet from the TMC device.
Each packet type from the host will execute a callback function. The callback functions are in the
application and handle decoding the command and formatting the response.
The Message In is always immediately preceded by a Request Message In.
This library is in a single file.
Source Folder: tmc
File: ft51_usb_tmc.c
148
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Requires: ft51_usb_transfer.c, ft51_usb_endpoint_features.c
3.1.13.1 tmc_initialise
Initialise the library and setup callback functions.
3.1.13.2 tmc_class_req_capabilities
Returns a response to a USB class request for the TMC capabilities (GET_CAPABILITIES).
3.1.13.3 tmc_class_init_clear
Performs an initiate clear to clear any pending or unprocessed TMC messages or responses
(INITIATE_CLEAR).
3.1.13.4 tmc_class_check_clear
Returns the status of a previously sent INITIATE_CLEAR (CHECK_CLEAR_STATUS).
3.1.13.5 tmc_class_init_abort_bulk_out
Aborts a Bulk OUT transfer. This may be a Message Out or a Request Message In
(INITIATE_ABORT_BULK_OUT).
3.1.13.6 tmc_class_check_abort_bulk_out
Returns the status of a previously sent INITIATE_ABORT_BULK_OUT
(CHECK_ABORT_BULK_OUT_STATUS).
3.1.13.7 tmc_class_init_abort_bulk_in
Aborts a Bulk IN transfer. This may be a Message In transfer (INITIATE_ABORT_BULK_IN).
3.1.13.8 tmc_class_check_abort_bulk_in
Returns the status of a previously sent INITIATE_ABORT_BULK_IN
(CHECK_ABORT_BULK_IN_STATUS).
3.1.13.9 tmc_process
Process Message Out, Request Message In and Message In packets from the host.
Callbacks in the application are used to start processing commands in a Message Out, and to
format responses in a Request Message In.
The formatted response is sent after a Request Message In and must complete before returning.
This should be called periodically to handle the packets sent over the BULK endpoints of the TMC
device.
149
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
3.2 USB Applications
An application which implements a USB device with the FTDI USB Library on the FT51A must
include the following parts of the FT51A libraries:
-
Include the ft51_interrupt.c file from the top-level of the library. This is required to
implement the interrupt handler for the USB device.
Add the general_config_device_initialise.c file from the Configuration Library.
Add the following files from the USB Library:
o usb_address.c
o usb_configuration.c
o usb_endpoint_features.c
o usb_endpoint.c
o usb_initialise.c
o usb_isr.c
o usb_process.c
o usb_state.c
o usb_transfer.c
The application must perform the following operations:
-
Call device_initialise() from the Configuration Library to initialise the FT51A device.
Initialise the device, configuration and string descriptors.
Call USB_initialise() function to start the USB device function
o Provide callback functions for standard SETUP requests from the host.
Call the USB_process() function periodically.
If vendor or class SETUP requests are required by the host driver then additional handlers must be
implemented for these.
The examples in this section are given in such a way that the descriptors defined in section 3.2.2
can be used in the call-back code in section 3.2.2.
3.2.1
Initialising USB Device
The USB Library provides a USB_initialise() function which will setup the USB device for use by an
application. The call-backs are nominated, interrupt handler setup and control endpoints created.
A setup routine for a typical USB device may look like this:
void usb_setup(void)
{
USB_ctx usb_ctx;
memset(&usb_ctx, 0, sizeof(usb_ctx));
usb_ctx.standard_req = standard_req_cb;
usb_ctx.class_req = class_req_cb;
usb_ctx.vendor_req = vendor_req_cb;
usb_ctx.suspend = suspend_cb;
usb_ctx.resume = resume_cb;
usb_ctx.reset = reset_cb;
usb_ctx.lpm = NULL;
//
//
//
//
//
//
required
optional
optional
optional
optional
optional
// Hub disabled
usb_ctx.hub_en.mask.hub_enable = 0;
usb_ctx.hub_en.mask.hub_CompdDev = 1;
usb_ctx.hub_en.mask.hub_RmtWkUpEn = 0;
// Initialise the USB device with a control endpoint size
// of 8 bytes. This must match the size for bMaxPacketSize0
// defined in the device descriptor.
usb_ctx.ep_size = USB_EP_SIZE_8;
150
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
// Perform USB Device initialisation.
USB_initialise(&usb_ctx);
}
The USB_ctx structure passes the required and optional values to the initialization routine. The
only call-back required is the standard_req callback. This handles standard requests.
The ep_size must also be specifically set to match the control endpoint bMaxPacketSize0 in the
device descriptor returned to the host. The default value is 8 bytes that correlate with a value 0 in
the USB_ENDPOINT_SIZE enumeration in ft51_usb.h.
When using the hub functionality, the hub must be configured to use the “compound device”
unless the USB device application can be disabled.
3.2.2
Descriptors
The descriptors for the USB device are used in response to standard requests. There are typedefs
in ft51_usb.h for the common standard descriptors. The typedefs can be used to initialise
descriptors or byte arrays can be used instead.
It is useful to store descriptors in __code space as having them as automatic variables will mean
that they are copied to the __data or __xdata areas. This will use memory resources. Typically the
descriptors will not be changed by an application.
3.2.2.1 Device Descriptors
The device descriptor uses USB_device_descriptor typedef from ft51_usb.h. It provides a structure
that can be initialised with values for the device descriptor.
__code USB_device_descriptor device_descriptor =
{
.bLength = 0x12,
.bDescriptorType = 0x01,
.bcdUSB = USB_BCD_VERSION_2_0,
.bDeviceClass = USB_CLASS_DEVICE,
.bDeviceSubClass = USB_SUBCLASS_DEVICE,
.bDeviceProtocol = USB_PROTOCOL_DEVICE,
.bMaxPacketSize0 = 8,
// MUST match the control endpoint size
.idVendor = USB_VID_FTDI,
// idVendor: 0x0403 (FTDI)
.idProduct = USB_PID_DEVICE,// idProduct: User defined.
.bcdDevice = 0x0101,
.iManufacturer = 0x01,
// Manufacturer String
.iProduct = 0x02,
// Product Stirng
.iSerialNumber = 0x03,
// Serial Number String
.bNumConfigurations = 0x01,
};
The idVendor and idProduct values (the USB VID and PID) must be unique to the application. FTDI
applications for the FT51A use the FTDI VID and an example PID.
FTDI can assign a valid PID on request. FT51A applications assign PIDs in the range 0x0FE0 to
0x0FEF.
Do not use these values in a final product.
3.2.2.2 Configuration Descriptors
The ft51_usb.h file has typedefs for several configuration descriptor types. These can be combined
in a struct to make a memory structure which can be initialised in code.
A sample configuration descriptor for a keyboard would be:
151
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
__code struct config_descriptor
{
USB_configuration_descriptor configuration;
USB_interface_descriptor interface;
USB_hid_descriptor hid;
USB_endpoint_descriptor endpoint;
};
struct config_descriptor config_descriptor =
{
.configuration.bLength = 0x09,
.configuration.bDescriptorType = USB_DESCRIPTOR_TYPE_CONFIGURATION,
.configuration.wTotalLength = sizeof(struct config_descriptor_keyboard),
.configuration.bNumInterfaces = 0x01,
.configuration.bConfigurationValue = 0x01,
.configuration.iConfiguration = 0x00,
.configuration.bmAttributes = USB_CONFIG_BMATTRIBUTES_SELF_POWERED |
USB_CONFIG_BMATTRIBUTES_RESERVED_SET_TO_1,
.configuration.bMaxPower = 0xFA,
// 500mA
// ---- INTERFACE DESCRIPTOR for Keyboard ---.interface.bLength = 0x09,
.interface.bDescriptorType = USB_DESCRIPTOR_TYPE_INTERFACE,
.interface.bInterfaceNumber = 0,
.interface.bAlternateSetting = 0x00,
.interface.bNumEndpoints = 0x01,
.interface.bInterfaceClass = USB_CLASS_HID,
.interface.bInterfaceSubClass = 1,
.interface.bInterfaceProtocol = 1,
.interface.iInterface = 0x05,
// ---- HID DESCRIPTOR for Keyboard ---.hid.bLength = 0x09,
.hid.bDescriptorType = 0x21,
.hid.bcdHID = USB_BCD_VERSION_HID_1_1,
.hid.bCountryCode = USB_HID_LANG_NOT_SUPPORTED,
.hid.bNumDescriptors = 0x01,
.hid.bDescriptorType_0 = USB_DESCRIPTOR_TYPE_REPORT,
.hid.wDescriptorLength_0 = 0x0041,
// ---- ENDPOINT DESCRIPTOR for Keyboard ---.endpoint.bLength = 0x07,
.endpoint.bDescriptorType = USB_DESCRIPTOR_TYPE_ENDPOINT,
.endpoint.bEndpointAddress = 0x81,
.endpoint.bmAttributes = USB_ENDPOINT_DESCRIPTOR_ATTR_INTERRUPT,
.endpoint.wMaxPacketSize = 0x0008,
.endpoint.bInterval = 0x0a, // 10mS
};
3.2.2.3 String Descriptors
The string descriptor is an array of bytes. The first byte of each descriptor is the length of the
descriptor. This makes it possible for the array to be parsed to find a specified string in the array.
The standard_req_get_descriptor() function above will read through this byte array to find the
requested string.
__code uint8_t string_descriptor[] =
{
// String 0 is actually a list of language IDs supported
// by the real strings.
0x04, USB_DESCRIPTOR_TYPE_STRING,
0x09, 0x04, // 0409 = English (US)
// String 1 (Manufacturer): "FTDI"
0x0a, USB_DESCRIPTOR_TYPE_STRING,
152
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
'F', 0x00, 'T', 0x00, 'D', 0x00, 'I', 0x00,
// String 2 (Product): "FT51A"
0x0C, USB_DESCRIPTOR_TYPE_STRING,
'F', 0x00, 'T', 0x00, '5', 0x00, '1', 0x00,
'A', 0x00,
// String 3 (Serial Number): "FT424242"
0x12, USB_DESCRIPTOR_TYPE_STRING,
'F', 0x00, 'T', 0x00, '4', 0x00, '2', 0x00,
'4', 0x00, '2', 0x00, '4', 0x00, '2', 0x00,
// END OF STRINGS
0x00
};
FTDI applications will place the string descriptors in a block of 256 bytes starting at offset 0x80 in
the program code. This is achieved using the following code.
// String descriptors - allow a maximum of 256 bytes for this
#define STRING_DESCRIPTOR_LOCATION 0x80
#define STRING_DESCRIPTOR_ALLOCATION 0x100
__code __at(STRING_DESCRIPTOR_LOCATION)uint8_t
string_descriptor[STRING_DESCRIPTOR_ALLOCATION] = {
The reason for this is to allow tools to edit the string descriptors. The ft51str.exe tool can edit
string descriptors during the process of programming the device allowing unique serial numbers
(or other strings) to be coded into the device.
3.2.3
Standard Requests
The standard request handler must return FT51_OK if the request was handled by the application
or FT51_FAILED if not.
The USB Specification requires that the Set Address, Set Configuration, Get Configuration, Get
Status, Get Descriptor for device and configuration descriptors be implemented. The sample code
in this section illustrates the basic requests required to implement a USB device.
FT51_STATUS standard_req_cb(USB_device_request *req)
{
FT51_STATUS status = FT51_FAILED;
switch (req->bRequest)
{
case USB_REQUEST_CODE_GET_STATUS:
status = standard_req_get_status(req);
break;
case USB_REQUEST_CODE_CLEAR_FEATURE:
case USB_REQUEST_CODE_SET_FEATURE:
status = standard_req_get_set_feature(req);
break;
case USB_REQUEST_CODE_GET_DESCRIPTOR:
status = standard_req_get_descriptor(req);
break;
case USB_REQUEST_CODE_SET_CONFIGURATION:
153
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
status = USB_set_configuration(req);
break;
case USB_REQUEST_CODE_GET_CONFIGURATION:
status = USB_get_configuration();
break;
case USB_REQUEST_CODE_SET_ADDRESS:
status = USB_set_address(req);
break;
default:
case USB_REQUEST_CODE_GET_INTERFACE:
case USB_REQUEST_CODE_SET_INTERFACE:
// Unknown or unsupported request.
status = FT51_FAILED;
break;
}
return status;
}
This call-back is only activated when the USB_process() function is called after a SETUP packet has
been received from the host.
If FT51_FAILED is returned then the USB_process() function will cause a stall on the control
endpoint to signal to the host that the SETUP request failed.
3.2.3.1 Get Status
The minimum requirement for a response to the standard request GET_STATUS is for endpoint and
device statuses.
FT51_STATUS standard_req_get_status(USB_device_request *req)
{
USB_STATE state = USB_get_state();
USB_ENDPOINT_NUMBER ep_number = LSB(req->wIndex) & 0x0F;
USB_ENDPOINT_DIR ep_dir = (LSB(req->wIndex) >> 7);
uint8_t buf[2];
buf[0] = buf[1] = 0;
// Get Status for endpoints only
if (req->bmRequestType == (USB_BMREQUESTTYPE_DIR_DEV_TO_HOST |
USB_BMREQUESTTYPE_RECIPIENT_ENDPOINT))
{
if (((state < CONFIGURED) && (ep_number == 0))
|| (state >= CONFIGURED))
{
if (USB_ep_stalled(ep_number, ep_dir))
{
buf[0] = USB_GET_STATUS_ENDPOINT_HALT;
}
USB_transfer(USB_EP_0, USB_DIR_IN, buf, 2);
return FT51_OK;
}
}
else if (req->bmRequestType == (USB_BMREQUESTTYPE_DIR_DEV_TO_HOST |
USB_BMREQUESTTYPE_RECIPIENT_DEVICE))
{
// This must match the configuration descriptor's bmAttributes
buf[0] = USB_GET_STATUS_DEVICE_SELF_POWERED;
154
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
USB_transfer(USB_EP_0, USB_DIR_IN, buf, 2);
return FT51_OK;
}
return FT51_FAILED;
}
The endpoint status may only return a valid status for endpoint zero when the device is not
configured. When the device is in the configured state then it can return statuses for all endpoints.
3.2.3.2 Set Features
The control endpoints must respond to SET_FEATURE and CLEAR_FEATURE requests. This example
code will provide a response for endpoint stall SET and CLEAR operations.
FT51_STATUS standard_req_get_set_feature(USB_device_request *req)
{
USB_ENDPOINT_NUMBER ep_number = LSB(req->wIndex) & 0x0F;
USB_ENDPOINT_DIR ep_dir = (LSB(req->wIndex) >> 7);
USB_STATE state = USB_get_state();
if (req->bmRequestType == (USB_BMREQUESTTYPE_DIR_DEV_TO_HOST |
USB_BMREQUESTTYPE_RECIPIENT_ENDPOINT))
{
// Only support the endpoint halt feature in this device
if (req->wValue == USB_FEATURE_ENDPOINT_HALT)
{
// Only allow this if the device is configured or the endpoint
// is zero if the device is not configured.
if (((state < CONFIGURED) && (ep_number == 0))
|| (state >= CONFIGURED))
{
// Perform a stall or a clear
if (req->bRequest == USB_REQUEST_CODE_CLEAR_FEATURE)
{
// Feature selector CLEAR
USB_clear_endpoint(ep_number, ep_dir);
}
else
{
// Feature selector SET
USB_stall_endpoint(ep_number, ep_dir);
}
USB_transfer(USB_EP_0, USB_DIR_IN, NULL, 0);
return FT51_OK;
}
}
}
return FT51_FAILED;
}
The endpoint features only apply to endpoint zero when the device is not configured. When the
device is configured then it can apply to all endpoints.
3.2.3.3 Get Descriptors
The Get Descriptor response depends on the type of descriptor requested. Only device and
configuration descriptors are required but string descriptors are commonly used.
155
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
A simple handler for device, configuration and string descriptors would be as follows. It is assumed
that the byte arrays “config_descriptor”, “device_descriptor” and “string_descriptor” are defined.
See sections 3.2.2, 3.2.2.2 and 3.2.2.3.
FT51_STATUS standard_req_get_descriptor(USB_device_request *req)
{
// pointer to descriptor (or part of) to send to host
uint8_t
*src = NULL;
// length of data requested by the host
uint16_t
length = req->wLength;
uint8_t
hValue = req->wValue >> 8;
uint8_t
lValue = req->wValue & 0x00ff;
uint8_t
I, slen;
switch (hValue)
{
case USB_DESCRIPTOR_TYPE_DEVICE:
src = (char *)&device_descriptor;
if (length > sizeof(USB_device_descriptor)) // too many bytes requested
length = sizeof(USB_device_descriptor); // Entire structure.
break;
break;
case USB_DESCRIPTOR_TYPE_CONFIGURATION:
src = (char *)&config_descriptor;
if (length > sizeof(config_descriptor)) // too many bytes requested
length = sizeof(config_descriptor); // Entire structure.
break;
case USB_DESCRIPTOR_TYPE_STRING:
// Find the nth string in the string descriptor table
i = 0;
while ((slen = string_descriptor[i]) > 0) {
// Point to start of string descriptor in __code segment
src = (uint8_t *)&string_descriptor[i];
if (lValue == 0) {
break;
}
i += slen;
lValue--;
}
if (lValue > 0) {
return FT51_FAILED; // String not found
}
// Update the length returned only if it is less than the requested
// size
if (length > slen) {
length = slen;
}
break;
default:
return FT51_FAILED;
}
USB_transfer(USB_EP_0, USB_DIR_IN, src, length);
return FT51_OK;
}
The device and configuration descriptors are defined as byte arrays in the __code segment, the
string descriptor is an array of byte arrays in the __code segment.
156
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
3.2.4
Clearance No.: FTDI# 483
Class and Vendor Requests
Like the standard request handler, class and vendor request handlers must return FT51_OK if the
request was handled by the application or FT51_FAILED if not.
The format of the class and vendor request functions is the same as the standard requests. This
example provides a class handler for a HID keyboard.
uint8_t input_report;
uint8_t report_mode;
FT51_STATUS class_req_cb(USB_device_request *req)
{
FT51_STATUS status = FT51_FAILED;
uint8_t interface = LSB(req->wIndex) & 0x0F;
// Ensure the recipient is an interface...
// Can also check if the interface number is correct
if ((req->bmRequestType & USB_BMREQUESTTYPE_RECIPIENT_MASK) ==
USB_BMREQUESTTYPE_RECIPIENT_INTERFACE)
{
// Handle HID class requests
switch (req->bRequest)
{
case USB_HID_REQUEST_CODE_SET_IDLE:
// Turn on report mode to start sending data to host
report_mode = 1;
USB_transfer(USB_EP_0, USB_DIR_IN, NULL, 0);
status = FT51_OK;
break;
case USB_HID_REQUEST_CODE_SET_PROTOCOL:
USB_transfer(USB_EP_0, USB_DIR_IN, NULL, 0);
status = FT51_OK;
break;
case USB_HID_REQUEST_CODE_SET_REPORT:
// dummy read of one byte
USB_transfer(USB_EP_0, USB_DIR_OUT, &input_report, 1);
// Acknowledge SETUP
USB_transfer(USB_EP_0, USB_DIR_IN, NULL, 0);
status = FT51_OK;
break;
}
}
}
return status;
}
3.2.5
Call-backs
The suspend, resume and reset call-backs are optional.
3.2.5.1 Reset Call-back
The reset call-back is needed when the device is running self-powered. The USB state is part of
the library rather than an internal state in the USB Full Speed device controller and therefore
needs to update when the device is reset.
157
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Endpoint creation is best placed in this function, as the host will reset a USB device during
enumeration. This allows us to disable and then re-enable an endpoint during a reset or when the
device is first powered up.
This is an example of making an interrupt IN endpoint with a maximum packet size of 8.
void reset_cb(uint8_t status)
{
(void) status;
USB_free_endpoint(1, USB_DIR_IN);
USB_set_state(DEFAULT);
/* Make application specific BULK, INTERRUPT or
* ISOCHRONOUS endpoints. */
int_in = USB_create_endpoint(USB_EP_1, USB_EP_INT,
USB_DIR_IN, USB_EP_SIZE_8);
return;
}
3.2.5.2 Suspend Call-back
The suspend call-back is used when either the host puts the device into suspend mode or the
device is self-powered and is disconnected from the host.
Any special programming required to handle suspend states should be placed in here.
3.2.5.3 Resume Call-back
The resume call-back is used when either the host moves the device from suspend to resume
mode or the device is self-powered and is reconnected to the host.
Any special programming required for handling resume states should be placed in here.
3.2.6
Main Function
The main function needs to initialise the device then call USB_process() periodically to handle
SETUP requests.
void main(void)
{
// Initialise FT51
device_initialise();
// Initialise USB function
usb_setup();
// Endless loop.
while (1)
{
// Check control endpoints and handle SETUPs
USB_process();
};
}
Code required to send data or receive data from non-control endpoints is placed within the while
loop.
The only requirement for the main loop is the that USB_process() is called periodically. The
periodicity of the call must ensure that any SETUP packet received is responded to within the time
limits defined for the call in the USB specification or the class or vendor specification applicable.
158
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
3.2.7
Clearance No.: FTDI# 483
Sending and Receiving Data
Data sent and received from control endpoints are handled by the USB_process() function using
call-backs to process standard, class and vendor requests. Bulk, interrupt and isochronous
endpoints use the USB_transfer() function to send data when required.
When receiving data from the USB host, if data is available then the USB_transfer() function will
return a valid status and zero or more bytes of data. This happens asynchronously with the data
only being available to USB_transfer() once the OUT transfer is complete.
To transmit data to the host, the USB_transfer() function will write the data to send into a buffer
and the host will poll the endpoint to receive the data. If there is already data waiting to send to
the host from this endpoint then the USB_transfer() function will wait a small amount of time for
the host and then return from USB_transfer() with a failure.
All endpoints have 2 buffers of 64 bytes, allowing one transaction to be in progress while another
is waiting. This is transparent to the application using the USB device.
3.2.8
Link Power Management
Link Power Management (LPM) feature of USB is an extra USB power state called L1 (Sleep) found
in-between states L0 (On) and L2 (Suspend). The advantage of this, is its shorter transition
latencies. Instead of latencies in excess of 20 ms, it ensures transitions in tens of microseconds,
and leaves it up to the user to decide if to reduce the power or not.
The host or hub initiates entry to L1 by sending LPM extended transaction. It is a sequence of a
setup token packet with a PID = 0000, followed by extended token packet with a PID = 0011 and
with bmAttributes set appropriately. A downstream device transitions to L1 as soon as the host or
hub detects an ACK handshake. Exiting this state is via remote wakeup, resume signalling, reset or
disconnect.
Refer
to
the
USB
2.0
Link
Power
Management
Addendum
http://www.usb.org/developers/docs/usb20_docs/ for further information.
found
in
The USB Full Speed device controller is capable of acknowledging LPM transaction. Furthermore,
the FT51A sees the link state change as an interrupt in the ISR. Below is an extract of an example
ISR that can be used to detect a LPM state transition, plus a function that can be invoked
whenever a LPM transition occurred. Note that the function must be called from the
USB_process().
uint8_t
LPM_L1 = 0x00;
uint8_t
lpm_status[2] = {42, 42};
uint8_t
first_time = 1;
/**
@brief
\par USB Interrupt Service Routine
@details Called when an interrupt is received from USB. This function
determines the source of the interrupt and sets bits within the
data structures accordingly. For reset and suspend it will call
the appropriate callback functions if specified.
@note
Please refer to section 6.3.1 of the FT122 Data Sheet for more
information.
**/
void USB_ISR(const uint8_t flags)
{
uint8_t int_reg[4];
(void)flags; // Suppress warning about unused parameter.
FT122_CMD = RD_INTERRUPT_REG;
int_reg[0] = FT122_DATA;
int_reg[1] = FT122_DATA;
if (int_reg[1] & LPM_CHANGE_INT)
{
159
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
LPM_L1 = 1; // Set this bit to indicate LPM-triggered transition from L0 (Active) to
L1 (Sleep).
if (first_time)
{
first_time = 0;
FT122_CMD = READ_LPM_STATUS;
lpm_status[0] = FT122_DATA;
lpm_status[1] = FT122_DATA;
}
}
}
void process_setup_packet(void) // called from USB_process()
{
USB_request_callback cb = NULL;
uint8_t
data;
uint8_t
i;
FT51_STATUS
status = FT51_FAILED;
debug_printf("--- process_setup_packet ---\r\n");
if (LPM_L1 == 1)
{
debug_printf("+++
debug_printf("+++
}
else
{
debug_printf("+++
debug_printf("+++
}
LPM_L1 = 1\r\n");
LPM Status = %02x %02x\r\n", lpm_status[0], lpm_status[1]);
LPM_L1 = %d\r\n", LPM_L1);
LPM Status = %02x %02x\r\n", lpm_status[0], lpm_status[1]);
}
160
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
4 Contact Information
Head Office – Glasgow, UK
Branch Office – Tigard, Oregon, USA
Future Technology Devices International Limited
Unit 1, 2 Seaward Place, Centurion Business Park
Glasgow G41 1HH
United Kingdom
Tel: +44 (0) 141 429 2777
Fax: +44 (0) 141 429 2758
Future Technology Devices International Limited
(USA)
7130 SW Fir Loop
Tigard, OR 97223-8160
USA
Tel: +1 (503) 547 0988
Fax: +1 (503) 547 0987
E-mail (Sales)
E-mail (Support)
E-mail (General Enquiries)
[email protected]
[email protected]
[email protected]
E-Mail (Sales)
E-Mail (Support)
E-Mail (General Enquiries)
[email protected]
[email protected]
[email protected]
Branch Office – Taipei, Taiwan
Branch Office – Shanghai, China
Future Technology Devices International Limited
(Taiwan)
2F, No. 516, Sec. 1, NeiHu Road
Taipei 114
Taiwan , R.O.C.
Tel: +886 (0) 2 8791 3570
Fax: +886 (0) 2 8791 3576
Future Technology Devices International Limited
(China)
Room 1103, No. 666 West Huaihai Road,
Shanghai, 200052
China
Tel: +86 21 62351596
Fax: +86 21 62351595
E-mail (Sales)
E-mail (Support)
E-mail (General Enquiries)
E-mail (Sales)
E-mail (Support)
E-mail (General Enquiries)
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Web Site
http://ftdichip.com
Distributor and Sales Representatives
Please visit the Sales Network page of the FTDI Web site for the contact details of our distributor(s) and sales
representative(s) in your country.
System and equipment manufacturers and designers are responsible to ensure that their systems, and any Future Technology
Devices International Ltd (FTDI) devices incorporated in their systems, meet all applicable safety, regulatory and system-level
performance requirements. All application-related information in this document (including application descriptions, suggested
FTDI devices and other materials) is provided for reference only. While FTDI has taken care to assure it is accurate, this
information is subject to customer confirmation, and FTDI disclaims all liability for system designs and for any applications
assistance provided by FTDI. Use of FTDI devices in life support and/or safety applications is entirely at the user’s risk, and the
user agrees to defend, indemnify and hold harmless FTDI from any and all damages, claims, suits or expense resulting from
such use. This document is subject to change without notice. No freedom to use patents or other intellectual property rights is
implied by the publication of this document. Neither the whole nor any part of the information contained in, or the product
described in this document, may be adapted or reproduced in any material or electronic form without the prior written consent
of the copyright holder. Future Technology Devices International Ltd, Unit 1, 2 Seaward Place, Centurion Business Park,
Glasgow G41 1HH, United Kingdom. Scotland Registered Company Number: SC136640
161
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Appendix A – References
Document References
FTDI FT51A web page: http://www.ftdichip.com/Products/ICs/FT51.html
FT51A Datasheet: http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT51.pdf










AN_344 FT51A DFU Sample
http://www.ftdichip.com/Support/Documents/AppNotes/AN_344_FT51A_DFU_Sample.pdf
AN_345 FT51A Keyboard Sample
http://www.ftdichip.com/Support/Documents/AppNotes/an_345_ft51a_keyboard_sample.
pdf
AN_346 FT51A Mouse Sample
http://www.ftdichip.com/Support/Documents/AppNotes/AN_346_FT51A_Mouse_Sample.p
df
AN_347 FT51A Test and Measurement Sample
http://www.ftdichip.com/Support/Documents/AppNotes/AN_347_FT51A_Test_and_Measur
ement_Sample.pdf
AN_348 FT51A FT800 Sensors Sample
http://www.ftdichip.com/Support/Documents/AppNotes/AN_348_FT51A_FT800_Sensors_S
ample.pdf
AN_349 FT51A FT800 Spaced Invaders Sample
http://www.ftdichip.com/Support/Documents/AppNotes/AN_349_FT51A_FT800_Spaced_In
vaders_Sample.pdf
AN_351 FT51A Compatibility Module
http://www.ftdichip.com/Support/Documents/AppNotes/AN_351_FT51A_Compatibility_Mo
dule.pdf
AN_354 FT51A Standalone Demo Application
http://www.ftdichip.com/Support/Documents/AppNotes/AN_354_FT51A_Standalone_Dem
o_Application.pdf
AN_352 FT51A Installation Guide
http://www.ftdichip.com/Support/Documents/AppNotes/AN_352_FT51A_Installation_Guid
e.pdf
USB Test and Measurement Class specification:
http://www.usb.org/developers/docs/devclass_docs/USBTMC_1_006a.zip
USB Device Firmware Update Class specification:
http://www.usb.org/developers/docs/devclass_docs/DFU_1.1.pdf
SDCC (Small Device C Compiler) reference:
http://sdcc.sourceforge.net/
FTDI FT122 USB full-speed device controller:
http://www.ftdichip.com/Products/ICs/FT122.html
162
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Acronyms and Abbreviations
Terms
Description
USB
Universal Serial Bus
USB-IF
USB Implementers Forum
MTP
Multiple Time Program – non-volatile memory used to store program code
on the FT51A.
SDCC
Small Device C Compiler
GPL
Gnu Public License
EPL
Eclipse Public License
163
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Appendix B – List of Tables & Figures
List of Tables
Table 2.1 FT51A SFR Map .................................................................................................... 9
Table 2.2 FT51A Peripherals ............................................................................................... 10
Table 2.3 Register Bit Type Definitions................................................................................. 11
Table 2.4 Device Control Register Addresses ........................................................................ 12
Table 2.5 Device Control Register ....................................................................................... 13
Table 2.6 System and Clock Divider Register ........................................................................ 14
Table 2.7 USB Control Register ........................................................................................... 16
Table 2.8 Interrupt Status 0 Register................................................................................... 17
Table 2.9 Interrupt Enable 0 Register .................................................................................. 17
Table 2.10 Interrupt Status 1 Register ................................................................................. 18
Table 2.11 Interrupt Enable 1 Register ................................................................................ 19
Table 2.12 Pin Config Register ............................................................................................ 19
Table 2.13 MTP Control Register ......................................................................................... 20
Table 2.14 MTP Address (Lower) Register ............................................................................ 20
Table 2.15 MTP Address (Upper) Register ............................................................................ 21
Table 2.16 MTP Data Register ............................................................................................. 21
Table 2.17 MTP CRC Control Register .................................................................................. 21
Table 2.18 MTP CRC Result (Lower) Register ........................................................................ 21
Table 2.19 MTP CRC Result (Upper) Register ........................................................................ 22
Table 2.20 Pin Package Type Register .................................................................................. 22
Table 2.21 Top Level Security Register ................................................................................ 23
Table 2.22 SPI Master Register Addresses ............................................................................ 26
Table 2.23 SPI Master Control Register ................................................................................ 27
Table 2.24 SPI Master Transmit Register .............................................................................. 27
Table 2.25 SPI Master Receive Register ............................................................................... 27
Table 2.26 SPI Master Interrupt Enable Register ................................................................... 28
Table 2.27 SPI Master Interrupt Status Register ................................................................... 29
Table 2.28 SPI Master Setup Register .................................................................................. 30
Table 2.29 SPI Master Mode Numbers ................................................................................. 30
Table 2.30 SPI Master Clock Divisor Register ........................................................................ 31
Table 2.31 SPI Master Data Delay Register........................................................................... 31
Table 2.32 SPI Master Slave Select Setup ............................................................................ 32
Table 2.33 SPI Master Transfer Size (Lower) Register ............................................................ 32
Table 2.34 SPI Master Transfer Size (Upper) Register ............................................................ 32
Table 2.35 SPI Master Transfer Pending Register .................................................................. 33
164
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Table 2.36 SPI Slave Register Addresses.............................................................................. 36
Table 2.37 SPI Slave Control Register .................................................................................. 37
Table 2.38 SPI Slave Transmit Register ............................................................................... 37
Table 2.39 SPI Slave Receive Register ................................................................................. 38
Table 2.40 SPI Slave Interrupt Enable Register ..................................................................... 38
Table 2.41 SPI Slave Interrupt Status Register .................................................................... 39
Table 2.42 SPI Slave Setup Register.................................................................................... 40
Table 2.43 SPI Slave Mode Numbers ................................................................................... 40
Table 2.44 I2C Master Register Addresses ............................................................................ 41
Table 2.45 I2C Master Slave Address Register ....................................................................... 41
Table 2.46 I2C Master Control Register ................................................................................ 42
Table 2.47 I2C Master Status Register ................................................................................. 43
Table 2.48 I2C Master Data Buffer Register .......................................................................... 43
Table 2.49 I2C Master Timer Period Register ......................................................................... 44
Table 2.50 I2C Slave Register Addresses .............................................................................. 47
Table 2.51 I2C Slave Address Register ................................................................................. 47
Table 2.52 I2C Slave Control Register .................................................................................. 48
Table 2.53 I2C Slave Status Register ................................................................................... 49
Table 2.54 I2C Slave Data Buffer Register ............................................................................ 49
Table 2.55 UART Register Addresses ................................................................................... 51
Table 2.56 UART Control Register ....................................................................................... 52
Table 2.57 UART DMA Control Register ................................................................................ 52
Table 2.58 UART Data Receive Register ............................................................................... 52
Table 2.59 UART Data Transmit Register .............................................................................. 52
Table 2.60 UART Transmit Status Interrupt Enable Register ................................................... 53
Table 2.61 UART Transmit Status Interrupt Register .............................................................. 53
Table 2.62 UART Receive Status Interrupt Enable Register ..................................................... 54
Table 2.63 UART Receive Status Interrupt Register ............................................................... 54
Table 2.64 UART Line Control Register ................................................................................. 55
Table 2.65 UART Baud Rate 0 Register ................................................................................ 56
Table 2.66 UART Baud Rate 1 Register ................................................................................ 56
Table 2.67 UART Baud Rate 2 Register ................................................................................ 56
Table 2.68 UART Flow Control Register ................................................................................ 57
Table 2.69 UART Flow Control Status Register ...................................................................... 58
Table 2.70 GPIO DIO Digital Control Register Addresses ........................................................ 59
Table 2.71 GPIO DIO Digital Control Registers ...................................................................... 60
Table 2.72 GPIO AIO Digital Control Register Addresses ........................................................ 61
Table 2.73 GPIO AIO Digital Control Registers ...................................................................... 62
Table 2.74 IOMUX Register Addresses ................................................................................. 63
165
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Table 2.75 IOMUX Control Register ..................................................................................... 63
Table 2.76 IOMUX Output Pad Select Register ...................................................................... 64
Table 2.77 IOMUX Output Signal Select Register ................................................................... 64
Table 2.78 IOMUX Input Signal Select Register ..................................................................... 64
Table 2.79 IOMUX Input Pad Select Register ........................................................................ 65
Table 2.80 IOMUX Pad Values ............................................................................................. 66
Table 2.81 IOMUX Output Signal Mapping Values .................................................................. 68
Table 2.82 IOMUX Input Signal Mapping Values .................................................................... 69
Table 2.83 Available AIO Ports ............................................................................................ 70
Table 2.84 Analogue IO Register Addresses .......................................................................... 70
Table 2.85 Analogue IO Control Register .............................................................................. 70
Table 2.86 AIO Mode Control Register Addresses .................................................................. 72
Table 2.87 AIO Mode Control Bits........................................................................................ 72
Table 2.88 AIO Mode Control 0 Register ............................................................................... 72
Table 2.89 AIO Mode Control 1 Register............................................................................... 73
Table 2.90 AIO Mode Control 2 Register ............................................................................... 73
Table 2.91 AIO Mode Control 3 Register ............................................................................... 73
Table 2.92 AIO ADC Register Addresses ............................................................................... 76
Table 2.93 AIO ADC Sample Select 0 Register ...................................................................... 76
Table 2.94 AIO ADC Sample Select 1 Register ...................................................................... 76
Table 2.95 AIO ADC Sample Result (Lower) Registers............................................................ 77
Table 2.96 AIO ADC Sample Result (Upper) Registers............................................................ 77
Table 2.97 AIO Interrupt Register Addresses ........................................................................ 77
Table 2.98 AIO Interrupts 0-7 Register ................................................................................ 78
Table 2.99 AIO Interrupts 8-15 Register .............................................................................. 78
Table 2.100 AIO Interrupt Enables 0-7 Register .................................................................... 79
Table 2.101 AIO Interrupt Enables 8-15 Register .................................................................. 79
Table 2.102 AIO Global Mode Register Addresses .................................................................. 80
Table 2.103 AIO Global Mode Select 0-7 Register .................................................................. 81
Table 2.104 AIO Global Mode Select 8-15 Register ................................................................ 81
Table 2.105. Recommended Global Port Selection ................................................................ 82
Table 2.106 AIO Differential Register Addresses.................................................................... 82
Table 2.107 AIO Differential Enable Register ........................................................................ 83
Table 2.108 AIO Settling Times Register Addresses ............................................................... 84
Table 2.109 AIO Cell Sample and Hold Counter Lower Register ............................................... 84
Table 2.110 AIO Cell Sample and Hold Counter Upper Register ............................................... 84
Table 2.111 Clock Divider Register ...................................................................................... 85
Table 2.112 USB Full Speed device controller Register Addresses ............................................ 87
Table 2.113 Endpoint Configuration for EP0 and EP1 ............................................................. 87
166
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Table 2.114 Endpoint Configuration for EP2 .......................................................................... 88
Table 2.115 Example Buffer Configuration ............................................................................ 89
Table 2.116 Endpoint Maximum Packet Size ......................................................................... 90
Table 2.117 Default Command Set ...................................................................................... 92
Table 2.118 Enhanced Command Set .................................................................................. 95
Table 2.119 Address Enable Register ................................................................................... 96
Table 2.120 Endpoint Enable Register .................................................................................. 96
Table 2.121 Configuration Register (Byte 1) ......................................................................... 97
Table 2.122 Clock Division Factor Register (Byte 2) ............................................................... 98
Table 2.123 Endpoint Configuration Register ........................................................................ 98
Table 2.124 Interrupt Register Byte 1 .................................................................................. 99
Table 2.125 Interrupt Register Byte 2 .................................................................................. 99
Table 2.126 Interrupt Register Byte 3 (for Enhanced Mode) ..................................................100
Table 2.127 Interrupt Register Byte 4 (for Enhanced Mode) ..................................................100
Table 2.128 Endpoint Status Register .................................................................................101
Table 2.129 Endpoint Last Transaction Status Register .........................................................101
Table 2.130 Transaction error code ....................................................................................102
Table 2.131 Endpoint Buffer Status Register ........................................................................103
Table 2.132 Endpoint Control Register ................................................................................104
Table 2.133 Frame Number LSB Register ............................................................................105
Table 2.134 Frame Number MSB Register ...........................................................................105
Table 2.135 PWM Register Addresses .................................................................................107
Table 2.136 PWM Control Register .....................................................................................108
Table 2.137 PWM Ctrl 1 Register ........................................................................................109
Table 2.138 PWM Prescaler Register ...................................................................................109
Table 2.139 PWM Counter LSB Register ..............................................................................109
Table 2.140 PWM Counter MSB Register .............................................................................110
Table 2.141 PWM Comparator LSB Register .........................................................................110
Table 2.142 PWM Comparator MSB Register ........................................................................110
Table 2.143 PWM Toggle Enable Register ............................................................................110
Table 2.144 PWM Out Clear Enable Register ........................................................................111
Table 2.145 PWM Control Block Register .............................................................................111
Table 2.146 PWM Initialisation Register ..............................................................................111
Table 2.147 Programming 8 FT51A comparators to generate above waveform .........................112
Table 2.148 Programming 2 FT51A comparators for 50 % duty cycle ......................................112
Table 2.149. PWM Ranges .................................................................................................113
Table 2.150 Timer Register Addresses ................................................................................116
Table 2.151 Timer Control Register ....................................................................................116
Table 2.152 Timer Control 1 Register .................................................................................117
167
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Table 2.153 Timer Control 2 Register .................................................................................117
Table 2.154 Timer Control 3 Register .................................................................................117
Table 2.155 Timer Control 3 Register .................................................................................118
Table 2.156 Timer Control 3 Register .................................................................................118
Table 2.157 Timer Control 3 Register .................................................................................119
Table 2.158 Timer Watchdog Register ................................................................................119
Table 2.159 Timer Write LSB Register.................................................................................119
Table 2.160 Timer Write MSB Register ................................................................................119
Table 2.161 Timer Prescaler MSB Register ..........................................................................119
Table 2.162 Timer Prescaler MSB Register ..........................................................................120
Table 2.163 Timer Read MSB Register ................................................................................120
Table 2.164 Timer Read MSB Register ................................................................................120
Table 2.165 Timers Normal Operation ................................................................................121
Table 2.166 Available timer ranges (in seconds) ..................................................................123
Table 2.167 DMA Register Addresses ..................................................................................130
Table 2.168 DMA Control Register ......................................................................................130
Table 2.169 DMA Enable/Reset Register..............................................................................131
Table 2.170 DMA Interrupts Enable Register........................................................................131
Table 2.171 DMA Interrupts Register ..................................................................................132
Table 2.172 IO Peripheral DMA Source Memory Address LSB Register ....................................132
Table 2.173 IO Peripheral DMA Source Memory Address MSB Register ....................................132
Table 2.174 IO Peripheral DMA Destination Memory Address LSB Register ..............................132
Table 2.175 IO Peripheral DMA Destination Memory Address MSB Register .............................133
Table 2.176 IO Peripheral DMA IO Address LSB Register .......................................................133
Table 2.177 IO Peripheral DMA IO Address MSB Register ......................................................133
Table 2.178 IO Peripheral DMA Transfer Byte Count LSB Register ..........................................134
Table 2.179 IO Peripheral DMA Transfer Byte Count MSB Register .........................................134
Table 2.180 IO Peripheral DMA Current Transfer Byte Count LSB Register ...............................134
Table 2.181 IO Peripheral DMA Current Transfer Byte Count MSB Register ..............................134
Table 2.182 IO Peripheral DMA FIFO DATA Register .............................................................134
Table 2.183 IO Peripheral DMA Almost Full Trigger Value ......................................................135
List of Figures
Figure 2.1 SPI Master Schematic Diagram ............................................................................ 25
Figure 2.2 SPI Slave Schematic Diagram.............................................................................. 36
Figure 2.3 I2C Master Schematic Diagram ............................................................................ 41
Figure 2.4 I2C Slave Schematic Diagram .............................................................................. 47
Figure 2.5 UART Baud Rate Example Calculations.................................................................. 57
Figure 2.6 Pad Distribution ................................................................................................. 71
168
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Figure 2.7 Square wave with 50 % duty cycle......................................................................107
Figure 2.8 Square wave with 20 % duty cycle......................................................................108
Figure 2.9 Pulse Waveform generated by 8 comparators .......................................................111
Figure 2.10 Timer range for uint32_t timer .........................................................................124
169
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited
Application Note
AN_289 FT51A Programming Guide
Version 1.0
Document Reference No.: FT_000962
Clearance No.: FTDI# 483
Appendix C – Revision History
Document Title:
AN_289 FT51A Programming Guide
Document Reference No.:
FT_000962
Clearance No.:
FTDI# 483
Product Page:
http://www.ftdichip.com/FTProducts.htm
Document Feedback:
Send Feedback
Revision
Changes
Date
1.0
Initial Release
2015-12-21
170
Product Page
Document Feedback
Copyright © 2015 Future Technology Devices International Limited