mbed API for Raspberry Pi boards.
mbedPi
This is an attempt to implement a limited number of mbed APIs for Raspberry Pi single-board computers. The project was inspired by and based on the arduPi library developed for the Arduino by Cooking Hacks .
Specifications
- Chip: Broadcom BCM2836 SoC
- Core architecture: Quad-core ARM Cortex-A7
- CPU frequency: 900 MHz
- GPU: Dual Core VideoCore IV® Multimedia Co-Processor
- Memory: 1GB LPDDR2
- Operating System: Boots from Micro SD card, running a version of the Linux operating system
- Power: Micro USB socket 5V, 2A
Connectors
- Ethernet: 10/100 BaseT Ethernet socket
- Video Output: HDMI (rev 1.3 & 1.4)
- Audio Output: 3.5mm jack, HDMI
- USB: 4 x USB 2.0 Connector
- GPIO Connector: 40-pin 2.54 mm (100 mil) expansion header: 2x20 strip providing 27 GPIO pins as well as +3.3 V, +5 V and GND supply lines
- Camera Connector: 15-pin MIPI Camera Serial Interface (CSI-2)
- JTAG: Not populated
- Display Connector: Display Serial Interface (DSI) 15 way flat flex cable connector with two data lanes and a clock lane
- Memory Card Slot: Micro SDIO
GPIO connector pinout
Information
Only the labels printed in blue/white or green/white (i.e. p3, gpio2 ...) must be used in your code. The other labels are given as information (alternate-functions, power pins, ...).
Building programs for the Raspberry Pi with mbedPi
I use Qt Creator for development, however you can use any other IDE available on the Raspberry Pi (e.g. Geany) if you like. For a quick try:
- Install Qt and the Qt Creator onto your Raspberry Pi. Then create a new "Blinky" Plain non-Qt C++ Project as follows:
- Change the main code as below:
main.cpp
#include "mbedPi.h" int main() { DigitalOut myled(p7); while(1) { myled = 1; // LED is ON wait(0.2); // 200 ms myled = 0; // LED is OFF wait(1.0); // 1 sec printf("Blink\r\n"); } }
- Copy the mbedPi.zip file into your project's folder and unzip.
- Add the mbedPi.h and mbedPi.cpp files to your project by right clicking on the "Blinky" project and then clicking on the "Add Existing Files..." option in the local menu:
- Double click on Blinky.pro to open it for editing and add new libraries by inserting a new line as follows:
- Compile the project.
- Connect an LED through a 1k resistor to pin 7 and the ground on the Raspberry Pi GPIO connector.
- Run the binary as sudo (sudo ./Blinky) and you should see the LED blinking.
- Press Ctrl+c to stop running the application.
source/SPI.cpp@2:131555dc6fb7, 21 months ago (annotated)
- Committer:
- hudakz
- Date:
- Tue Dec 20 12:16:18 2022 +0000
- Revision:
- 2:131555dc6fb7
- Parent:
- 1:1f2d9982fa8c
Mbed API for Raspberry Pi boards equipped with BCM2836 SoC.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 1:1f2d9982fa8c | 1 | #include "mbed.h" |
hudakz | 1:1f2d9982fa8c | 2 | |
hudakz | 1:1f2d9982fa8c | 3 | extern volatile uint32_t *bcm2835_bsc1; |
hudakz | 1:1f2d9982fa8c | 4 | extern volatile uint32_t *bcm2835_spi0; |
hudakz | 1:1f2d9982fa8c | 5 | |
hudakz | 1:1f2d9982fa8c | 6 | /************************************************************************** |
hudakz | 1:1f2d9982fa8c | 7 | * |
hudakz | 1:1f2d9982fa8c | 8 | * SPI Class implementation |
hudakz | 1:1f2d9982fa8c | 9 | * |
hudakz | 1:1f2d9982fa8c | 10 | **************************************************************************/ |
hudakz | 1:1f2d9982fa8c | 11 | |
hudakz | 1:1f2d9982fa8c | 12 | /****************** |
hudakz | 1:1f2d9982fa8c | 13 | * Public methods * |
hudakz | 1:1f2d9982fa8c | 14 | ******************/ |
hudakz | 1:1f2d9982fa8c | 15 | SPI::SPI() : |
hudakz | 1:1f2d9982fa8c | 16 | _write_fill(0xFF) |
hudakz | 1:1f2d9982fa8c | 17 | { |
hudakz | 1:1f2d9982fa8c | 18 | REV = getBoardRev(); |
hudakz | 1:1f2d9982fa8c | 19 | |
hudakz | 1:1f2d9982fa8c | 20 | bcm2835_gpio_fsel(9, BCM2835_GPIO_FSEL_ALT0); // MISO |
hudakz | 1:1f2d9982fa8c | 21 | bcm2835_gpio_fsel(10, BCM2835_GPIO_FSEL_ALT0); // MOSI |
hudakz | 1:1f2d9982fa8c | 22 | bcm2835_gpio_fsel(11, BCM2835_GPIO_FSEL_ALT0); // CLK |
hudakz | 1:1f2d9982fa8c | 23 | |
hudakz | 1:1f2d9982fa8c | 24 | // Set the SPI CS register to some sensible defaults |
hudakz | 1:1f2d9982fa8c | 25 | volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS / 4; |
hudakz | 1:1f2d9982fa8c | 26 | bcm2835_peri_write(paddr, 0); // All 0s |
hudakz | 1:1f2d9982fa8c | 27 | |
hudakz | 1:1f2d9982fa8c | 28 | // Clear TX and RX fifos |
hudakz | 1:1f2d9982fa8c | 29 | bcm2835_peri_write_nb(paddr, BCM2835_SPI0_CS_CLEAR); |
hudakz | 1:1f2d9982fa8c | 30 | } |
hudakz | 1:1f2d9982fa8c | 31 | |
hudakz | 1:1f2d9982fa8c | 32 | /** |
hudakz | 1:1f2d9982fa8c | 33 | * @brief |
hudakz | 1:1f2d9982fa8c | 34 | * @note |
hudakz | 1:1f2d9982fa8c | 35 | * @param |
hudakz | 1:1f2d9982fa8c | 36 | * @retval |
hudakz | 1:1f2d9982fa8c | 37 | */ |
hudakz | 1:1f2d9982fa8c | 38 | SPI::~SPI() |
hudakz | 1:1f2d9982fa8c | 39 | { |
hudakz | 1:1f2d9982fa8c | 40 | // Set all the SPI0 pins back to input |
hudakz | 1:1f2d9982fa8c | 41 | |
hudakz | 1:1f2d9982fa8c | 42 | // bcm2835_gpio_fsel(7, BCM2835_GPIO_FSEL_INPT); // CE1 |
hudakz | 1:1f2d9982fa8c | 43 | // bcm2835_gpio_fsel(8, BCM2835_GPIO_FSEL_INPT); // CE0 |
hudakz | 1:1f2d9982fa8c | 44 | bcm2835_gpio_fsel(9, BCM2835_GPIO_FSEL_INPT); // MISO |
hudakz | 1:1f2d9982fa8c | 45 | bcm2835_gpio_fsel(10, BCM2835_GPIO_FSEL_INPT); // MOSI |
hudakz | 1:1f2d9982fa8c | 46 | bcm2835_gpio_fsel(11, BCM2835_GPIO_FSEL_INPT); // CLK |
hudakz | 1:1f2d9982fa8c | 47 | } |
hudakz | 1:1f2d9982fa8c | 48 | |
hudakz | 1:1f2d9982fa8c | 49 | /** |
hudakz | 1:1f2d9982fa8c | 50 | * @brief |
hudakz | 1:1f2d9982fa8c | 51 | * @note |
hudakz | 1:1f2d9982fa8c | 52 | * @param |
hudakz | 1:1f2d9982fa8c | 53 | * @retval |
hudakz | 1:1f2d9982fa8c | 54 | */ |
hudakz | 1:1f2d9982fa8c | 55 | void SPI::format(int bits, uint8_t mode) |
hudakz | 1:1f2d9982fa8c | 56 | { |
hudakz | 1:1f2d9982fa8c | 57 | volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS / 4; |
hudakz | 1:1f2d9982fa8c | 58 | |
hudakz | 1:1f2d9982fa8c | 59 | if (bits > 0) { |
hudakz | 1:1f2d9982fa8c | 60 | bits = 8U; |
hudakz | 1:1f2d9982fa8c | 61 | } |
hudakz | 1:1f2d9982fa8c | 62 | //BCM2835_SPI_BIT_ORDER_MSBFIRST is the only one suported by SPI0 |
hudakz | 1:1f2d9982fa8c | 63 | |
hudakz | 1:1f2d9982fa8c | 64 | // Mask in the CPO and CPHA bits of CS |
hudakz | 1:1f2d9982fa8c | 65 | bcm2835_peri_set_bits(paddr, mode << 2, BCM2835_SPI0_CS_CPOL | BCM2835_SPI0_CS_CPHA); |
hudakz | 1:1f2d9982fa8c | 66 | } |
hudakz | 1:1f2d9982fa8c | 67 | |
hudakz | 1:1f2d9982fa8c | 68 | /** |
hudakz | 1:1f2d9982fa8c | 69 | * @brief |
hudakz | 1:1f2d9982fa8c | 70 | * @note |
hudakz | 1:1f2d9982fa8c | 71 | * @param |
hudakz | 1:1f2d9982fa8c | 72 | * @retval |
hudakz | 1:1f2d9982fa8c | 73 | */ |
hudakz | 1:1f2d9982fa8c | 74 | void SPI::frequency(int hz) |
hudakz | 1:1f2d9982fa8c | 75 | { |
hudakz | 1:1f2d9982fa8c | 76 | uint16_t divider = 0; |
hudakz | 1:1f2d9982fa8c | 77 | |
hudakz | 1:1f2d9982fa8c | 78 | if (hz < 8000) { |
hudakz | 1:1f2d9982fa8c | 79 | divider = SPI_CLOCK_DIV65536; |
hudakz | 1:1f2d9982fa8c | 80 | } |
hudakz | 1:1f2d9982fa8c | 81 | else |
hudakz | 1:1f2d9982fa8c | 82 | if (hz < 15625) { |
hudakz | 1:1f2d9982fa8c | 83 | divider = SPI_CLOCK_DIV32768; |
hudakz | 1:1f2d9982fa8c | 84 | } |
hudakz | 1:1f2d9982fa8c | 85 | else |
hudakz | 1:1f2d9982fa8c | 86 | if (hz < 31250) { |
hudakz | 1:1f2d9982fa8c | 87 | divider = SPI_CLOCK_DIV16384; |
hudakz | 1:1f2d9982fa8c | 88 | } |
hudakz | 1:1f2d9982fa8c | 89 | else |
hudakz | 1:1f2d9982fa8c | 90 | if (hz < 62500) { |
hudakz | 1:1f2d9982fa8c | 91 | divider = SPI_CLOCK_DIV8192; |
hudakz | 1:1f2d9982fa8c | 92 | } |
hudakz | 1:1f2d9982fa8c | 93 | else |
hudakz | 1:1f2d9982fa8c | 94 | if (hz < 125000) { |
hudakz | 1:1f2d9982fa8c | 95 | divider = SPI_CLOCK_DIV4096; |
hudakz | 1:1f2d9982fa8c | 96 | } |
hudakz | 1:1f2d9982fa8c | 97 | else |
hudakz | 1:1f2d9982fa8c | 98 | if (hz < 250000) { |
hudakz | 1:1f2d9982fa8c | 99 | divider = SPI_CLOCK_DIV2048; |
hudakz | 1:1f2d9982fa8c | 100 | } |
hudakz | 1:1f2d9982fa8c | 101 | else |
hudakz | 1:1f2d9982fa8c | 102 | if (hz < 500000) { |
hudakz | 1:1f2d9982fa8c | 103 | divider = SPI_CLOCK_DIV1024; |
hudakz | 1:1f2d9982fa8c | 104 | } |
hudakz | 1:1f2d9982fa8c | 105 | else |
hudakz | 1:1f2d9982fa8c | 106 | if (hz < 1000000) { |
hudakz | 1:1f2d9982fa8c | 107 | divider = SPI_CLOCK_DIV512; |
hudakz | 1:1f2d9982fa8c | 108 | } |
hudakz | 1:1f2d9982fa8c | 109 | else |
hudakz | 1:1f2d9982fa8c | 110 | if (hz < 2000000) { |
hudakz | 1:1f2d9982fa8c | 111 | divider = SPI_CLOCK_DIV256; |
hudakz | 1:1f2d9982fa8c | 112 | } |
hudakz | 1:1f2d9982fa8c | 113 | else |
hudakz | 1:1f2d9982fa8c | 114 | if (hz < 4000000) { |
hudakz | 1:1f2d9982fa8c | 115 | divider = SPI_CLOCK_DIV128; |
hudakz | 1:1f2d9982fa8c | 116 | } |
hudakz | 1:1f2d9982fa8c | 117 | else |
hudakz | 1:1f2d9982fa8c | 118 | if (hz < 8000000) { |
hudakz | 1:1f2d9982fa8c | 119 | divider = SPI_CLOCK_DIV64; |
hudakz | 1:1f2d9982fa8c | 120 | } |
hudakz | 1:1f2d9982fa8c | 121 | else |
hudakz | 1:1f2d9982fa8c | 122 | if (hz < 20000000) { |
hudakz | 1:1f2d9982fa8c | 123 | divider = SPI_CLOCK_DIV32; |
hudakz | 1:1f2d9982fa8c | 124 | } |
hudakz | 1:1f2d9982fa8c | 125 | else |
hudakz | 1:1f2d9982fa8c | 126 | if (hz < 40000000) { |
hudakz | 1:1f2d9982fa8c | 127 | divider = SPI_CLOCK_DIV16; |
hudakz | 1:1f2d9982fa8c | 128 | } |
hudakz | 1:1f2d9982fa8c | 129 | else |
hudakz | 1:1f2d9982fa8c | 130 | if (hz < 80000000) { |
hudakz | 1:1f2d9982fa8c | 131 | divider = SPI_CLOCK_DIV8; |
hudakz | 1:1f2d9982fa8c | 132 | } |
hudakz | 1:1f2d9982fa8c | 133 | else |
hudakz | 1:1f2d9982fa8c | 134 | if (hz < 160000000) { |
hudakz | 1:1f2d9982fa8c | 135 | divider = SPI_CLOCK_DIV4; |
hudakz | 1:1f2d9982fa8c | 136 | } |
hudakz | 1:1f2d9982fa8c | 137 | else { |
hudakz | 1:1f2d9982fa8c | 138 | |
hudakz | 1:1f2d9982fa8c | 139 | // hz >= 160000000 |
hudakz | 1:1f2d9982fa8c | 140 | divider = SPI_CLOCK_DIV2; |
hudakz | 1:1f2d9982fa8c | 141 | } |
hudakz | 1:1f2d9982fa8c | 142 | |
hudakz | 1:1f2d9982fa8c | 143 | setClockDivider(divider); |
hudakz | 1:1f2d9982fa8c | 144 | } |
hudakz | 1:1f2d9982fa8c | 145 | |
hudakz | 1:1f2d9982fa8c | 146 | /** |
hudakz | 1:1f2d9982fa8c | 147 | * @brief |
hudakz | 1:1f2d9982fa8c | 148 | * @note |
hudakz | 1:1f2d9982fa8c | 149 | * @param |
hudakz | 1:1f2d9982fa8c | 150 | * @retval |
hudakz | 1:1f2d9982fa8c | 151 | */ |
hudakz | 1:1f2d9982fa8c | 152 | uint8_t SPI::write(uint8_t value) |
hudakz | 1:1f2d9982fa8c | 153 | { |
hudakz | 1:1f2d9982fa8c | 154 | volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS / 4; |
hudakz | 1:1f2d9982fa8c | 155 | volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO / 4; |
hudakz | 1:1f2d9982fa8c | 156 | |
hudakz | 1:1f2d9982fa8c | 157 | bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR); |
hudakz | 1:1f2d9982fa8c | 158 | |
hudakz | 1:1f2d9982fa8c | 159 | bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA); |
hudakz | 1:1f2d9982fa8c | 160 | |
hudakz | 1:1f2d9982fa8c | 161 | while (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD)) |
hudakz | 1:1f2d9982fa8c | 162 | wait_us(10); |
hudakz | 1:1f2d9982fa8c | 163 | |
hudakz | 1:1f2d9982fa8c | 164 | bcm2835_peri_write_nb(fifo, value); |
hudakz | 1:1f2d9982fa8c | 165 | |
hudakz | 1:1f2d9982fa8c | 166 | while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE)) |
hudakz | 1:1f2d9982fa8c | 167 | wait_us(10); |
hudakz | 1:1f2d9982fa8c | 168 | |
hudakz | 1:1f2d9982fa8c | 169 | uint32_t ret = bcm2835_peri_read_nb(fifo); |
hudakz | 1:1f2d9982fa8c | 170 | |
hudakz | 1:1f2d9982fa8c | 171 | bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA); |
hudakz | 1:1f2d9982fa8c | 172 | |
hudakz | 1:1f2d9982fa8c | 173 | return ret; |
hudakz | 1:1f2d9982fa8c | 174 | } |
hudakz | 1:1f2d9982fa8c | 175 | |
hudakz | 1:1f2d9982fa8c | 176 | /** |
hudakz | 1:1f2d9982fa8c | 177 | * @brief |
hudakz | 1:1f2d9982fa8c | 178 | * @note |
hudakz | 1:1f2d9982fa8c | 179 | * @param |
hudakz | 1:1f2d9982fa8c | 180 | * @retval |
hudakz | 1:1f2d9982fa8c | 181 | */ |
hudakz | 1:1f2d9982fa8c | 182 | int SPI::write(const char* tx_buffer, int tx_length, char* rx_buffer, int rx_length) |
hudakz | 1:1f2d9982fa8c | 183 | { |
hudakz | 1:1f2d9982fa8c | 184 | int len = tx_length; |
hudakz | 1:1f2d9982fa8c | 185 | if (rx_length > len) |
hudakz | 1:1f2d9982fa8c | 186 | len = rx_length; |
hudakz | 1:1f2d9982fa8c | 187 | |
hudakz | 1:1f2d9982fa8c | 188 | volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS / 4; |
hudakz | 1:1f2d9982fa8c | 189 | volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO / 4; |
hudakz | 1:1f2d9982fa8c | 190 | |
hudakz | 1:1f2d9982fa8c | 191 | // This is Polled transfer as per section 10.6.1 |
hudakz | 1:1f2d9982fa8c | 192 | |
hudakz | 1:1f2d9982fa8c | 193 | // BUG ALERT: what happens if we get interupted in this section, and someone else |
hudakz | 1:1f2d9982fa8c | 194 | // accesses a different peripheral? |
hudakz | 1:1f2d9982fa8c | 195 | // Clear TX and RX fifos |
hudakz | 1:1f2d9982fa8c | 196 | bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR); |
hudakz | 1:1f2d9982fa8c | 197 | |
hudakz | 1:1f2d9982fa8c | 198 | // Set TA = 1 |
hudakz | 1:1f2d9982fa8c | 199 | bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA); |
hudakz | 1:1f2d9982fa8c | 200 | |
hudakz | 1:1f2d9982fa8c | 201 | int i; |
hudakz | 1:1f2d9982fa8c | 202 | for (i = 0; i < len; i++) { |
hudakz | 1:1f2d9982fa8c | 203 | |
hudakz | 1:1f2d9982fa8c | 204 | // Maybe wait for TXD |
hudakz | 1:1f2d9982fa8c | 205 | while (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD)) |
hudakz | 1:1f2d9982fa8c | 206 | wait_us(10); |
hudakz | 1:1f2d9982fa8c | 207 | |
hudakz | 1:1f2d9982fa8c | 208 | // Write to FIFO, no barrier |
hudakz | 1:1f2d9982fa8c | 209 | if (i < tx_length) |
hudakz | 1:1f2d9982fa8c | 210 | bcm2835_peri_write_nb(fifo, tx_buffer[i]); |
hudakz | 1:1f2d9982fa8c | 211 | else |
hudakz | 1:1f2d9982fa8c | 212 | bcm2835_peri_write_nb(fifo, _write_fill); |
hudakz | 1:1f2d9982fa8c | 213 | |
hudakz | 1:1f2d9982fa8c | 214 | // Wait for RXD |
hudakz | 1:1f2d9982fa8c | 215 | while (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_RXD)) |
hudakz | 1:1f2d9982fa8c | 216 | wait_us(10); |
hudakz | 1:1f2d9982fa8c | 217 | |
hudakz | 1:1f2d9982fa8c | 218 | // then read the data byte |
hudakz | 1:1f2d9982fa8c | 219 | if (i < rx_length) |
hudakz | 1:1f2d9982fa8c | 220 | rx_buffer[i] = bcm2835_peri_read_nb(fifo); |
hudakz | 1:1f2d9982fa8c | 221 | else |
hudakz | 1:1f2d9982fa8c | 222 | bcm2835_peri_read_nb(fifo); |
hudakz | 1:1f2d9982fa8c | 223 | } |
hudakz | 1:1f2d9982fa8c | 224 | |
hudakz | 1:1f2d9982fa8c | 225 | // Wait for DONE to be set |
hudakz | 1:1f2d9982fa8c | 226 | while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE)) |
hudakz | 1:1f2d9982fa8c | 227 | wait_us(10); |
hudakz | 1:1f2d9982fa8c | 228 | |
hudakz | 1:1f2d9982fa8c | 229 | // Set TA = 0, and also set the barrier |
hudakz | 1:1f2d9982fa8c | 230 | bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA); |
hudakz | 1:1f2d9982fa8c | 231 | |
hudakz | 1:1f2d9982fa8c | 232 | return len; |
hudakz | 1:1f2d9982fa8c | 233 | } |
hudakz | 1:1f2d9982fa8c | 234 | |
hudakz | 1:1f2d9982fa8c | 235 | /** |
hudakz | 1:1f2d9982fa8c | 236 | * @brief |
hudakz | 1:1f2d9982fa8c | 237 | * @note |
hudakz | 1:1f2d9982fa8c | 238 | * @param |
hudakz | 1:1f2d9982fa8c | 239 | * @retval |
hudakz | 1:1f2d9982fa8c | 240 | */ |
hudakz | 1:1f2d9982fa8c | 241 | void SPI::set_default_write_value(char value) |
hudakz | 1:1f2d9982fa8c | 242 | { |
hudakz | 1:1f2d9982fa8c | 243 | _write_fill = value; |
hudakz | 1:1f2d9982fa8c | 244 | } |
hudakz | 1:1f2d9982fa8c | 245 | |
hudakz | 1:1f2d9982fa8c | 246 | /** |
hudakz | 1:1f2d9982fa8c | 247 | * @brief |
hudakz | 1:1f2d9982fa8c | 248 | * @note The divisor must be a power of 2. Odd numbers rounded down. |
hudakz | 1:1f2d9982fa8c | 249 | * The maximum SPI clock rate is of the APB clock. |
hudakz | 1:1f2d9982fa8c | 250 | * @param divider Defaults to 0, which means a divider of 65536. |
hudakz | 1:1f2d9982fa8c | 251 | * @retval |
hudakz | 1:1f2d9982fa8c | 252 | */ |
hudakz | 1:1f2d9982fa8c | 253 | void SPI::setClockDivider(uint16_t divider) |
hudakz | 1:1f2d9982fa8c | 254 | { |
hudakz | 1:1f2d9982fa8c | 255 | volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CLK / 4; |
hudakz | 1:1f2d9982fa8c | 256 | bcm2835_peri_write(paddr, divider); |
hudakz | 1:1f2d9982fa8c | 257 | } |
hudakz | 1:1f2d9982fa8c | 258 | |
hudakz | 1:1f2d9982fa8c | 259 |