motion library for mpu6050, mpu9250 and etc, supports i2c and spi

Committer:
yihui
Date:
Tue Jul 05 07:19:59 2016 +0000
Revision:
0:814475fdc553
initial

Who changed what in which revision?

UserRevisionLine numberNew 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 }