Datasheet
Table Of Contents
- RP2040 Datasheet
- Colophon
- Chapter 1. Introduction
- Chapter 2. System Description
- 2.1. Bus Fabric
- 2.2. Address Map
- 2.3. Processor subsystem
- 2.4. Cortex-M0+
- 2.5. DMA
- 2.6. Memory
- 2.7. Boot Sequence
- 2.8. Bootrom
- 2.9. Power Supplies
- 2.10. Core Supply Regulator
- 2.11. Power Control
- 2.12. Chip-Level Reset
- 2.13. Power-On State Machine
- 2.14. Subsystem Resets
- 2.15. Clocks
- 2.16. Crystal Oscillator (XOSC)
- 2.17. Ring Oscillator (ROSC)
- 2.18. PLL
- 2.19. GPIO
- 2.20. Sysinfo
- 2.21. Syscfg
- 2.22. TBMAN
- Chapter 3. PIO
- Chapter 4. Peripherals
- 4.1. USB
- 4.2. UART
- 4.3. I2C
- 4.3.1. Features
- 4.3.2. IP Configuration
- 4.3.3. I2C Overview
- 4.3.4. I2C Terminology
- 4.3.5. I2C Behaviour
- 4.3.6. I2C Protocols
- 4.3.7. Tx FIFO Management and START, STOP and RESTART Generation
- 4.3.8. Multiple Master Arbitration
- 4.3.9. Clock Synchronization
- 4.3.10. Operation Modes
- 4.3.11. Spike Suppression
- 4.3.12. Fast Mode Plus Operation
- 4.3.13. Bus Clear Feature
- 4.3.14. IC_CLK Frequency Configuration
- 4.3.15. DMA Controller Interface
- 4.3.16. Operation of Interrupt Registers
- 4.3.17. List of Registers
- 4.4. SPI
- 4.5. PWM
- 4.6. Timer
- 4.7. Watchdog
- 4.8. RTC
- 4.9. ADC and Temperature Sensor
- 4.10. SSI
- 4.10.1. Overview
- 4.10.2. Features
- 4.10.3. IP Modifications
- 4.10.4. Clock Ratios
- 4.10.5. Transmit and Receive FIFO Buffers
- 4.10.6. 32-Bit Frame Size Support
- 4.10.7. SSI Interrupts
- 4.10.8. Transfer Modes
- 4.10.9. Operation Modes
- 4.10.10. Partner Connection Interfaces
- 4.10.11. DMA Controller Interface
- 4.10.12. APB Interface
- 4.10.13. List of Registers
- Chapter 5. Electrical and Mechanical
- Appendix A: Register Field Types
- Appendix B: Errata
- Appendix C: Documentation Release History
101 gpio_pull_up(pin_sda);
102 uint32_t both_pins = (1u << pin_sda) | (1u << pin_scl);
103 pio_sm_set_pins_with_mask(pio, sm, both_pins, both_pins);
104 pio_sm_set_pindirs_with_mask(pio, sm, both_pins, both_pins);
105 pio_gpio_init(pio, pin_sda);
106 gpio_set_oeover(pin_sda, GPIO_OVERRIDE_INVERT);
107 pio_gpio_init(pio, pin_scl);
108 gpio_set_oeover(pin_scl, GPIO_OVERRIDE_INVERT);
109 pio_sm_set_pins_with_mask(pio, sm, 0, both_pins);
110
111 // Clear IRQ flag before starting
112 hw_clear_bits(&pio->inte0, 1u << sm);
113 hw_clear_bits(&pio->inte1, 1u << sm);
114 pio->irq = 1u << sm;
115
116 // Configure and start SM
117 pio_sm_init(pio, sm, offset + i2c_offset_entry_point, &c);
118 pio_sm_set_enabled(pio, sm, true);
119 }
We can also use the PIO assembler to generate a table of instructions for passing through the FIFO, for
Start/Stop/Restart conditions.
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/master/pio/i2c/i2c.pio Lines 124 - 134
124 .program set_scl_sda
125 .side_set 1 opt
126
127 ; Assemble a table of instructions which software can select from, and pass
128 ; into the FIFO, to issue START/STOP/RSTART. This isn't intended to be run as
129 ; a complete program.
130
131 set pindirs, 0 side 0 [7] ; SCL = 0, SDA = 0
132 set pindirs, 1 side 0 [7] ; SCL = 0, SDA = 1
133 set pindirs, 0 side 1 [7] ; SCL = 1, SDA = 0
134 set pindirs, 1 side 1 [7] ; SCL = 1, SDA = 1
The example code does blocking software IO on the state machine’s FIFOs, to avoid the extra complexity of setting up
the system DMA. For example, an I2C start condition is enqueued like so:
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/master/pio/i2c/pio_i2c.c Lines 61 - 65
61 void pio_i2c_start(PIO pio, uint sm) {
62 pio_i2c_put_or_err(pio, sm, 1u << PIO_I2C_ICOUNT_LSB); // Escape code for 2 instruction
Ê sequence
63 pio_i2c_put_or_err(pio, sm, set_scl_sda_program_instructions[I2C_SC1_SD0]); // We are
Ê already in idle state, just pull SDA low
64 pio_i2c_put_or_err(pio, sm, set_scl_sda_program_instructions[I2C_SC0_SD0]); // Also
Ê pull clock low so we can present data
65 }
Because I2C can go wrong at so many points, we need to be able to check the error flag asserted by the state machine,
clear the halt and restart it, before asserting a Stop condition and releasing the bus.
Pico Examples: https://github.com/raspberrypi/pico-examples/tree/master/pio/i2c/pio_i2c.c Lines 140 - 144
140 if (pio_i2c_check_error(pio, sm)) {
141 err = -1;
RP2040 Datasheet
3.6. Examples 382