Esp8266-Technical Reference en
Esp8266-Technical Reference en
Esp8266-Technical Reference en
Technical Reference
Version 1.7
Copyright © 2020
About This Guide
This document provides introduction to the interfaces integrated on ESP8266. Functional
overview, parameter configuration, function description, application demos and other
information is included.
The document is structured as below.
SPI Communication User Description of SPI functions, master/slave protocol format and API
Chapter 4
Guide functions.
SPI Overlap & Display Description of SPI functions, hardware connection of SPI overlap
Chapter 5
Application Guide mode, API description and display screen console program demo.
SPI Wi-Fi Passthrough 1- Description of SPI functions, SPI slave protocol format, slave status
Chapter 6
Interrupt Mode and line breakage and API functions.
SPI Wi-Fi Passthrough 2- Description of SPI functions, SPI slave protocol format, data flow
Chapter 7
Interrupt Mode control line and API functions.
HSPI Host Multi-device Description of HSPI functions, hardware connection and API
Chapter 8
API functions.
Chapter 9 I2C User Guide Description of I2C functions, master interface and demo.
Appendix Appendix GPIO registers, SPI registers, UART registers, Timer registers.
Release Notes
Date Version Release notes
2. GPIO .......................................................................................................................................6
3.3.1. Protocol Principle: SDIO Line Breakage and SDIO Status Register ...........................15
3.3.2. Instructions on The Read/Write Buffer and The Registration Linked List ...................16
7.3.2. GPIO2 Master Receives The Slave Send Buffer Status .............................................59
Appendix .................................................................................................................................104
1. Overview
!
1. Overview
1.1. General Purpose Input/Output Interface (GPIO)
ESP8266EX has 17 GPIO pins which can be assigned to various functions by programming
the appropriate registers.
Each GPIO can be configured with internal pull-up or pull-down, or set to high impedance,
and when configured as an input, the data are stored in software registers; the input can
also be set to edge-trigger or level trigger CPU interrupts. In short, the IO pads are bi-
directional, non-inverting and tristate, which includes input and output buffer with tristate
control inputs.
These pins can be multiplexed with other functions such as I2C, I2S, UART, PWM, IR
Remote Control, etc.
📖 Note:
SPI mode can be implemented via software programming. The clock frequency is 80 MHz at maximum.
Both I2C Master and I2C Slave are supported. I2C interface functionality can be realized via
software programming, the clock frequency reaches 100 kHz at a maximum. It should be
noted that I2C clock frequency should be higher than the slowest clock frequency of the
slave device.
Data transfers to/from UART interfaces can be implemented via hardware. The data
transmission speed via UART interfaces reaches 115200 x 40 (4.5 Mbps).
UART0 can be used for communication. It supports fluid control. Since UART1 features
only data transmit signal (Tx), it is usually used for printing log.
📖 Note:
By default, UART0 outputs some printed information when the device is powered on and booting up. The
baud rate of the printed information is relevant to the frequency of the external crystal oscillator. If the
frequency of the crystal oscillator is 40 MHz, then the baud rate for printing is 115200; if the frequency of the
crystal oscillator is 26 MHz, then the baud rate for printing is 74880. If the printed information exerts any
influence on the functionality of the device, it is suggested to block the printing during the power-on period by
changing (U0TXD,U0RXD) to (MTDO,MTCK).
The functionality of PWM interfaces can be implemented via software programming. For
example, in the LED smart light demo, the function of PWM is realized by interruption of the
timer, the minimum resolution reaches as much as 44 ns. PWM frequency range is
adjustable from 1000 μs to 10000 μs, i.e., between 100Hz and 1 kHz. When the PWM
frequency is 1 kHz, the duty ratio will be 1/22727, and over 14 bit resolution will be
achieved at 1 kHz refresh rate.
MTMS 9 IO14 IR Tx
GPIO5 24 IO5 IR Rx
The functionality of Infrared remote control interface can be implemented via software
programming. NEC coding, modulation, and demodulation are used by this interface. The
frequency of modulated carrier signal is 38 kHz, while the duty ratio of the square wave is
1/3. The transmission range is around 1m which is determined by two factors: one is the
maximum value of rated current, the other is internal current-limiting resistance value in the
infrared receiver. The larger the resistance value, the lower the current, so is the power, and
vice versa. The transmission angle is between 15° and 30° which is determined by the
radiation direction of the infrared receiver.
1.9. Sniffer
ESP8266 can enter promiscuous mode (sniffer). ESP8266 can capture complete IEEE
802.11 packets in the air or it can obtain the length of the packets.
2. GPIO
2.1. Functional Overview
The ESP8266 has 16 general IOs. Their pin numbers and names are shown in the table
below:
In the QUAD mode flash, 6 IO interfaces are used for flash communication.
In the DUAL mode flash, 4 IO interfaces are used for flash communication.
📖 Note:
Users may find the following documents helpful:
FUNC_GPIO12=3.
Configurations differ for different pins.
⚠ Notice:
If you want to configure it to be FUNCTION X, write X -1 into the bit in the register. For example, if you want
to configure it to be FUNCTION 3, write 2 into the bit in the register.
📖 Note:
If users need to set the pin to high level, they need to configure the GPIO_OUT_W1T register.
📖 Note:
If users need to set the pin to low level, they need to configure the GPIO_OUT_W1TC register.
📖 Note:
The GPIO input detection function is enabled by default.
Write 1 into the related bit, the related GPIO interrupt status will be cleared.
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
This sentence writes 1 into bits 4-5 of PERIPHS_IO_MUX_MTDI_U register. When bits 4-5
of PERIPHS_IO_MUX_MTDI_U are set to be 1, the MTDI is configured to the GPIO mode.
For details of PERIPHS_IO_MUX_MTDI_U register, refer to Section 2.2, Instruction on
GPIO Register.
2. Configure the MTDI output high level.
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 1);
📖 Note:
To set MTDI output to low level, set the second parameter of this function to be 0.
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);
PIN_PULLUP_EN(PERIPHS_IO_MUX_MTDI_U);
📖 Note:
To disable the MTDI pull up, use the following sentence:
PIN_PULLUP_DIS(PERIPHS_IO_MUX_MTDI_U);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
This sentence writes 1 into bits 4-5 of PERIPHS_IO_MUX_MTDI_U register. When bits 4-5
of PERIPHS_IO_MUX_MTDI_U are set to be 1, the MTDI is configured to the GPIO mode.
2. Configure the MTDI to the input mode.
GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));
level=GPIO_INPUT_GET(GPIO_ID_PIN(12));
📖 Note:
• If MTDI is at high level, then the return value of GPIO_INPUT_GET is 1, level = 1;
GPIO_PIN_INTR_NEGEDGE = 2,
GPIO_PIN_INTR_ANYEGDE = 3,
GPIO_PIN_INTR_LOLEVEL = 4,
GPIO_PIN_INTR_HILEVEL = 5
} GPIO_INT_TYPE;
This structure is used to configure the GPIO interrupt trigger manner. It is declared in
gpio.h.
1. Configure the MTDI to GPIO mode.
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
This sentence writes 1 into bits 4-5 of PERIPHS_IO_MUX_MTDI_U register. When bits 4-5
of PERIPHS_IO_MUX_MTDI_U are set to be 1, the MTDI is configured to the GPIO mode.
2. Configure the MTDI to the input mode.
GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));
ETS_GPIO_INTR_DISABLE();
ETS_GPIO_INTR_ATTACH(GPIO_INTERRUPT,NULL);
gpio_pin_intr_state_set(GPIO_ID_PIN(12),GPIO_PIN_INTR_NEGEDGE);
This sentence writes 0x02 into bit[9:7] of GPIO_PIN12 register. It sets MTDI to falling edge
triggers interrupt.
📖 Note:
If users want to disable the MTDI interrupt function, write 0x02 into bit[9:7] of GPIO_PIN12 register.
For other interrupt triggering mode configuration, refer to 2.2 Instruction on GPIO Registers.
ETS_GPIO_INTR_ENABLE();
Uint16 gpio_status=0;
gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
If(gpio_status==GPIO_Pin_12)
};
To be specific:
• wr_busy, bit 0: 1, write buffer of the slave is full, and the ESP8266 is processing data
from the host; 0, write buffer is empty, users can write data into the buffer.
• rd_empty, bit 1: 1, read buffer of the slave is empty, no data has been updated; 0,
there is new data in the buffer for the host to read.
• comm_cnt, bit 2-4: count the read/write communication. Each time the ESP8266
SDIO module finishes an effective packet-reading/packet-writing, the count will
increase by 1. Therefore, the host can judge whether a read/write communication has
been effectively responded by the ESP8266.
• intr_no, bit 5-7: the protocol does not use this variable; reserved.
• rx_length, bit 8-23: actual length of the packets prepared in the read buffer.
3.3.2. Instructions on The Read/Write Buffer and The Registration Linked List
DMA will directly send packets received and sent by the ESP8266 SDIO to corresponding
memories. The ESP8266 software will define the linked list registration structure (or array),
and buffer(s). In this example, only one buffer is used, and there is only one element in the
linked list. Write the first address of the buffer into the linked list registration structure, and
write in other information. When you write the first address of the linked list structure into
the corresponding hardware register in the ESP8266, the DMA can automatically process
the SDIO and the buffer.
The linked list registration structure is shown as below:
Word 0 sub_sof
• owner: 1'b0: operator of the current link buffer is SW; operator of the current link
buffer. MAC does not use this bit. 1'b1: operator of the current link buffer is HW.
• eof: flag of the end of the frame (for the end of AMPDU sub-frames, this flag is not
needed). When the MAC sends the frames, it is used to mark the end of the frames.
For links in eof, buffer_length[11:0] must be equal to the length of the remaining part
of the frame. Otherwise, the MAC will report an error. When the MAC receives frames,
it is used to indicate that the reception has been completed, and the value is set by
hardware.
• sub_sof: the flag of the start of the sub-frame. It is used to distinguish different
AMPDU sub-frames. It is only used when the MAC is sending packets.
• length[11:0]: actual size of the buffer.
• size[11:0]: total size of the buffer.
• buf_ptr[31:0]: starting address of the buffer.
• next_link_ptr[31:0]: starting address of the next discripter. When the MAC is receiving
frames, the value is 0, indicating that there is no empty buffer to receive the frames.
6. void tx_buff_write_done(void)
Function: When tx_buffer receives new packets, this function should be called to change
the SDIO status to "non-writable". This function contains related operations of the status
register, and should be called at the beginning of the TX_EOF interrupt service.
7. TRIG_TOHOST_INT()
Function: Macro, pull low the communication interrupt line, inform the host.
8. Other functions
Other functions are used for tests.
Parameters:
src: starting address of the packet to be sent.
count: length of the packet to be sent, (unit: Byte).
func: function number. It is 0 for communication of block_size in the block mode used to
revise the SDIO CMD53, and 1 for all other communications.
addr: starting address of the data to be written in. If you want to process the register, input
the corresponding address, for example, 0x30, interrupt line clearance register, 0x110,
revise block_size (func=0). If you want to process the packets, input a value that equals to
0x1f800 - tx_length, and 0x1f800 - tx_length should equal to count. If count > tx_lengt, the
SPI host will send packets of count length. But data between tx_length + 1 and count will
be discarded by the ESP8266 SDIO module. Therefore, when sending packets, addr is
related to the actual length of the effective data.
4. int sif_spi_read_bytes(u32 addr,u8* dst,u16 count,u8 func)
Function:
The SDIO byte mode reads the API; encapsulate the read function of the CMD53 byte
mode. It can process the register or the packets. According to the SDIO protocol, the
maximum data length is 512 Bytes.
Location:
port_spi.c. Called by SdioRW in egl_thread.c.
Parameters:
dst: starting address of the receiving buffer
count: length of the packet to be received (unit: Byte)
func: function number. It is 0 for communication of block_size in the block mode used to
read the SDIO CMD53, and 1 for all other communications.
addr: starting address of the data to be read. If you want to operate the register, input the
corresponding address. For example, 0x20, the SDIO status register. If you want to operate
the packets, input a value that equals 0x1f800 - tx_length, and 0x1f800 - tx_length
equals count. If count > tx_length, the SPI host will send packets of count length. But
data between tx_length + 1 and count will be discarded by the ESP8266 SDIO
module. Therefore, when sending packets, addr is related to the actual length of the
effective data.
5. int sif_spi_write_blocks(u32 addr, u8 * src, u16 count,u16
block_size)
Function:
Write the SDIO block mode into the API; encapsulate the write-in function of the CMD53
byte mode. It can only transport the packets, According to the SDIO protocol, the
maximum data length is 512 blocks.
Location:
port_spi.c. Called by dioRW in egl_thread.c and sif_io_sync used by the
program downloader in esp_main_sim.c.
Parameters:
src: starting address of the packet to be sent.
count: length of the packet to be sent (unit: block)
block_size: the number of bytes in 1 block. It should be equal to the 16 bit value whose
func=0, and whose addr=0x110-111. In general, when initialising the SDIO, block_size of
the ESP8266 SDIO should be configured. The starting value of DEMO is 512. During the
operation, it is configured to be 1024. block_size should be an integer multiple of 4.
addr: starting address of the data to be written in. Input a value that equals 0x1f800 -
tx_length (the same as the byte mode), and the tx_length should equal to count.
6. int sif_spi_read_blocks(u32 addr, u8 *dst, u16 count,u16
block_size)
Function:
Write the SDIO block mode into the API; encapsulate the write-in function of the CMD53
byte mode. It can only transport the packets, According to the SDIO protocol, the
maximum data length is 512 blocks.
Location:
port_spi.c. Called by dioRW in egl_thread.c and sif_io_sync used by the
program downloader in esp_main_sim.c.
Parameters:
src: starting address of the receiving buffer
count: length of the packet to be received (unit: block)
block_size: the number of bytes in 1 block. It should be equal to the 16 bit value whose
func = 0, and whose addr=0x110-111. In general, when initialising the SDIO,
block_size of the ESP8266 SDIO should be configured. The starting value of DEMO is
512. During the operation, it is configured to be 1024. block_size should be an integer
multiple of 4.
addr: starting address of the data to be read. Input a value that equals 0x1f800 -
tx_length (the same as the byte mode), and the tx_length should equal to count.
7. void EXTI9_5_IRQHandler(void)
Function:
The communication interrupt processing function offers enable signal for
egl_arch_sem_wait (& BusIrqReadSem,1000) in thread function SdioRW, so that
SdioRW thread can exit the wait state, and read the SDIO status register.
Location:
spi_cfg.c
• Read/write data: optional; length: 0 ~ 512 bits (64 Bytes); master output and slave
input (MOSI) or master input and slave output (MISO).
• Read/write data: optional; length: 0 ~ 512 bits (64 Bytes); master output and slave
input (MOSI) or master input and slave output (MISO).
⚠ Notice:
Other vales are used to read and write the status register of slave SPI, SPI_FLASH_STATUS. Please do not
use it because the difference between communication format and data caching reading/writing might lead to
slave read/write error.
Parameter Description
Parameter Description
Parameter Description
Parameter Description
Parameter Description
!
Figure 4-1. The waveform of spi_byte_write_espslave written into slave ESP8266
📖 Note:
Yellow line: CS, blue line: CLK, red line: MOSI, green line: MISO.
For other full duplex slave devices, 16 bits slave communication should be set. The
effective data should be put to the second byte of slave sending caching which will be
received by master ESP8266.
Parameter Description
!
Figure 4-2. The slave waveform of spi_byte_read_espslave read from ESP8266
📖 Note:
Yellow line: CS, blue line: CLK, red line: MOSI, green line: MISO.
Parameter Description
2. spi_slave_isr_handler(void *para)
Function and trigger condition:
SPI interrupt processing function. Interruption will be triggered if the master operates the
correct transmission operation(read/write slave).
Code:
//0x3ff00020 is isr flag register, bit4 is for spi isr,
if(READ_PERI_REG(0x3ff00020)&BIT4){
WRITE_PERI_REG(SPI_FLASH_SLAVE(HSPI),regvalue);
//when master command is write slave 0x04,
//recieved data will be occur in register SPI_FLASH_C0's low 8
bit,
//also if master command is read slave 0x06,
Code description: As SPI store the FLASH chip by the read/write program, HSPI is used for
communication. For ESP8266 processor, there are multiple devices that share the
interruption function, including SPI module, HSPI module, I2S module, the 4’s, 7’s and 9’s
0x3ff00020 in the register.
If HSPI is triggered, software that resets the 5 interruption source is needed, in order to
avoid the repeated interruption function. The corresponding codes are as follows:
regvalue=READ_PERI_REG(SPI_FLASH_SLAVE(HSPI));
regvalue&=~(0x1f);
WRITE_PERI_REG(SPI_FLASH_SLAVE(HSPI),regvalue);
Data receiving and transmitting data share one register, SPI_FLASH_C0. The
corresponding codes of readout register are as follows:
recv_data=(uint8)READ_PERI_REG(SPI_FLASH_C0(HSPI));
⚠ Notice:
Interruption program is unfit for time-consuming processing code because long-time interruption program will
cause watchdog timer unable to realize normal reset and will also lead to unexpected restart of processor.
Value Description
SpiSubMode
Value Description
Value Description
SpiSpeed
Value Description
SpiBitOrder
Value Description
SpiIntSrc
Value Description
SpiPinCS
Value Description
4.5.1.2. Structure
SpiAttr
SPI parameters configuration
typedef struct
{
SpiData
Data structure of SPI transmission
typedef struct
{
uint16_t cmd; ///< Command value
uint8_t cmdLen; ///< Command byte length
SpiIntInfo
Information structure of SPI interrupt configuration
typedef struct
{
SpiIntSrc src; ///< Interrupt source
void *isrFunc; ///< SPI interrupt callback function.
} SpiIntInfo;
4.5.1.3. Constants
ESP8266 Commands
Parameter Description
Return value
Null
📖 Notes:
• In slave mode, the default CMD length is 8 bits, ADDR length 8 bits, DATA length 32 bytes.
4.5.2.2. SPIMasterCfgAddr
Description
Configure address register.
Function
void SPIMasterCfgAddr(SpiNum spiNum, uint32_t addr);
Parameter Description
Return value
Null
📖 Notes:
• If the address length is over 32 bits, the user needs to configure the SPI_WR_STATUS register.
4.5.2.3. SPIMasterCfgCmd
Description
Configure SPI command register.
Function
Void SPIMasterCfgCmd(SpiNum spiNum, uint32_t cmd);
Parameter Description
Return value
Null
📖 Note:
CMD length is up to 16 bits and the transmission is in low-byte order.
4.5.2.4. SPIMasterSendData
Description
Master sends data according to the pInData buffer.
Function
int SPIMasterSendData(SpiNum spiNum, SpiData* pInData);
Parameter Description
Return value
• 0: Success
• Others: Failure
📖 Note:
DATA transmission is in low-byte order.
4.5.2.5. SPIMasterRecvData
Description
Master receives data.
Function
int SPIMasterRecvData(SpiNum spiNum, SpiData* pOutData);
Parameter Description
Return value
• 0: Success
• Others: Failure
4.5.2.6. SPISlaveSendData
Description
Upload data to SPI W8 ~ W15.
Function
int SPISlaveSendData(SpiNum spiNum, uint32_t *pInData, uint8_t
inLen);
Parameter Description
Return value
• 0: Success
• Others: Failure
📖 Notes:
• This function is only used to upload the data to SPI W8 ~ W15. Upon receiving
MASTER_READ_DATA_FROM_SLAVE_CMD, ESP8266 will automatically transmit data.
4.5.2.7. SPISlaveRecvData
Description
Slave receives data.
Function
int SPISlaveRecvData(SpiNum spiNum);
Parameter Description
Return value
• 0: Success
• Others: Failure
4.5.2.8. SPIMasterSendStatus
Description
Master writes data to slave’s status register.
Function
void SPIMasterSendStatus(SpiNum spiNum, uint8_t data);
Parameter Description
Return value
Null
4.5.2.9. SPIMasterRecvStatus
Description
Master reads data from slave’s status register.
Function
int SPIMasterRecvStatus(SpiNum spiNum);
Parameter Description
Return value
• 0: Success
• Others: Failure
📖 Note:
The status register value of the slave is stored in SPI buffer W0.
4.5.2.10.SPICsPinSelect
Description
Select CS pin.
Function
void SPICsPinSelect(SpiNum spiNum, SpiPinCS pinCs);
Parameter Description
Return value
Null
📖 Note:
CS Pin can only be changed after transmission ends.
4.5.2.11.SPIIntCfg
Description
Set interrupt source and terminal callback function.
Function
void SPIIntCfg(SpiNum spiNum, SpiIntInfo *pIntInfo)
Parameter Description
pIntInfo [in] a pointer to SpiIntInfo with interrupt source and interrupt callback function.
Return value
Null
4.5.2.12.SPIIntEnable
Description
Set the available interrupt source.
Function
void SPIIntEnable(SpiNum spiNum, SpiIntSrc intSrc);
Parameter Description
Return value
Null
4.5.2.13.SPIIntDisable
Description
Set disable interrupt source.
Function
void SPIIntDisable(SpiNum spiNum, SpiIntSrc intSrc);
Parameter Description
Return value
Null
4.5.2.14.SPIIntClear
Description
Clear all interrupt sources.
Function
void SPIIntClear(SpiNum spiNum);
Parameter Description
Return value
Null
Spi_test demo is based on the SPI communication between two ESP8266. The
communication test followed the steps below.
1. Master sends 32-byte data to slave.
2. Master receive data from slave.
3. Master read data from the status register of the slave.
4. Master writes data to the status register of the slave.
The slave will receive interrupts in order from SPI_SLV_WR_BUF_DONE,
SPI_SLV_RD_BUF_DONE, SPI_SLV_RD_STA_DONE, SPI_SLV_WR_STA_DONE.
MTDI MTDI
MTCK MTCK
MTMS MTMS
MTDO MTDO
!
Figure 4-3. Test Demo Hardware Connection
Figure 4-3 shows the test demo hardware connection. The master and the slave are
connected via HSPI. MTCK pin is SPI. MOSI, MTDI pin is SPI MISO, MTMS pin is SPI Clock
and MTMO pin is SPI CS pin.
4.5.3.2. Program Introduction
spi_master_test
Master uses SPI buffer starting from W0.
void ICACHE_FLASH_ATTR spi_master_test()
{
SpiAttr hSpiAttr;
hSpiAttr.bitOrder = SpiBitOrder_MSBFirst;
hSpiAttr.speed = SpiSpeed_10MHz;
hSpiAttr.mode = SpiMode_Master;
hSpiAttr.subMode = SpiSubMode_0;
SPIInit(SpiNum_HSPI, &hSpiAttr);
uint32_t value = 0xD3D4D5D6;
uint32_t sendData[8] ={ 0 };
SpiData spiData;
sendData[0] = 0x55565758;
sendData[1] = 0x595a5b5c;
sendData[2] = 0x5d5e5f60;
sendData[3] = 0x61626364;
sendData[4] = 0x65666768;
sendData[5] = 0x696a6b6c;
sendData[6] = 0x6d6e6f70;
sendData[7] = 0x71727374;
spiData.cmd = MASTER_WRITE_DATA_TO_SLAVE_CMD;
spiData.cmdLen = 1;
spiData.addr = &value;
spiData.addrLen = 4;
spiData.data = sendData;
spiData.dataLen = 32;
SPIMasterSendData(SpiNum_HSPI, &spiData);
spiData.cmdLen = 1;
spiData.addr = &value;
spiData.addrLen = 4;
spiData.data = sendData;
spiData.dataLen = 24;
os_memset(sendData, 0, sizeof(sendData));
SPIMasterRecvData(SpiNum_HSPI, &spiData);
os_printf(" Recv Slave data0[0x%08x]\r\n", sendData[0]);
os_printf(" Recv Slave data1[0x%08x]\r\n", sendData[1]);
os_printf(" Recv Slave data2[0x%08x]\r\n", sendData[2]);
value = SPIMasterRecvStatus(SpiNum_HSPI);
os_printf("\r\n Master read slave(8266) status[0x%02x]\r\n",
value);
// write 0x99 into the slave status register
SPIMasterSendStatus(SpiNum_HSPI, 0x99);
spiData.cmd = MASTER_WRITE_DATA_TO_SLAVE_CMD;
spiData.cmdLen = 0;
spiData.addr = &addr;
spiData.addrLen = 0;
spiData.data = sendData;
spiData.dataLen = 4;
SPIMasterSendData(SpiNum_HSPI, &spiData);
spiData.cmdLen = 0;
spiData.addr = &addr;
spiData.addrLen = 0;
spiData.data = sendData;
spiData.dataLen = 4;
os_memset(sendData, 0, sizeof(sendData));
SPIMasterRecvData(SpiNum_HSPI, &spiData);
os_printf(" Recv Slave data[0x%08x]\r\n", sendData[0]);
#endif
spi_slave_test
The SPI buffer used by the slave starts from W8. The program configures SPI mode first
and initializes GPIO. Then it receives the data from the master and uploads the data to SPI
buffer, waiting for the master to read. Finally, the program will modify the value of the status
register.
void ICACHE_FLASH_ATTR spi_slave_test()
{
// SPI initialization configuration, speed = 0 in slave mode
SpiAttr hSpiAttr;
hSpiAttr.bitOrder = SpiBitOrder_MSBFirst;
hSpiAttr.speed = 0;
hSpiAttr.mode = SpiMode_Slave;
hSpiAttr.subMode = SpiSubMode_0;
spiInt.src = (SpiIntSrc_TransDone
| SpiIntSrc_WrStaDone
|SpiIntSrc_RdStaDone
|SpiIntSrc_WrBufDone
|SpiIntSrc_RdBufDone);
spiInt.isrFunc = spi_slave_isr_sta;
SPIIntCfg(SpiNum_HSPI, &spiInt);
// SHOWSPIREG(SpiNum_HSPI);
SPISlaveRecvData(SpiNum_HSPI);
uint32_t sndData[8] = { 0 };
sndData[0] = 0x35343332;
sndData[1] = 0x39383736;
sndData[2] = 0x3d3c3b3a;
sndData[3] = 0x11103f3e;
sndData[4] = 0x15141312;
sndData[5] = 0x19181716;
sndData[6] = 0x1d1c1b1a;
sndData[7] = 0x21201f1e;
// write 8 word (32 byte) data to SPI buffer W8~W15
spi_slave_isr_sta
// SPI interrupt callback function.
void spi_slave_isr_sta(void *para)
{
uint32 regvalue;
uint32 statusW, statusR, counter;
if (READ_PERI_REG(0x3ff00020)&BIT4) {
//following 3 lines is to clear isr signal
CLEAR_PERI_REG_MASK(SPI_SLAVE(SpiNum_SPI), 0x3ff);
SPIIntClear(SpiNum_HSPI);
SET_PERI_REG_MASK(SPI_SLAVE(SpiNum_HSPI), SPI_SYNC_RESET);
SPIIntClear(SpiNum_HSPI);
SPIIntEnable(SpiNum_HSPI, SpiIntSrc_WrStaDone
| SpiIntSrc_RdStaDone
| SpiIntSrc_WrBufDone
| SpiIntSrc_RdBufDone);
}
if (regvalue & SPI_SLV_RD_STA_DONE) {
statusR = READ_PERI_REG(SPI_RD_STATUS(SpiNum_HSPI));
statusW = READ_PERI_REG(SPI_WR_STATUS(SpiNum_HSPI));
os_printf("spi_slave_isr_sta :
SPI_SLV_RD_STA_DONE[R=0x%08x,W=0x%08x]\n\r", statusR,
statusW);
}
}
if ((regvalue & SPI_TRANS_DONE) && ((regvalue & 0xf) == 0)) {
os_printf("spi_slave_isr_sta : SPI_TRANS_DONE\n\r");
SHOWSPIREG(SpiNum_HSPI);
}
}
!
Figure 4-4. Master Log
In Figure 4-5, the yellow area is the command 0x02 which means the master writes data to
the slave, the red area is the address register 0x00, and the green area is the data written,
with the low byte being transmitted first.
!
Figure 4-5. Waveform Graph 1
In Figure 4-6, the yellow area is the command 0x03 which means the master reads data
from the slave, the red area is the address register 0x00, and the green MISO area is the
data in SPI buffer.
In Figure 4-7, the yellow area is the command 0x04 which means the master reads data
from the slave, the red area is the address register 0x00, and the green MISO area is the
value of the slave's status register.
!
Figure 4-7. Waveform Graph 3
In Figure 4-8, the yellow area is the command 0x01 which means the master writes to the
slave's status register, the purple area is the value written to the slave's status register.
!
Figure 4-8. Waveform Graph 4
ESP8266 Slave
Slave log is as shown in Figure 4-9.
!
Figure 4-9. Slave Log
!
Figure 5-1. SPI Overlap Block Diagram
Please refer to Chapter 4 EPS8266 SPI Communication User Guide for more
information about the application method of Host SPI Module. The configuration method of
Overlap mode is discussed in detail below.
Therefore, users can change the macro definition. For example, the following macro can be
defined if HSPI is used to the operate Flash:
#define SELECT_FLASH() CLEAR_PERI_REG_MASK(SPI_PIN(HSPI),
SPI_CS0_DIS);\
Location:
\app\include\user_lcd.h in the DEMO.
Please refer to Chapter 4 EPS8266 SPI Communication User Guide for more
information about other host SPI communication.
Parameter Description
Font size with 12*6 ASCII character. The parameter is the multiple of pixels
uint8 ft_size under the character.
For example, if ft_size is 2, the actual font size is 24*12. Input non-zero value.
uint8 scr_size_clr_row Rows should be removed after the screen is refreshed.Input non-zero value.
Each line shows the character number.Please note that it should not exceed
uint8 scr_size_x
the pixel range of the screen.
This parameter shows the character lines. Please note that it should not
uint8 scr_size_y
exceed the pixel range of the screen.
Location:
\app\user\user_lcd.c and \app\include\user_lcd.h, call in the function screen_init.
3. void scr_printf(const char* fmt, ...)
Function:
used for standard printing of functions displayed on the screen, similar to the using method
of printf in C programming language.
Parameters:
• const char* fmt—— shows the character string.
• ...—— variable parameters that needs to be displayed in the corresponding string.
Location:
\app\user\user_lcd.c and \app\include\user_lcd.h
4. void at_lcd_print(uint8* str)
Function:
shows the assigned character string displayed on the screen order.
Parameters:
uint8* str—— the starting address of string array.
Location:
\app\include\user_lcd.h
OLED_SCR and TFT_SCR can control the debugging characters displayed on the
corresponding screen. The program supports the same character shown in two screens.
Overlap_TEST is used for SPI Overlap test when TFT is used to display image. TFT should
be set at 0 as it conflicts with the displayed characters.
0x02 is the data sent by the master and received by the slave. The master writes 32 bytes
of data through MOSI into SPI_W7 in corresponding register SPI_W0 of the slave data
buffer.
0x03 is the data received by the master and sent by the slave. 32 bytes of data from
corresponding register of the slave buffer between SPI_FLASH_C8 and SPI_FLASH_C15
are sent to the master through MISO.
0x04 and 0x05 can read the lower 8 bits of SPI_FLASH_STATUS in the slave status
register.
⚠ Notice:
Other values are used to read/write the SPI slave status register SPI_FLASH_STATUS. Their communication
formats are different from those of the read/write buffer, using them will cause read/write errors for the slave.
So users should not use these values.
• address: length, 8 bits; master output slave input (MOSI). The address content must
be 0.
• read/write data: length, 256 bits (32 Bytes). Master output slave input (MOSI) the
0x02 command, or master input slave output (MISO) the 0x03 command.
• slave status: length, 8 bits; master input slave output (MISO), use 0x04 or 0x05 to
read the slave communication status.
⚠ Notice:
When the master completed a read/write communication, if it wants to conduct the next read operation,
rd_empty must be 0, and comm_cnt value must be the previous value +1; if it wants to conduct the next
write operation, wr_busy must be 0, and comm_cnt value must be the previous value +1.
union spi_slave_status
{
uint32 regvalue,calvalue;
uint32 recv_data,send_data;
union spi_slave_status spi_sta;
if(READ_PERI_REG(0x3ff00020)&BIT4){
CLEAR_PERI_REG_MASK(SPI_SLAVE(SPI), 0x3ff);
}else if(READ_PERI_REG(0x3ff00020)&BIT7){ //bit7 is for hspi
isr,
SPI_TRANS_DONE_EN|
SPI_SLV_WR_STA_DONE_EN|
SPI_SLV_RD_STA_DONE_EN|
SPI_SLV_WR_BUF_DONE_EN|
SPI_SLV_RD_BUF_DONE_EN);
SET_PERI_REG_MASK(SPI_SLAVE(HSPI), SPI_SYNC_RESET);
CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
SPI_TRANS_DONE|
SPI_SLV_WR_STA_DONE|
SPI_SLV_RD_STA_DONE|
SPI_SLV_WR_BUF_DONE|
SPI_SLV_RD_BUF_DONE);
SET_PERI_REG_MASK(SPI_SLAVE(HSPI),
SPI_TRANS_DONE_EN|
SPI_SLV_WR_STA_DONE_EN|
SPI_SLV_RD_STA_DONE_EN|
SPI_SLV_WR_BUF_DONE_EN|
SPI_SLV_RD_BUF_DONE_EN);
//
*******************************************************//
/****************master writes interrupt
handler***************/
if(regvalue&SPI_SLV_WR_BUF_DONE){
//*****complete the write operation, wr_busy set to be
1, communication count increases by 1****//
spi_sta.byte_value=READ_PERI_REG(SPI_STATUS(HSPI))&0xff;
spi_sta.elm_value.wr_busy=1;
spi_sta.elm_value.comm_cnt++;
WRITE_PERI_REG(SPI_STATUS(HSPI),
(uint32)spi_sta.byte_value);
//**********************************************//
//*******move the data received by the register
into the memory******//
idx=0;
while(idx<8){
recv_data=READ_PERI_REG(SPI_W0(HSPI)+
(idx<<2));
//os_printf("rcv data : 0x%x
\n\r",recv_data);
spi_data[idx<<2] = recv_data&0xff;
spi_data[(idx<<2)+1] =
(recv_data>>8)&0xff;
spi_data[(idx<<2)+2] =
(recv_data>>16)&0xff;
spi_data[(idx<<2)+3] =
(recv_data>>24)&0xff;
idx++;
}
//***********************************//
spi_sta.byte_value=READ_PERI_REG(SPI_STATUS(HSPI))&0xff;
spi_sta.elm_value.wr_busy=0;
WRITE_PERI_REG(SPI_STATUS(HSPI),
(uint32)spi_sta.byte_value);
//
************************************************//
/***testing part, it can be revised. This part of
the program is used to copy the data read to the read buffer**/
for(idx=0;idx<8;idx++)
{
WRITE_PERI_REG(SPI_W8(HSPI)+(idx<<2),
READ_PERI_REG(SPI_W0(HSPI)+(idx<<2)));
}
/
**************************************************************/
spi_sta.byte_value=READ_PERI_REG(SPI_STATUS(HSPI))&0xff;
spi_sta.elm_value.rd_empty=0;
WRITE_PERI_REG(SPI_STATUS(HSPI),
(uint32)spi_sta.byte_value);
/******************************************/
GPIO_OUTPUT_SET(0, 1); // interrupt line set to be
1, inform the master to read the slave status
spi_sta.byte_value=READ_PERI_REG(SPI_STATUS(HSPI))&0xff;
spi_sta.elm_value.comm_cnt++;
spi_sta.elm_value.rd_empty=1;
WRITE_PERI_REG(SPI_STATUS(HSPI),
(uint32)spi_sta.byte_value);
}
0x02 is the data sent by the master and received by the slave. The host writes 32 Bytes of
data through MOSI into SPI_W0 to SPI_W7 in the corresponding register of the slave data
buffer.
0x03 is the data received by the master and sent by the slave. 32 Bytes of data from
corresponding register of the slave buffer between SPI_W8 and SPI_W15 are sent to the
master through MISO.
⚠ Note:
other values are used to read/write the SPI slave status register SPI_STATUS. Their communication formats
are different from those of the read/write buffer, using them will cause read/write errors for the slave. So users
should not use these values.
• address: length, 8 bits; master output slave input (MOSI). The address content must
be 0.
• read/write data: length, 256 bits (32 Bytes). Master output slave input (MOSI) the
0x02 command, or master input slave output (MISO) the 0x03 command.
void spi_read_func(....)
{
// before starting the read operation, check if there is new
data for the slave to read (rd_rdy is non-0);
// also, check if the previous write operation is completed;
write operationcompleted and processing data (signal GPIO0 is
0), or new data can be written into the slave (wr_rdy is non-0)
if(rd_rdy&&((GPIO0= =0)||wr_rdy)){
rd_rdy=0; //rd_rdy set to be 0
spi_transmit(0x03,0,*read_buff);// start the SPI transmission,
command 3 + address 0 + 32 bytes of data
….
}
}
void spi_write_func(...)
{
// before starting the write operation, check if there is new
data for the slave to receive (rd_rdy is non-0);
// also, check if the previous read operation is completed;
completed, no new data to be read (signal GPIO2 is 0), or new
data to be read (rd_rdy is non-0)
if(wr_rdy&&((GPIO2= =0)||rd_rdy)){
wr_rdy=0; //wr_rdy set to be 0
spi_transmit(0x02,0,*write_buff);// start the SPI transmission,
command 2 + address 0 + 32 bytes of data
...
}
}
CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
SPI_TRANS_DONE_EN|
SPI_SLV_WR_STA_DONE_EN|
SPI_SLV_RD_STA_DONE_EN|
SPI_SLV_WR_BUF_DONE_EN|
SPI_SLV_RD_BUF_DONE_EN);
// resume the SPI slave to communicable status, in order
to prepare for the next communication
SET_PERI_REG_MASK(SPI_SLAVE(HSPI), SPI_SYNC_RESET);
// clear the interrupt flag
CLEAR_PERI_REG_MASK(SPI_SLAVE(HSPI),
SPI_TRANS_DONE|
SPI_SLV_WR_STA_DONE|
SPI_SLV_RD_STA_DONE|
SPI_SLV_WR_BUF_DONE|
SPI_SLV_RD_BUF_DONE);
// turn on the SPI interrupt enable
SET_PERI_REG_MASK(SPI_SLAVE(HSPI),
SPI_TRANS_DONE_EN|
SPI_SLV_WR_STA_DONE_EN|
SPI_SLV_RD_STA_DONE_EN|
SPI_SLV_WR_BUF_DONE_EN|
SPI_SLV_RD_BUF_DONE_EN);
while(idx<8){
recv_data=READ_PERI_REG(SPI_W0(HSPI)+4*idx);
//os_printf("rcv data : 0x%x \n\r",recv_data);
spi_data[4*idx+0] = recv_data&0xff;
spi_data[4*idx+1] = (recv_data>>8)&0xff;
spi_data[4*idx+2] = (recv_data>>16)&0xff;
spi_data[4*idx+3] = (recv_data>>24)&0xff;
idx++;
}
system_os_post(USER_TASK_PRIO_1,MOSI,0);// send the
reception completed message
GPIO_OUTPUT_SET(0, 1); //GPIO0
set to be 1
SET_PERI_REG_MASK(SPI_SLAVE(HSPI),
SPI_SLV_WR_BUF_DONE_EN);
In the above-mentioned ways of connection, SPI bus shares the same external Flash with
HSPI bus. Apart from the memory occupied by programs and related configurations, the
rest Flash memory can all be used for reading and writing of user programs.
⚠ Notice:
• Operation with devices via HSPI host implemented by software programming is not supported in the
API functions.
• When downloading user programs, the clock frequency of SPI bus used for reading Flash data should
be set at 80 MHz. SPI clock frequency should be specified as 80 MHz at SPI OVERLAP and CS1
mode or SPI OVERLAP and CS2 mode.
MTDO CS
MTCK MOSI
HSPI Default IO
MTDI MISO
MTMS CLK
U0TXD CS1
SD_CLK SCLK
SPI OVERLAP and CS1
SD_DATA0 MISO
SD_DATA1 MOSI
GPIO0 CS2
SD_CLK SCLK
SPI OVERLAP and CS2
SD_DATA0 MISO
SD_DATA1 MOSI
📖 Note:
The pins used when HSPI operates with the Flash in OVERLAP mode is completely the same with that of SPI
communication.
Operation with the Flash is defined as SPI_CS0_FLASH. If HSPI operates with two user
devices, the API function is shown as below:
void hspi_master_dev_init(uint8 dev_no,uint8 clk_polar,uint8 clk_div)
This function is used to initialize connection of HSPI host. Altogether four user devices can be
Function operated. If multi devices communicate with the host using SPI communication mode, the
function should be called each time when that certain device is operated.
⚠ Notice:
ONLY when the clock frequency of SPI bus used for reading Flash data is set at 80 MHz. If the device is
defined by SPI_CS1_DEV and SPI_CS2_DEV via SPI OVERLAP, the clock frequency of host SPI is
unadjustable, and should be 80 MHz.
📖 Note:
Data at the highest place will be sent first and that at the lowest place sent last.
9.3. Demo
Please refer to IOT_Demo provided by esp_iot_sdk, for example:
📖 Note:
The clock and data output will stop when 0 is written into the data line.
Tx unit Rx unit
📖 Note:
Both the Tx and Rx unit have a separate FIFO, which has a depth of 128 and a width of 32 bits, and can be
visited by software directly. You can also make an automatic DMA operation to FIFO by the SLC module.
Tx FIFO mode
Bits 13 ~ 15 of I2S_FIFO_CONF are used to control the transport data format for
i2s_tx_fifo_mod.
Value Description
16bits_per_channel full data (dual channel, FIFO data organisation, 16 bits data in the left
0
channel,16 bits data in the right channel, and 16 bits data in the left channel)
Value Description
16bits_per_channel half data (single channel, FIFO data organisation, 16 bits data, 16 bits
1
invalid , 16 bits data)
24bits_per_channel full data discontinue (dual channel, FIFO data organisation, 24 bits data in
2
the left channel, 8 bits invalid, 24 bits data in the right channel, 8 bits empty)
24bits_per_channel half data discontinue (single channel, FIFO data organisation, 24 bits data,
3
8 bits invalid, 24 bits data, 8 bits empty)
24bits_per_channel full data continue (left and right channels, FIFO data organisation, 24 bits
4
data in the left channel, 24 bits data in the right channel)
24bits_per_channel half data continue (single channel, FIFO data organisation, 24 bits data, 24
5
bits data)
6~7 Invalid
RX FIFO mode
Bits 16~18 of I2S_FIFO_CONF is used to control the receive data format for
i2s_rx_fifo_mod.
Value Description
4~7 Invalid
10.2.1.4.Channel Mode
Tx channel mode
Bits 0 ~ 2 in the I2SCONF_CHAN are used for the Tx channel mode (tx_chan_mod).
Value Description
0 Dual-channel
1 Right channel (left and right audio channels are used to put the data of the right channel)
2 Left channel (left and right audio channels are used to put the data of the left channel)
Rx channel mode
Bits 3~4 in the I2SCONF_CHAN are used for the Rx channel mode (rx_chan_mod).
Value Description
0 Dual-channel
1 Right channel
2 Left channel
10.2.1.5.Clock Mode
in the I2SCONF:
• Bits16 ~ 21 are the prescaler of the input clock (I2S_CLKM_DIV_NUM).
• Bits 22 ~ 27 are the frequency divider of the communication clock signal
(I2S_BCK_DIV_NUM).
10.2.1.6.Other Configurations
Register I2SRXEOF_NUM sets the number of data to be received when the Rx FIFO
triggers the SLC transport (unit: 4 bytes).
See the definitions of i2s_reg.h in DEMO. Other instructions will be updated.
Word 0 sub_sof
1’b0 Software operates the buffer of the current link. The MAC shouldn't use this bit.
owner
1’b1 Hardware operates the buffer of the current link.
Flag of frame end(for the end of AMPDU sub-frame,the mark isn't needed).
When the MAC transports the frames, it's used in the end of the frame. For
eof the link in the position of eof,the buffer_length[11:0] should be equal to the
length of the remaining frame; otherwise, the mac will report an error.
When the MAC receives the frames, it's used to indicate that the frame has
been received completely and the value is set by hardware.
The start address of the next descripter. When the MAC is receiving the flame, the
next_link_ptr[31:0]
value is “0”, indicating that there is no empty buffer to receive any flames.
I2S Programs for read and write testing of the module. It is the core function of the DEMO, which can be
Feature
used to test the transporting and receiving communications of the I2S.
Parameter null
void i2s_init
slc_en: Enable the SLC module access. When it's 0, the software will operate the FIFO,For other
Parameter
values for the SLC module directly access FIFO,refer to 2.1.3. Tx/Rx FIFO mode.
void creat_one_link
void creat_one_link (uint8 own, uint8 eof,uint8 sub_sof, uint16 size, uint16 length, uint32* buf_ptr,
Function
uint32* nxt_ptr, struct sdio_queue* i2s_queue)
void slc_init
Basic configuration of the SLC module. For configuration instructions, refer to Section 10.2.3. SLC
Feature
module configuration.
Parameter uint8 trans_dev: SLCModule access device, 1 is I2S,0 is SDIO,other input values are not valid.
Function CONF_RXLINK_ADDR(addr)
Configure the Rx link list address to the register. For configuration instructions, refer to Section 10.2.3.
Feature
SLC module configuration.
CONF_TXLINK_ADDR
Function CONF_TXLINK_ADDR(addr)
Configure the TX link list address to the register. For configuration instructions, refer to Section 10.2.3.
Feature
SLC module configuration.
Function START_RXLINK()
Start the Rx transmission of the SLC module. For configuration instructions, refer to Section 10.2.3. SLC
Feature
module configuration.
Parameter null
START_TXLINK
Function START_TXLINK()
Start the Tx transmission of the SLC module. For configuration instructions, refer to Section 10.2.3. SLC
Feature
module configuration.
Parameter null
!
UART0 will default output some print while booting ,the baud rate of this period print
contents is relate with external crystal frequency.When using the 40M crystal,this section
print baud rate is 115200.When use the 26M crystal,this section print baud rate is 74880.
If this print affect application function, you can abandon print output indirectly while power-
on period in the fourth quarter method.
11.3.5. Inverting
Each input and output UART signals can reverse configuration internal.
#define UART_DTR_INV (BIT(24))
#define UART_RTS_INV (BIT(23))
#define UART_TXD_INV (BIT(22))
#define UART_DSR_INV (BIT(21))
#define UART_CTS_INV (BIT(20))
#define UART_RXD_INV (BIT(19))
Set the corresponding register,you can reverse the corresponding signal line input / output.
Interface: void UART_SetLineInverse
(uint8 uart_no, UART_LineLevelInverse inverse_mask);
Tx fifo length:
(READ_PERI_REG(UART_STATUS(uart_no))>>UART_TXFIFO_CNT_S)
&UART_TXFIFO_CNT;
Interface: TX_FIFO_LEN(uart_no)
Rx fifo length:
(READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)
&UART_RXFIFO_CNT;
Interface: RF_FIFO_LEN(uart_no)
11.3.10.Flow Control
Configuration process:
• Configure pin12, pin13 of UART0 pin as U0CTS and U0RTS functions.
#define FUNC_U0RTS 4
#define FUNC_U0CTS 4
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_U0CTS);
• Hardware flow control in the receive direction can configure thresholds,when the
length of rx fifo is greater than the set threshold,U0RTS feet will be pulled to prevent
the other party sending.
Configured the thresholds of receiving flow control:
The threshold related configurations are generally defined in UART_CONF1 register.
#define UART_RX_FLOW_EN (BIT(23)) The 23rd bit enabled to receive flow control: 0:
disable; 1: enable
#define UART_RX_FLOW_THRHD 0x0000007F //Threshold, occupied 7bit, range 0 ~ 127
#define UART_RX_FLOW_THRHD_S 16 //Register offset is 16 (start from 16th bit)
• Once configure enable of the flow control of sending direction configuration,the
register in UART_CONF0:
11.3.11.Other Interfaces
TX_FIFO_LEN(uart_no) //Macro definition, the current length of the transmit queue
RF_FIFO_LEN(uart_no) //Macro definition, the current length of the receiving queue
11.4.2. Interface
Open interrupt enable: UART_ENABLE_INTR_MASK(uart_no,ena_mask);
Close interrupt enable:
UART_DISABLE_INTR_MASK (uart_no,disable_mask);
Clear interrupt enable:
UART_CLR_INTR_STATUS_MASK(uart_no,clr_mask);
As for special full interrupts,you need first to read all fifo received data empty, then write
the clear interruption status register.Otherwise, the interrupt status bit will be set again after
exit.
Please see details in examples of interrupt handling.
Receive overflow interrupt
Interrupt status bits:UART_RXFIFO_OVF_INT_ST
Definition: When enable receive overflow to interrupt and the length of the receive queue is
greater than the total length of the queue (128 Bytes), it will trigger the interrupt signal.
Trigger scene: Generally, it’s only under the case of unset flow control,because there will not
occur overflow when has flow control.Different from the full interrupt is artificially set the
threshold and the data will not lose,overflow interrupt triggering will usually has data loss.
Can be used for debugging and error checking.
Set enable to interrupt:
In UART_INT_ENA register
#define UART_RXFIFO_OVF_INT_ENA (BIT(4)) //Overflow interrupt enable bit: 1: enable; 0:
disable
Clear interrupt status:
Read queue value to make the queue length less than 128, then set the clear interrupt
status register.
Receive timeout interrupt
Interrupt status bit: UART_RXFIFO_TOUT_INT_ST
Definition:When configure threshold value of tout,enable interrupts and UART begin to
receive data, it will triggered tout interrupt once stop transmission time exceeds the set
threshold.
Applications: more applied in handling serial commands or data, process the data directly,
or post a message, or turn into deposited buffer.
Configure threshold and function enable:
Tout interrupt threshold (or threshold) in UART_CONF1 register.
Tout unit threshold is about 8 data bits uart time (approximately one byte).
#define UART_RX_TOUT_EN (BIT(31)) //Timeout function enable bit: 1: enable;0: disable
#define UART_RX_TOUT_THRHD 0x0000007F //Timeout threshold configuration bits, a
total of seven and range 0 ~ 127
#define UART_RX_TOUT_THRHD_S 24 //Register offset is 24 (start from 24th bit)
Set enable to interrupt:
In UART_INT_ENA register
#define UART_RXFIFO_TOUT_INT_ENA (BIT(8)) tout // Interrupt enable bit:1: enable;0:
disable
Clear interrupt status:
Like full interrupts,tout interrupt also need to firstly read out all received fifo data,then clear
interrupt status register.Otherwise, interrupt status bit will still be set after exiting.
Please see details in examples of interrupt handling.
Definition:
Parity error interrupt (parity_err): received byte exists parity error.
Termination line error interrupt(BRK_DET):receive break signal,or receive error initial
conditions (rx line always stays low)
Receive frame error interrupt (frm_err):stop bit is not 1.
Application:
Generally used for error detection.
To enable interrupt:
In UART_INT_ENA register,
#define UART_PARITY_ERR_INT_ENA (BIT(2)) //Parity error enable interrupt bit, 1:enable;
0:disable
#define UART_BRK_DET_INT_ENA (BIT(7)) //Terminal line error enable interrupt bit
1: enable;0: disable
#define UART_FRM_ERR_INT_ENA (BIT(3)) //Received frame error to enable interrupt bit
1: enable;0: disable
Clear interrupt status:
Clear the interrupt status bit after dealing with corresponding error.
Flow control status interrupt
Interruption status bit:
UART_CTS_CHG_INT_ST
UART_DSR_CHG_INT_ST
Definition:
When the CTS, DSR pin-line level changes, trigger this interrupt.
Application:
Generally use with flow control, when the trigger the interrupt, check the corresponding
flow control line status,if it’s high, stop writing to tx queue.
#define UART_CTS_CHG_INT_ST (BIT(6))
#define UART_DSR_CHG_INT_ST (BIT(5))
Set enable interrupt:
In UART_INT_ENA register,
#define UART_CTS_CHG_INT_ENA (BIT(6)) CTS //Line status enable interrupt bit,
1:enable;0:disable
#define UART_DSR_CHG_INT_ENA (BIT(5)) DSR //Line status enable interrupt bit,
1:enable;0:disable
Clear interrupt status:
After dealing with the corresponding error,clear the interrupt status bit.
U0RTS: pin26(u0txd)
As the transceiver feet of UART0,hardware pin13 and pin12 won’t print out duing
booting,but be attention to ensure pin13 (mtdo) can not be pulled up by external in
ESP8266 is booting.
📖 Note:
FRC1 is a 23-bit hardware timer.
⚠ Notice:
• PWM can not be used when APIs in hw_timer.c are in use, because they all use the same hardware
timer.
• Do not set the system to be Light Sleep mode (Do not call
wifi_set_sleep_type(LIGT_SLEEP);, because that Light Sleep will stop the CPU, it can not
be interrupted by NMI during light sleep.
12.1.2. Implementation
An optimized software algorithm provided by ESP8266 system enable the transmission of
multi-channel PWM signals via GPIO (General Purpose Input Output) interface by way of
mounting NMI on FRC1 timer.
The clock of PWM is provided by high-speed system clock, the frequency speed of which
can reach as high as 80MHz. Through pre-frequency divider, the clock source can be
divided into 16 separated frequencies, the input clock frequency of which is 5MHz. PWM
can issue coarse tuning timing via FRC1, which combined with fine tuning issued by the
high-speed system clock, can improve the resolution to as much as 45 ns.
📖 Note:
The highest priority level of interrupt owned by NMI ensures the precision of PWM output waveform.
12.1.3. Configuration
• In timing interrupt, to exist the program as soon as possible, timing parameters of the
next period of PWM waveform can be loaded when PWM period started.
• After the duty ratios of every channel have been configured, the system will call
function pwm_start() to calculate timing cycle. Before that, parameters of all current
channels will be stored and protected by the system, calculation completion bits will
be cleared, too. When PWM period comes, parameters stored by the system will be
invoked.
• When PWM period is discontinued new parameters will be applied, and flags should
be set when the calculation of timing cycle is completed, so that cycles between
different colour shade with each new frame and simulate an intermediate shade,
achieving higher quality colour. The control of RGB colour lights is an good example
of PWM control.
• The specific GPIO used can be configured in user_light.h. In our demo SDK, 5
channels of PWM is applied, however, it can be extended to 16 channels. Details on
how to extend the channels of PWM is explained in Chapter 3. The minimum
resolution can reach 45 ns at 1KHz refresh rate, while the minimum duty ratio can
reach 1/22222.
};
struct pwm_param { //define the structure of
PWM parameter
};
void pwm_init(uint32 period, uint32 *duty,uint32
pwm_channel_num,uint32 (*pin_info_list)[3]);
void pwm_start(void);
void pwm_set_duty(uint32 duty, uint8 channel);
Call the function when the system is been initialized. Currently the function can be called
Call
only once.
2. pwm_set_period
3. pwm_set_duty
Set PWM duty ratio. Set the time period of PWM signal when the voltage is high. The value
of duty ratio change with PWM period.
Description
PWM duty ratio can reach period*1000/45 at most. For example, the range of duty ratio is
between 0 and 22222 at 1kHz refresh rate.
• uint32 duty: set the time parameter when the voltage is high. Duty ratio is (duty*45)/
(period*1000).
Parameters
• uint8 channel: PWM channel that needs to be set at present. This parameter is defined
in PWM_CHANNEL.
4. pwm_get_period
Description None.
5. pwm_get_duty
Description Get the duty ratio of current PWM signal at a certain channel.
Parameter uint8 channel: get the current PWM channel. This parameter is defined in PWM_CHANNEL.
Returned Value Duty ratio of a certain PWM channel, the value returned is (duty*45)/ (period*1000).
6. pwm_start
Parameter None.
Call Call pwm_start() when PWM related parameters have been set.
{PWM_1_OUT_IO_MUX,PWM_1_OUT_IO_FUNC,PWM_1_OUT_IO_NUM},
{PWM_2_OUT_IO_MUX,PWM_2_OUT_IO_FUNC,PWM_2_OUT_IO_NUM},
{PWM_3_OUT_IO_MUX,PWM_3_OUT_IO_FUNC,PWM_3_OUT_IO_NUM},
{PWM_4_OUT_IO_MUX,PWM_4_OUT_IO_FUNC,PWM_4_OUT_IO_NUM},
};
pwm_init(light_param.pwm_period, light_param.pwm_duty,
PWM_CHANNEL,io_info);
2. Modify user_light.h.
#define PWM_0_OUT_IO_MUX PERIPHS_IO_MUX_MTDI_U
#define PWM_0_OUT_IO_NUM 12
#define PWM_0_OUT_IO_FUNC FUNC_GPIO12
13.1.1. Transmitting
Users can use the following methods to transmit carrier wave:
• BCK of I2S
• 38KHz carrier frequency generated by WS pin
• Carrier wave generated by any GPIO via sigma-delta function. However, the duty ratio
of carrier wave generated by sigma-delta is around 20%, thus MTMS pin (GPIO14) is
suggested, for this pin can generate standard square wave at a carrier frequency of
38KHz and a duty ratio of 50% exactly.
In the sample codes, data transmission queue is generated via the DSR TIMER interface of
system FRC2, while a state machine driving the transmission of infrared data is also
generated.
Considering that the timing precision of transmitting NEC infrared code should reach a level
of µs, when initiating IR TX, system_timer_reinit should be invoked to improve the timing
precision of FRC2. In user_config.h, enable the definition of USE_US_TIMER, then interface
function os_timer_arm_us can be invoked to implement precise timing at the level of µs.
13.1.2. Receiving
The receiving of remote control codes is implemented via edge-triggered interrupt. When
one system is substracted from one another, the result is the duration time of the wave.
This can be processed by software state machine ir_intr_handler.
⚠ Notice:
• Receiving of infrared remote control codes is implemented via GPIO interrupt. However, the system
can only register only one IO interrupt handler program at the same time. If other IOs also need
interrupts, please handle these interrupts in the same processing program by determine the source of
interrupt and deal with them accordingly.
• In non-OS version of SDK, functions with ICACHE_FLASH_ATTR properties, including print function
os_printf defined in IROM section of the Flash, should NOT be invoked in the whole process of
interrupt handling process such as GPIO, UART, FRC, etc.
Other parameters:
#define USE_US_TIMER can be defined in user_config.h.
Modes of Transmitting Carrier Waveform:
Mode 1: IIS Clock Mode
MTMS pin, or GPIO14 is used to transmit carrier waveform under IIS clock mode. Please
refer to Figure 1 below.
#define GEN_IR_CLK_FROM_IIS 1
#define IR_GPIO_OUT_MUX PERIPHS_IO_MUX_MTMS_U
#define IR_GPIO_OUT_NUM 14
!
Mode 2: Sigma-delta Mode
#define GEN_IR_CLK_FROM_IIS 0
#define IR_GPIO_OUT_MUX PERIPHS_IO_MUX_GPIO5_U
#define IR_GPIO_OUT_NUM 5
#define IR_GPIO_OUT_FUNC FUNC_GPIO5
• LDPC
Although ESP8266 can not completely decipher these kinds of IEEE80211 packets
completely, it can still obtain the length of these special packets.
In summary, while in sniffer mode, ESP8266 can either capture completely the packets or
obtain the length of the packet:
• Packets that ESP8266 can decipher completely; ESP8266 returns with the
- MAC address of the both side of communication and encryption type and
- the length of entire packet.
• Packets that ESP8266 can only partial decipher; ESP8266 returns with
- the length of packet.
Structure RxControl and sniffer_buf are used to represent these two kinds of packets.
Structure sniffer_buf contains structure RxControl.
struct RxControl {
signed rssi:8; // signal intensity of packet
unsigned rate:4;
unsigned is_group:1;
unsigned:1;
unsigned sig_mode:2; // 0:is not 11n packet; non-0:is 11n
packet;
unsigned legacy_length:12; // if not 11n packet, shows length of
packet.
unsigned damatch0:1;
unsigned damatch1:1;
unsigned bssidmatch0:1;
unsigned bssidmatch1:1;
unsigned MCS:7; // if is 11n packet, shows the
modulation
// and code used (range from 0 to 76)
unsigned CWB:1; // if is 11n packet, shows if is HT40 packet or
not
unsigned HT_length:16;// if is 11n packet, shows length of
packet.
unsigned Smoothing:1;
unsigned Not_Sounding:1;
unsigned:1;
unsigned Aggregation:1;
unsigned STBC:2;
unsigned FEC_CODING:1; // if is 11n packet, shows if is LDPC
packet or not.
unsigned SGI:1;
unsigned rxend_state:8;
unsigned ampdu_cnt:8;
unsigned channel:4; //which channel this packet in.
unsigned:12;
};
struct LenSeq{
u16 len; // length of packet
u16 seq; // serial number of packet, the high 12bits are serial
number,
// low 14 bits are Fragment number (usually be 0)
struct sniffer_buf{
struct RxControl rx_ctrl;
};
struct sniffer_buf2{
Callback wifi_promiscuous_rx has two parameters (buf and len). len means the
length of buf, it can be: len = sizeof(struct sniffer_buf2), len = X * 10, len = sizeof(struct
RxControl):
Case of LEN == sizeof (struct sniffer_buf2)
• buf contains structure sniffer_buf2: it is the management packet, it has 112
Bytes data.
• sniffer_buf2.cnt is 1.
• sniffer_buf2.len is the length of packet.
Case of LEN == X * 10
• buf contains structure sniffer_buf: this structure is reliable, data packets
represented by it has been verified by CRC.
• sniffer_buf.cnt means the count of packets in buf. The value of len depends
on sniffer_buf.cnt.
- sniffer_buf.cnt==0, invalid buf; otherwise, len = 50 + cnt * 10
• sniffer_buf.buf contains the first 36 Bytes of IEEE80211 packet. Starting from
sniffer_buf.lenseq[0], each structure lenseq represent a length information of
packet. lenseq[0] represents the length of first packet. If there are two packets
where (sniffer_buf.cnt == 2), lenseq[1] represents the length of second
packet.
• If sniffer_buf.cnt > 1, it is a AMPDU packet, head of each MPDU packets are
similar, so we only provide the length of each packet (from head of MAC packet to
FCS)
• This structure contains: length of packet, MAC address of both sides of
communication, length of the head of packet.
Case of LEN == sizeof(struct RxControl)
• buf contains structure RxControl; but this structure is not reliable, we can not get
neither MAC address of both sides of communication nor length of the head of
packet.
• For AMPDU packet, we can not get the count of packets or the length of packet.
📖 Note:
For the case of LEN == sizeof(struct RxControl), the methods to calculate the length of packet are as below:
• Otherwise, the length of packet is in struct sniffer_buf and sniffer_buf2, and it is more reliable.
Summary
We should not take too long to process the packets. Otherwise, other packets may be lost.
The diagram below shows the format of a IEEE80211 packet:
!
• The first 24 Bytes of MAC Header of data packet are needed:
- Address 4 field depends on FromDS and ToDS which is in Frame Control;
- QoS Control field depends on Subtype which is in Frame Control;
- HT Control field depends on Order Field which is in Frame Control;
- More details are found in IEEE Std 80211-2012.
• For WEP packets, MAC Header is followed by 4 Bytes IV and before FCS there are 4
bytes ICV.
• For TKIP packet, MAC Header is followed by 4 Bytes IV and 4 bytes EIV, and before
FCS there are 8 bytes MIC and 4 bytes ICV.
• For CCMP packet, MAC Header is followed by 8 Bytes CCMP header, and before
FCS there are 8 bytes MIC.
• LDPC;
IOT_device can not get the whole packet, but can parse its packet header of physical layer
(HT-SIG).
In both case 1 and case 2, IOT_device can get HT-SIG which include the length of packet
in physical layer. Please pay attention on following items when using it:
• When it isn’t AMPDU packet or only one sub-frame in AMPDU packet, the length of
UDP packet can be speculated. If the time interval of UDP packets which sent from
phone APP is long ( 20ms ~ 50ms ) , each UDP packet will in different packets in
physical layer, may be a AMPDU packet which only has one sub-frame.
• Firmware of IOT_device can filter packets from other devices according to RSSI.
• Packet of retransmission need to be filter according to the packets sequence, it
means that length of packets which sent consecutively need to be different. For
example:
- Two useful packets can be separated by a specific packet. The specific packet
works like separative sign.
- Length of packet in odd number to be 0 ~ 511, length of packet in even number
to be 512 ~1023。
Appendix
📖 Note:
For GPIO registers, SPI registers, UART registers and Timer registers, please refer to the following
appendixes.
Appendix 1 GPIO Registers Information on GPIO register names, addresses and description.
Appendix 2 SPI Registers Information on SPI register names, addresses and description.
Appendix 3 UART Registers Information on UART register names, addresses and description.
Appendix 4 Timer Registers Information on Timer register names, addresses and description.
NU
OFFSET RegAddr RegName Signal BitPos SW(R/W) Description
M
0 0x0000 0x60000300 GPIO_OUT GPIO_BT_SEL [31:16] R/W BT-Coexist Selection register
GPIO_OUT_DATA [15:0] R/W The output value when the GPIO pin is set as output.
1 0x0001 0x60000304 GPIO_OUT_W1TS [31:16]
GPIO_OUT_DATA_W1TS [15:0] WO Writing 1 into a bit in this register will set the related bit in GPIO_OUT_DATA
2 0x0002 0x60000308 GPIO_OUT_W1TC [31:16]
GPIO_OUT_DATA_W1TC [15:0] WO Writing 1 into a bit in this register will clear the related bit in GPIO_OUT_DATA
3 0x0003 0x6000030C GPIO_ENABLE [31:22]
GPIO_SDIO_SEL [21:16] R/W SDIO-dis selection register
GPIO_ENABLE_DATA [15:0] R/W The output enable register.
4 0x0004 0x60000310 GPIO_ENABLE_W1TS [31:16]
GPIO_ENABLE_DATA_W1TS [15:0] WO Writing 1 into a bit in this register will set the related bit in GPIO_ENABLE_DATA
5 0x0005 0x60000314 GPIO_ENABLE_W1TC [31:16]
GPIO_ENABLE_DATA_W1TC [15:0] WO Writing 1 into a bit in this register will clear the related bit in GPIO_ENABLE_DATA
6 0x0006 0x60000318 GPIO_IN GPIO_STRAPPING [31:16] The values of the strapping pins.
GPIO_IN_DATA [15:0] The values of the GPIO pins when the GPIO pin is set as input.
7 0x0007 0x6000031C GPIO_STATUS [31:16]
GPIO_STATUS_INTERRUPT [15:0] R/W Interrupt enable register.
8 0x0008 0x60000320 GPIO_STATUS_W1TS [31:16]
GPIO_STATUS_INTERRUPT_W1TS [15:0] WO Writing 1 into a bit in this register will set the related bit in GPIO_STATUS_INTERRUPT
9 0x0009 0x60000324 GPIO_STATUS_W1TC [31:16]
GPIO_STATUS_INTERRUPT_W1TC [15:0] WO Writing 1 into a bit in this register will clear the related bit in GPIO_STATUS_INTERRUPT
10 0x000a 0x60000328 GPIO_PIN0 [31:11]
GPIO_PIN0_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN0_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN0_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN0_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
11 0x000b 0x6000032C GPIO_PIN1 [31:11]
GPIO_PIN1_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN1_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN1_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN1_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
12 0x000c 0x60000330 GPIO_PIN2 [31:11]
GPIO_PIN2_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN2_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN2_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN2_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
13 0x000d 0x60000334 GPIO_PIN3 [31:11]
GPIO_PIN3_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN3_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN3_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN3_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
14 0x000e 0x60000338 GPIO_PIN4 [31:11]
GPIO_PIN4_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN4_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN4_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN4_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
15 0x000f 0x6000033C GPIO_PIN5 [31:11]
GPIO_PIN5_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN5_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN5_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN5_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
16 0x0010 0x60000340 GPIO_PIN6 [31:11]
GPIO_PIN6_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN6_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN6_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN6_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
17 0x0011 0x60000344 GPIO_PIN7 [31:11]
GPIO_PIN7_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN7_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN7_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN7_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
18 0x0012 0x60000348 GPIO_PIN8 [31:11]
GPIO_PIN8_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN8_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN8_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN8_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
19 0x0013 0x6000034C GPIO_PIN9 [31:11]
GPIO_PIN9_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN9_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN9_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN9_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
20 0x0014 0x60000350 GPIO_PIN10 [31:11]
GPIO_PIN10_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN10_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN10_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN10_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
21 0x0015 0x60000354 GPIO_PIN11 [31:11]
GPIO_PIN11_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN11_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN11_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN11_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
22 0x0016 0x60000358 GPIO_PIN12 [31:11]
GPIO_PIN12_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN12_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN12_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN12_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
23 0x0017 0x6000035C GPIO_PIN13 [31:11]
GPIO_PIN13_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN13_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN13_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN13_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
24 0x0018 0x60000360 GPIO_PIN14 [31:11]
GPIO_PIN14_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN14_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN14_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN14_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
25 0x0019 0x60000364 GPIO_PIN15 [31:11]
GPIO_PIN15_WAKEUP_ENABLE [10] R/W 0: disable; 1: enable GPIO wakeup CPU, only when GPIO_PIN0_INT_TYPE is 0x4 or 0x5
0: disable; 1: positive edge; 2: negative edge; 3: both types of edge; 4: low-level; 5: high-
GPIO_PIN15_INT_TYPE [9:7] R/W
level
[6:3]
GPIO_PIN15_DRIVER [2] R/W 1: open drain; 0: normal
[1]
GPIO_PIN15_SOURCE [0] R/W 1: sigma-delta; 0: GPIO_DATA
26 0x001a 0x60000368 GPIO_SIGMA_DELTA [31:17]
SIGMA_DELTA_ENABLE [16] R/W 1: enable sigma-delta; 0: disable
SIGMA_DELTA_PRESCALAR [15:8] R/W Clock pre-divider for sigma-delta.
SIGMA_DELTA_TARGET [7:0] R/W target level of the sigma-delta. It is a signed byte.
27 0x001b 0x6000036C GPIO_RTC_CALIB_SYNC RTC_CALIB_START [31] R/W Positvie edge of this bit will trigger the RTC-clock-calibration process.
[30:10]
RTC_PERIOD_NUM [9:0] R/W The cycle number of RTC-clock during RTC-clock-calibration
28 0x001c 0x60000370 GPIO_RTC_CALIB_VALUE RTC_CALIB_RDY [31] 0: during RTC-clock-calibration; 1: RTC-clock-calibration is done
RTC_CALIB_RDY_REAL [30] 0: during RTC-clock-calibration; 1: RTC-clock-calibration is done
[29:20]
The cycle number of clk_xtal (crystal clock) for the RTC_PERIOD_NUM cycles of RTC-
RTC_CALIB_VALUE [19:0]
clock
Appendix 2 SPI Registers
Address RegName Signal BitPos Default SW(R/W) Description
0x0 SPI_CMD spi_usr [18] 1'b0 R/W In the master mode, it is the start bit of a single operation. Self-clear by hardware
0x4 SPI_ADDR iodata_start_addr [31:0] 32'h0 R/W In the master mode, it is the value of address in "address" phase.
0x8 SPI_CTRL [31:27] 5'h0 RO
spi_wr_bit_order [26] 1'b0 R/W In "command", "address", "write-data" (MOSI) phases, 1: LSB first; 0: MSB first
spi_rd_bit_order [25] 1'b0 R/W In "read-data" (MISO) phase, 1: LSB first; 0: MSB first
spi_qio_mode [24] 1'b0 R/W In the read operations, "address" phase and "read-data" phase apply 4 signals
spi_dio_mode [23] 1'b0 R/W In the read operations, "address" phase and "read-data" phase apply 2 signals
spi_qout_mode [20] 1'b0 R/W In the read operations, "read-data" phase apply 4 signals
spi_dout_mode [14] 1'b0 R/W In the read operations, "read-data" phase apply 2 signals
spi_fastrd_mode [13] 1'b1 R/W this bit enable the bits: spi_qio_mode, spi_dio_mode, spi_qout_mode and spi_dout_mode
0x10 SPI_RD_STATUS slv_rd_status [31:0] 32'h00 R/W In the slave mode, this register are the status register for the master to read out.
0x14 SPI_CTRL2 spi_cs_delay_num [31:28] 4'h0 R/W spi_cs signal is delayed by 80MHz clock cycles
spi_cs_delay_mode [27:26] 2'h0 R/W spi_cs signal is delayed by spi_clk. 0: zero; 1: half cycle; 2: one cycle
spi_mosi_delay_num [25:23] 3'h0 R/W MOSI signals are delayed by 80MHz clock cycles
spi_mosi_delay_mode [22:21] 2'h0 R/W MOSI signals are delayed by spi_clk. 0: zero; 1: half cycle; 2: one cycle
spi_miso_delay_num [20:18] 3'h0 R/W MISO signals are delayed by 80MHz clock cycles
spi_miso_delay_mode [17:16] 2'h0 R/W MISO signals are delayed by spi_clk. 0: zero; 1: half cycle; 2: one cycle
0x18 SPI_CLOCK spi_clk_equ_sysclk [31] 1'b1 R/W In the master mode, 1: spi_clk is eqaul to 80MHz, 0: spi_clk is divided from 80 MHz clock.
spi_clkdiv_pre [30:18] 13'b0 R/W In the master mode, it is pre-divider of spi_clk.
In the master mode, it is the divider of spi_clk. So spi_clk frequency is 80MHz/(spi_clkdiv_pre+1)/
spi_clkcnt_N [17:12] 6'h3 R/W
(spi_clkcnt_N+1)
spi_clkcnt_H [11:6] 6'h1 R/W In the master mode, it must be floor((spi_clkcnt_N+1)/2-1). In the slave mode, it must be 0.
spi_clkcnt_L [5:0] 6'h3 R/W In the master mode, it must be eqaul to spi_clkcnt_N. In the slave mode, it must be 0.
0x1C SPI_USER spi_usr_command [31] 1'b1 R/W This bit enable the "command" phase of an operation.
spi_usr_addr [30] 1'b0 R/W This bit enable the "address" phase of an operation.
spi_usr_dummy [29] 1'b0 R/W This bit enable the "dummy" phase of an operation.
spi_usr_miso [28] 1'b0 R/W This bit enable the "read-data" phase of an operation.
spi_usr_mosi [27] 1'b0 R/W This bit enable the "write-data" phase of an operation.
reg_usr_mosi_highpart [25] 1'b0 R/W 1: "write-data" phase only access to high-part of the buffer spi_w8~spi_w15
reg_usr_miso_highpart [24] 1'b0 R/W 1: "read-data" phase only access to high-part of the buffer spi_w8~spi_w15
spi_sio [16] 1'b0 R/W 1: mosi and miso signals share the same pin
spi_fwrite_qio [15] 1'b0 R/W In the write operations, "address" phase and "read-data" phase apply 4 signals
spi_fwrite_dio [14] 1'b0 R/W In the write operations, "address" phase and "read-data" phase apply 2 signals
spi_fwrite_quad [13] 1'b0 R/W In the write operations, "read-data" phase apply 4 signals
spi_fwrite_dual [12] 1'b0 R/W In the write operations, "read-data" phase apply 2 signals
spi_wr_byte_order [11] 1'b0 R/W In "command", "address", "write-data" (MOSI) phases, 1: little-endian; 0: big_endian
spi_rd_byte_order [10] 1'b0 R/W In "read-data" (MISO) phase, 1: little-endian; 0: big_endian
spi_ck_i_edge [6] 1'b1 R/W In the slave mode, 1: rising-edge; 0: falling-edge
0x20 SPI_USER1 reg_usr_addr_bitlen [31:26] 6'd23 R/W The length in bits of "address" phase. The register value shall be (bit_num-1)
reg_usr_mosi_bitlen [25:17] 9'h0 R/W The length in bits of "write-data" phase. The register value shall be (bit_num-1)
reg_usr_miso_bitlen [16:8] 9'h0 R/W The length in bits of "read-data" phase. The register value shall be (bit_num-1)
reg_usr_dummy_cyclelen [7:0] 8'h0 R/W The length in spi_clk cycles of "dummy" phase. The register value shall be (cycle_num-1)
0x24 SPI_USER2 reg_usr_command_bitlen [31:28] 4'd7 R/W The length in bits of "command" phase. The register value shall be (bit_num-1)
reg_usr_command_value [15:0] 16'b0 R/W The value of "command" phase
0x28 SPI_WR_STATUS slv_wr_status [31:0] 32'b0 R/W In the slave mode, this register are the status register for the master to write into.
0x2C SPI_PIN spi_cs2_dis [2] 1'b1 R/W 1: disable CS2; 0: spi_cs signal is from/to CS2 pin
spi_cs1_dis [1] 1'b1 R/W 1: disable CS1; 0: spi_cs signal is from/to CS1 pin
spi_cs0_dis [0] 1'b0 R/W 1: disable CS0; 0: spi_cs signal is from/to CS0 pin
0x30 SPI_SLAVE spi_sync_reset [31] 1'b0 R/W It is the synchronous reset signal of the module. This bit is self-cleared by hardware.
spi_slave_mode [30] 1'b0 R/W 1: slave mode, 0: master mode.
1: slave mode commands are defined in SPI_SLAVE3. 0: slave mode commands are fixed as 1: "write-
slv_cmd_define [27] 1'b0 R/W
status"; 4: "read-status"; 2: "write-buffer" and 3: "read-buffer".
spi_trans_cnt [26:23] 4'b0 RO The operations counter in both the master mode and the slave mode.
5'b1_00
spi_int_en [9:5] R/W Interrupt enable bits for the below 5 sources
00
spi_trans_done [4] 1'b0 R/W The interrupt raw bit for the completement of any operation in both the master mode and the slave mode.
slv_wr_sta_done [3] 1'b0 R/W The interrupt raw bit for the completement of "write-status" operation in the slave mode.
slv_rd_sta_done [2] 1'b0 R/W The interrupt raw bit for the completement of "read-status" operation in the slave mode.
slv_wr_buf_done [1] 1'b0 R/W The interrupt raw bit for the completement of "write-buffer" operation in the slave mode.
slv_rd_buf_done [0] 1'b0 R/W The interrupt raw bit for the completement of "read-buffer" operation in the slave mode.
In the slave mode, it is the length in bits for "write-status" and "read-status" operations. The register value
0x34 SPI_SLAVE1 slv_status_bitlen [31:27] 5'b0 R/W
shall be (bit_num-1)
In the slave mode, it is the length in bits for "write-buffer" and "read-buffer" operations. The register value shall
slv_buf_bitlen [24:16] 9'b0 R/W
be (bit_num-1)
In the slave mode, it is the address length in bits for "read-buffer" operation. The register value shall be
slv_rd_addr_bitlen [15:10] 6'b0 R/W
(bit_num-1)
In the slave mode, it is the address length in bits for "write-buffer" operation. The register value shall be
slv_wr_addr_bitlen [9:4] 6'b0 R/W
(bit_num-1)
slv_wrsta_dummy_en [3] 1'b0 R/W In the slave mode, it is the enable bit of "dummy" phase for "write-status" operations.
slv_rdsta_dummy_en [2] 1'b0 R/W In the slave mode, it is the enable bit of "dummy" phase for "read-status" operations.
slv_wrbuf_dummy_en [1] 1'b0 R/W In the slave mode, it is the enable bit of "dummy" phase for "write-buffer" operations.
slv_rdbuf_dummy_en [0] 1'b0 R/W In the slave mode, it is the enable bit of "dummy" phase for "read-buffer" operations.
slv_wrbuf_dummy_cyclele In the slave mode, it is the length in spi_clk cycles "dummy" phase for "write-buffer" operations. The register
0x38 SPI_SLAVE2 [31:24] 8'b0 R/W
n value shall be (cycle_num-1)
In the slave mode, it is the length in spi_clk cycles of "dummy" phase for "read-buffer" operations. The register
slv_rdbuf_dummy_cyclelen [23:16] 8'b0 R/W
value shall be (cycle_num-1)
slv_wrsta_dummy_cyclele In the slave mode, it is the length in spi_clk cycles of "dummy" phase for "write-status" operations. The
[15:8] 8'b0 R/W
n register value shall be (cycle_num-1)
In the slave mode, it is the length in spi_clk cycles of "dummy" phase for "read-status" operations. The
slv_rdsta_dummy_cyclelen [7:0] 8'b0 R/W
register value shall be (cycle_num-1)
0x3C SPI_SLAVE3 slv_wrsta_cmd_value [31:24] 8'b0 R/W In slave mode, it is the value of "write-status" command
slv_rdsta_cmd_value [23:16] 8'b0 R/W In slave mode, it is the value of "read-status" command
slv_wrbuf_cmd_value [15:8] 8'b0 R/W In slave mode, it is the value of "write-buffer" command
slv_rdbuf_cmd_value [7:0] 8'b0 R/W In slave mode, it is the value of "read-buffer" command
the data buffer inside SPI module. There are 64byte, i.e., 16 words. Note that only 32bit accessing are
0x40~0x7C SPI_W0~SPI_W15 spi_w0~spi_w15 [31:0] 32'h0 R/W
supported.
0xFC SPI_EXT3 reg_int_hold_ena [1:0] 2'b0 R/W This register is for two SPI masters to share the same cs, clock and data signals.
Appendix 3 UART Registers
Address RegName Signal BitPos Default SW(R/W) Description
0x0 UART_FIFO [31:8] 24'h0 RO UART FIFO,length 128
rxfifo_rd_byte [7:0] 8'b0 RO R/W share the same address
0x4 UART_INT_RAW UART_INT_RAW UART INTERRUPT RAW STATE
The interrupt raw bit for Rx time-out interrupt(depands on the
rxfifo_tout_int_raw [8] 1'b0 RO
UART_RX_TOUT_THRHD)
brk_det_int_raw [7] 1'b0 RO The interrupt raw bit for Rx byte start error
cts_chg_int_raw [6] 1'b0 RO The interrupt raw bit for CTS changing level
dsr_chg_int_raw [5] 1'b0 RO The interrupt raw bit for DSR changing level
rxfifo_ovf_int_raw [4] 1'b0 RO The interrupt raw bit for rx fifo overflow
frm_err_int_raw [3] 1'b0 RO The interrupt raw bit for other rx error
parity_err_int_raw [2] 1'b0 RO The interrupt raw bit for parity check error
The interrupt raw bit for tx fifo empty interrupt(depands on
txfifo_empty_int_raw [1] 1'b0 RO
UART_TXFIFO_EMPTY_THRHD bits)
The interrupt raw bit for rx fifo full interrupt(depands on
rxfifo_full_int_raw [0] 1'b0 RO
UART_RXFIFO_FULL_THRHD bits)
UART INTERRUPT STATE
0x8 UART_INT_ST UART_INT_ST
REGISTER UART_INT_RAW&UART_INT_ENA
rxfifo_tout_int_st [8] 1'b0 RO The interrupt state bit for Rx time-out event
brk_det_int_st [7] 1'b0 RO The interrupt state bit for rx byte start error
cts_chg_int_st [6] 1'b0 RO The interrupt state bit for CTS changing level
dsr_chg_int_st [5] 1'b0 RO The interrupt state bit for DSR changing level
rxfifo_ovf_int_st [4] 1'b0 RO The interrupt state bit for RX fifo overflow
frm_err_int_st [3] 1'b0 RO The interrupt state for other rx error
parity_err_int_st [2] 1'b0 RO The interrupt state bit for rx parity error
txfifo_empty_int_st [1] 1'b0 RO The interrupt state bit for TX fifo empty
rxfifo_full_int_st [0] 1'b0 RO The interrupt state bit for RX fifo full event
0xC UART_INT_ENA UART_INT_ENA UART INTERRUPT ENABLE REGISTER
rxfifo_tout_int_ena [8] 1'b0 R/W The interrupt enable bit for rx time-out interrupt
brk_det_int_ena [7] 1'b0 R/W The interrupt enable bit for rx byte start error
cts_chg_int_ena [6] 1'b0 R/W The interrupt enable bit for CTS changing level
dsr_chg_int_ena [5] 1'b0 R/W The interrupt enable bit for DSR changing level
rxfifo_ovf_int_ena [4] 1'b0 R/W The interrupt enable bit for rx fifo overflow
frm_err_int_ena [3] 1'b0 R/W The interrupt enable bit for other rx error
parity_err_int_ena [2] 1'b0 R/W The interrupt enable bit for parity error
txfifo_empty_int_ena [1] 1'b0 R/W The interrupt enable bit for tx fifo empty event
rxfifo_full_int_ena [0] 1'b0 R/W The interrupt enable bit for rx fifo full event
0x10 UART_INT_CLR UART_INT_CLR UART INTERRUPT CLEAR REGISTER
rxfifo_tout_int_clr [8] 1'b0 WO Set this bit to clear the rx time-out interrupt
brk_det_int_clr [7] 1'b0 WO Set this bit to clear the rx byte start interrupt
cts_chg_int_clr [6] 1'b0 WO Set this bit to clear the CTS changing interrupt
dsr_chg_int_clr [5] 1'b0 WO Set this bit to clear the DSR changing interrupt
rxfifo_ovf_int_clr [4] 1'b0 WO Set this bit to clear the rx fifo over-flow interrupt
frm_err_int_clr [3] 1'b0 WO Set this bit to clear other rx error interrupt
parity_err_int_clr [2] 1'b0 WO Set this bit to clear the parity error interrupt
txfifo_empty_int_clr [1] 1'b0 WO Set this bit to clear the tx fifo empty interrupt
rxfifo_full_int_clr [0] 1'b0 WO Set this bit to clear the rx fifo full interrupt
0x14 UART_CLKDIV UART_CLKDIV UART CLK DIV REGISTER
uart_clkdiv [19:0] 20'h2B6 R/W BAUDRATE = UART_CLK_FREQ / UART_CLKDIV
0x18 UART_AUTOBAUD UART_AUTOBAUD UART BAUDRATE DETECT REGISTER
glitch_filt [15:8] 8'h10 R/W
[7:1] 7'h0 RO
autobaud_en [0] 1'b0 R/W Set this bit to enable baudrate detect
0x20 FRC2_LOAD_ADDRESS frc2_load_value [31:0] 32'b0 R/W the load value into the counter
the current value of the counter. It is a increasing
0x24 FRC2_COUNT_ADDRESS frc2_count [31:0] 32'b1 RO
counter.
0x28 FRC2_CTRL_ADDRESS [31:9] 23'b0 RO
the status of the interrupt, when the count is equal to
frc2_int [8] 1'b0 RO
the alarm value
frc2_ctrl [7:0] 8'b0 R/W bit[7]: timer enable
bit[6]: automatically reload, when the counter is
equal to zero
bit[3:2]: prescale-divider, 0: divided by 1, 1: divided
by 16, 2 or 3: divided by 256
bit[0]: interrupt type, 0:edge, 1:level
0x2C FRC2_INT_ADDRESS [31:1] 30'b0 RO
write to clear the status of the interrupt, if the
frc2_int_clr_mask [0] 1'b0 R/W
interrupt type is "level"
0x30 FRC2_ALARM_ADDRESS frc2_alarm [31:0] 32'b0 R/W the alarm value for the counter
Disclaimer and Copyright Notice
Information in this document, including URL references, is subject to change without
notice.
THIS DOCUMENT IS PROVIDED AS IS WITH NO WARRANTIES WHATSOEVER,
INCLUDING ANY WARRANTY OF MERCHANTABILITY, NON-INFRINGEMENT, FITNESS
FOR ANY PARTICULAR PURPOSE, OR ANY WARRANTY OTHERWISE ARISING OUT
OF ANY PROPOSAL, SPECIFICATION OR SAMPLE.
All liability, including liability for infringement of any proprietary rights, relating to use of
information in this document is disclaimed. No licenses express or implied, by estoppel or
otherwise, to any intellectual property rights are granted herein.
The Wi-Fi Alliance Member logo is a trademark of the Wi-Fi Alliance. The Bluetooth logo is
a registered trademark of Bluetooth SIG.
All trade names, trademarks and registered trademarks mentioned in this document are
Espressif IoT Team
property of their respective owners, and are hereby acknowledged.
www.espressif.com Copyright © 2020 Espressif Inc. All rights reserved.