motion library for mpu6050, mpu9250 and etc, supports i2c and spi
mbed_spi.c@0:814475fdc553, 2016-07-05 (annotated)
- Committer:
- yihui
- Date:
- Tue Jul 05 07:19:59 2016 +0000
- Revision:
- 0:814475fdc553
initial
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yihui | 0:814475fdc553 | 1 | |
yihui | 0:814475fdc553 | 2 | #include <stdio.h> |
yihui | 0:814475fdc553 | 3 | #include "spi_api.h" |
yihui | 0:814475fdc553 | 4 | #include "gpio_api.h" |
yihui | 0:814475fdc553 | 5 | |
yihui | 0:814475fdc553 | 6 | #ifdef TARGET_MCU_NRF51822 |
yihui | 0:814475fdc553 | 7 | #include "nrf51.h" |
yihui | 0:814475fdc553 | 8 | static PinName mbed_spi_mosi; |
yihui | 0:814475fdc553 | 9 | static PinName mbed_spi_miso; |
yihui | 0:814475fdc553 | 10 | static PinName mbed_spi_sclk; |
yihui | 0:814475fdc553 | 11 | static PinName mbed_spi_cs; |
yihui | 0:814475fdc553 | 12 | static uint32_t mbed_spi_mosi_cnf; |
yihui | 0:814475fdc553 | 13 | static uint32_t mbed_spi_miso_cnf; |
yihui | 0:814475fdc553 | 14 | static uint32_t mbed_spi_sclk_cnf; |
yihui | 0:814475fdc553 | 15 | static uint32_t mbed_spi_cs_cnf; |
yihui | 0:814475fdc553 | 16 | #endif |
yihui | 0:814475fdc553 | 17 | |
yihui | 0:814475fdc553 | 18 | static spi_t mbed_spi_object; |
yihui | 0:814475fdc553 | 19 | static gpio_t mbed_cs_object; |
yihui | 0:814475fdc553 | 20 | |
yihui | 0:814475fdc553 | 21 | |
yihui | 0:814475fdc553 | 22 | |
yihui | 0:814475fdc553 | 23 | void mbed_spi_init(PinName mosi, PinName miso, PinName sclk, PinName cs) |
yihui | 0:814475fdc553 | 24 | { |
yihui | 0:814475fdc553 | 25 | spi_init(&mbed_spi_object, mosi, miso, sclk, NC); |
yihui | 0:814475fdc553 | 26 | spi_format(&mbed_spi_object, 8, 0, 0); |
yihui | 0:814475fdc553 | 27 | spi_frequency(&mbed_spi_object, 1000000); |
yihui | 0:814475fdc553 | 28 | |
yihui | 0:814475fdc553 | 29 | gpio_init_out(&mbed_cs_object, cs); |
yihui | 0:814475fdc553 | 30 | gpio_write(&mbed_cs_object, 1); |
yihui | 0:814475fdc553 | 31 | |
yihui | 0:814475fdc553 | 32 | #ifdef TARGET_MCU_NRF51822 |
yihui | 0:814475fdc553 | 33 | mbed_spi_mosi = mosi; |
yihui | 0:814475fdc553 | 34 | mbed_spi_miso = miso; |
yihui | 0:814475fdc553 | 35 | mbed_spi_sclk = sclk; |
yihui | 0:814475fdc553 | 36 | mbed_spi_cs = cs; |
yihui | 0:814475fdc553 | 37 | |
yihui | 0:814475fdc553 | 38 | mbed_spi_mosi_cnf = NRF_GPIO->PIN_CNF[mosi]; |
yihui | 0:814475fdc553 | 39 | mbed_spi_miso_cnf = NRF_GPIO->PIN_CNF[miso]; |
yihui | 0:814475fdc553 | 40 | mbed_spi_sclk_cnf = NRF_GPIO->PIN_CNF[sclk]; |
yihui | 0:814475fdc553 | 41 | mbed_spi_cs_cnf = NRF_GPIO->PIN_CNF[cs]; |
yihui | 0:814475fdc553 | 42 | #endif |
yihui | 0:814475fdc553 | 43 | } |
yihui | 0:814475fdc553 | 44 | |
yihui | 0:814475fdc553 | 45 | int mbed_spi_write(unsigned char reg_addr, |
yihui | 0:814475fdc553 | 46 | unsigned char length, |
yihui | 0:814475fdc553 | 47 | unsigned char const *data) |
yihui | 0:814475fdc553 | 48 | { |
yihui | 0:814475fdc553 | 49 | int i; |
yihui | 0:814475fdc553 | 50 | |
yihui | 0:814475fdc553 | 51 | gpio_write(&mbed_cs_object, 0); |
yihui | 0:814475fdc553 | 52 | spi_master_write(&mbed_spi_object, reg_addr); |
yihui | 0:814475fdc553 | 53 | for (i = 0; i < length; i++) { |
yihui | 0:814475fdc553 | 54 | spi_master_write(&mbed_spi_object, data[i]); |
yihui | 0:814475fdc553 | 55 | } |
yihui | 0:814475fdc553 | 56 | gpio_write(&mbed_cs_object, 1); |
yihui | 0:814475fdc553 | 57 | return 0; |
yihui | 0:814475fdc553 | 58 | } |
yihui | 0:814475fdc553 | 59 | |
yihui | 0:814475fdc553 | 60 | int mbed_spi_read(unsigned char reg_addr, |
yihui | 0:814475fdc553 | 61 | unsigned char length, |
yihui | 0:814475fdc553 | 62 | unsigned char *data) |
yihui | 0:814475fdc553 | 63 | { |
yihui | 0:814475fdc553 | 64 | int i; |
yihui | 0:814475fdc553 | 65 | |
yihui | 0:814475fdc553 | 66 | gpio_write(&mbed_cs_object, 0); |
yihui | 0:814475fdc553 | 67 | spi_master_write(&mbed_spi_object, reg_addr | 0x80); |
yihui | 0:814475fdc553 | 68 | for (i = 0; i < length; i++) { |
yihui | 0:814475fdc553 | 69 | data[i] = spi_master_write(&mbed_spi_object, 0xff); |
yihui | 0:814475fdc553 | 70 | } |
yihui | 0:814475fdc553 | 71 | |
yihui | 0:814475fdc553 | 72 | gpio_write(&mbed_cs_object, 1); |
yihui | 0:814475fdc553 | 73 | return 0; |
yihui | 0:814475fdc553 | 74 | } |
yihui | 0:814475fdc553 | 75 | |
yihui | 0:814475fdc553 | 76 | void mbed_spi_enable(void) |
yihui | 0:814475fdc553 | 77 | { |
yihui | 0:814475fdc553 | 78 | #if defined(TARGET_MCU_NRF51822) && !defined(DEBUG) |
yihui | 0:814475fdc553 | 79 | // NRF_GPIO->PIN_CNF[mbed_spi_mosi] = mbed_spi_mosi_cnf; |
yihui | 0:814475fdc553 | 80 | // NRF_GPIO->PIN_CNF[mbed_spi_miso] = mbed_spi_miso_cnf; |
yihui | 0:814475fdc553 | 81 | // NRF_GPIO->PIN_CNF[mbed_spi_sclk] = mbed_spi_sclk_cnf; |
yihui | 0:814475fdc553 | 82 | // NRF_GPIO->PIN_CNF[mbed_spi_cs] = mbed_spi_cs_cnf; |
yihui | 0:814475fdc553 | 83 | |
yihui | 0:814475fdc553 | 84 | mbed_spi_object.spi->ENABLE = 1; |
yihui | 0:814475fdc553 | 85 | #endif |
yihui | 0:814475fdc553 | 86 | } |
yihui | 0:814475fdc553 | 87 | |
yihui | 0:814475fdc553 | 88 | void mbed_spi_disable(void) |
yihui | 0:814475fdc553 | 89 | { |
yihui | 0:814475fdc553 | 90 | #if defined(TARGET_MCU_NRF51822) && !defined(DEBUG) |
yihui | 0:814475fdc553 | 91 | mbed_spi_mosi_cnf = NRF_GPIO->PIN_CNF[mbed_spi_mosi]; |
yihui | 0:814475fdc553 | 92 | mbed_spi_miso_cnf = NRF_GPIO->PIN_CNF[mbed_spi_miso]; |
yihui | 0:814475fdc553 | 93 | mbed_spi_sclk_cnf = NRF_GPIO->PIN_CNF[mbed_spi_sclk]; |
yihui | 0:814475fdc553 | 94 | mbed_spi_cs_cnf = NRF_GPIO->PIN_CNF[mbed_spi_cs]; |
yihui | 0:814475fdc553 | 95 | |
yihui | 0:814475fdc553 | 96 | mbed_spi_object.spi->ENABLE = 0; |
yihui | 0:814475fdc553 | 97 | |
yihui | 0:814475fdc553 | 98 | // NRF_GPIO->PIN_CNF[mbed_spi_mosi] = 2; |
yihui | 0:814475fdc553 | 99 | // NRF_GPIO->PIN_CNF[mbed_spi_miso] = 2; |
yihui | 0:814475fdc553 | 100 | // NRF_GPIO->PIN_CNF[mbed_spi_sclk] = 2; |
yihui | 0:814475fdc553 | 101 | // NRF_GPIO->PIN_CNF[mbed_spi_cs] = 2; |
yihui | 0:814475fdc553 | 102 | #endif |
yihui | 0:814475fdc553 | 103 | } |