Figure 7-9 and Table 7-2 define the format of the SPI command transmission. Each SPI
command contains multiple 16-bit words. The different types of words are:
- Command word: The
command word always includes an identifier of the command type. Dependent on
the type, the command word also includes:
- Start address to be
written or read. When field address = 0 means address 0x00.
- Length of the data
that is transmitted or expected to be read. When the length field
starts with opt, the data is optional. Therefore, opt_data_length =
0 means 0 data words. For fields that do not start with opt,
data_length = 0 means 1 data word.
- Number of extra END
bytes to append when forwarding data. When field extra_end_bytes = 0
means 0 additional END bytes. A maximum of 127 extra END bytes can
be appended with one SPI command.
- Fixed data (in case
of SOFTRESET_CRC command)
- Data word: Dependent
of the command type this is data that needs to be forwarded (0 to N),
register data that is written to (0 to N) or read from (N+1 to M) the
device, or data read from (N+1 to M) the RXFIFO.
- CRC word: There are 2
different CRC words in each command:
- CRC word that is
generated by the SPI controller. This CRC is calculated over the SPI
command word and all transmitted data words (0 to N)
- CRC word that is
generated by the SPI peripheral. This CRC is calculated over all the
returned data words (N+1 to M).
Two different CRC algorithms are supported. The default algorithm is
CCITT-FALSE. This can be changed to the CRC-16/XMODEM algorithm using the
REG_WR command. After changing the CRC algorithm, the next SPI command uses
the new algorithm. Both algorithms are based on the polynomial
X16 + X12 + X5 + 1.
Table 7-2 SPI Command Detail
Command Type |
Command Word |
Data words |
CRC word |
CMD[15:12] |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
FWD_WR_CRC |
0x2 |
0x0 |
data_length[8:0] |
data
word 0-data_length |
CRC |
FWD_WR |
0x3 |
data_length[11:0] |
data
word 0-data_length |
CRC |
FWD_WR_END_CRC |
0x4 |
opt_data_length[4:0] |
extra_end_bytes[6:0] |
data
word 0-(opt_data_length-1) |
CRC |
FWD_WR_END |
0x5 |
opt_data_length[4:0] |
extra_end_bytes[6:0] |
data
word 0-(opt_data_length-1) |
CRC |
FWD_RD_END_CRC |
0x6 |
data_length[4:0] |
extra_end_bytes[6:0] |
data
word 0-data_length |
CRC |
FWD_RD_END |
0x7 |
data_length[4:0] |
extra_end_bytes[6:0] |
data
word 0-data_length |
CRC |
DATA_RD_CRC |
0x8 |
0x0 |
data_length[7:0] |
N/A |
CRC |
DATA_RD |
0x9 |
0x0 |
data_length[7:0] |
N/A |
CRC |
REG_WR_CRC |
0xA |
0x0 |
address[3:0] |
0x0 |
data_length[3:0] |
data
word 0-data_length |
CRC |
REG_WR |
0xB |
0x0 |
address[3:0] |
0x0 |
data_length[3:0] |
data
word 0-data_length |
CRC |
REG_RD_CRC |
0xC |
0x0 |
address[3:0] |
0x0 |
data_length[3:0] |
N/A |
CRC |
REG_RD |
0xD |
0x0 |
address[3:0] |
0x0 |
data_length[3:0] |
N/A |
CRC |
SOFTRESET_CRC |
0xE |
0x1E1 |
N/A |
CRC |