ADXL375をspiで使えるようにしたライブラリ
Dependents: Stability_seed2019_v2
ADXL375_spi.cpp@0:6bf9c1ce7bdc, 2020-03-17 (annotated)
- Committer:
- Sigma884
- Date:
- Tue Mar 17 12:30:36 2020 +0000
- Revision:
- 0:6bf9c1ce7bdc
commit for publish stability_seed2019_v1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sigma884 | 0:6bf9c1ce7bdc | 1 | #include "ADXL375_spi.h" |
Sigma884 | 0:6bf9c1ce7bdc | 2 | |
Sigma884 | 0:6bf9c1ce7bdc | 3 | ADXL375_spi :: ADXL375_spi(SPI &userSPI, PinName userPIN) : cs(userPIN){ |
Sigma884 | 0:6bf9c1ce7bdc | 4 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 5 | if(LOW_HIGH == ALT_ADDRESS_LOW){ |
Sigma884 | 0:6bf9c1ce7bdc | 6 | ADXL375_I2C_READ = ADXL375_I2C_LOW_READ; |
Sigma884 | 0:6bf9c1ce7bdc | 7 | ADXL375_I2C_WRITE = ADXL375_I2C_LOW_WRITE; |
Sigma884 | 0:6bf9c1ce7bdc | 8 | ADXL375_I2C_ADDRESS = ADXL375_I2C_LOW_ADDRESS; |
Sigma884 | 0:6bf9c1ce7bdc | 9 | } |
Sigma884 | 0:6bf9c1ce7bdc | 10 | else if(LOW_HIGH == ALT_ADDRESS_HIGH){ |
Sigma884 | 0:6bf9c1ce7bdc | 11 | ADXL375_I2C_READ = ADXL375_I2C_HIGH_READ; |
Sigma884 | 0:6bf9c1ce7bdc | 12 | ADXL375_I2C_WRITE = ADXL375_I2C_HIGH_WRITE; |
Sigma884 | 0:6bf9c1ce7bdc | 13 | ADXL375_I2C_ADDRESS = ADXL375_I2C_HIGH_ADDRESS; |
Sigma884 | 0:6bf9c1ce7bdc | 14 | } |
Sigma884 | 0:6bf9c1ce7bdc | 15 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 16 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 17 | i2c = &userI2C; |
Sigma884 | 0:6bf9c1ce7bdc | 18 | i2c -> frequency(400000); |
Sigma884 | 0:6bf9c1ce7bdc | 19 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 20 | spi = &userSPI; |
Sigma884 | 0:6bf9c1ce7bdc | 21 | |
Sigma884 | 0:6bf9c1ce7bdc | 22 | spi -> format(8, 3); |
Sigma884 | 0:6bf9c1ce7bdc | 23 | spi -> frequency(5000000); |
Sigma884 | 0:6bf9c1ce7bdc | 24 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 25 | spi -> write(0x00); |
Sigma884 | 0:6bf9c1ce7bdc | 26 | spi -> write(0x00); |
Sigma884 | 0:6bf9c1ce7bdc | 27 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 28 | |
Sigma884 | 0:6bf9c1ce7bdc | 29 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 30 | char tx[2]; |
Sigma884 | 0:6bf9c1ce7bdc | 31 | tx[0] = ADXL375_BW_RATE_REG; |
Sigma884 | 0:6bf9c1ce7bdc | 32 | tx[1] = ADXL375_3200HZ; |
Sigma884 | 0:6bf9c1ce7bdc | 33 | i2c -> write(ADXL375_I2C_WRITE, tx, 2); |
Sigma884 | 0:6bf9c1ce7bdc | 34 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 35 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 36 | spi -> write(ADXL375_BW_RATE_REG & 0x3F); |
Sigma884 | 0:6bf9c1ce7bdc | 37 | spi -> write(ADXL375_3200HZ); |
Sigma884 | 0:6bf9c1ce7bdc | 38 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 39 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 40 | char rx[2]; |
Sigma884 | 0:6bf9c1ce7bdc | 41 | rx[0] = ADXL375_DATA_FORMAT_REG; |
Sigma884 | 0:6bf9c1ce7bdc | 42 | rx[1] = 0x0B; |
Sigma884 | 0:6bf9c1ce7bdc | 43 | i2c -> write(ADXL375_I2C_WRITE, rx, 2); |
Sigma884 | 0:6bf9c1ce7bdc | 44 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 45 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 46 | spi -> write(ADXL375_DATA_FORMAT_REG & 0x3F); |
Sigma884 | 0:6bf9c1ce7bdc | 47 | spi -> write(0x0B); |
Sigma884 | 0:6bf9c1ce7bdc | 48 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 49 | |
Sigma884 | 0:6bf9c1ce7bdc | 50 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 51 | char x[2]; |
Sigma884 | 0:6bf9c1ce7bdc | 52 | x[0] = ADXL375_OFSX_REG ; |
Sigma884 | 0:6bf9c1ce7bdc | 53 | x[1] = 0xFE; |
Sigma884 | 0:6bf9c1ce7bdc | 54 | i2c -> write(ADXL375_I2C_WRITE, x, 2); |
Sigma884 | 0:6bf9c1ce7bdc | 55 | char y[2]; |
Sigma884 | 0:6bf9c1ce7bdc | 56 | y[0] = ADXL375_OFSY_REG ; |
Sigma884 | 0:6bf9c1ce7bdc | 57 | y[1] = 0xFE; |
Sigma884 | 0:6bf9c1ce7bdc | 58 | i2c -> write(ADXL375_I2C_WRITE, y, 2); |
Sigma884 | 0:6bf9c1ce7bdc | 59 | char z[2]; |
Sigma884 | 0:6bf9c1ce7bdc | 60 | z[0] = ADXL375_OFSZ_REG ; |
Sigma884 | 0:6bf9c1ce7bdc | 61 | z[1] = 0x00; |
Sigma884 | 0:6bf9c1ce7bdc | 62 | i2c -> write(ADXL375_I2C_WRITE, z, 2); |
Sigma884 | 0:6bf9c1ce7bdc | 63 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 64 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 65 | spi -> write(ADXL375_OFSX_REG & 0x3F); |
Sigma884 | 0:6bf9c1ce7bdc | 66 | spi -> write(0xFE); |
Sigma884 | 0:6bf9c1ce7bdc | 67 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 68 | |
Sigma884 | 0:6bf9c1ce7bdc | 69 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 70 | spi -> write(ADXL375_OFSY_REG & 0x3F); |
Sigma884 | 0:6bf9c1ce7bdc | 71 | spi -> write(0xFE); |
Sigma884 | 0:6bf9c1ce7bdc | 72 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 73 | |
Sigma884 | 0:6bf9c1ce7bdc | 74 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 75 | spi -> write(ADXL375_OFSZ_REG & 0x3F); |
Sigma884 | 0:6bf9c1ce7bdc | 76 | spi -> write(0x00); |
Sigma884 | 0:6bf9c1ce7bdc | 77 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 78 | |
Sigma884 | 0:6bf9c1ce7bdc | 79 | singleByteWrite(ADXL375_POWER_CTL_REG, 0x08); |
Sigma884 | 0:6bf9c1ce7bdc | 80 | |
Sigma884 | 0:6bf9c1ce7bdc | 81 | offset_x = offset_y = offset_z = 0.0f; |
Sigma884 | 0:6bf9c1ce7bdc | 82 | |
Sigma884 | 0:6bf9c1ce7bdc | 83 | } |
Sigma884 | 0:6bf9c1ce7bdc | 84 | |
Sigma884 | 0:6bf9c1ce7bdc | 85 | char ADXL375_spi :: singleByteRead(char address){ |
Sigma884 | 0:6bf9c1ce7bdc | 86 | //char tx = address; |
Sigma884 | 0:6bf9c1ce7bdc | 87 | char output; |
Sigma884 | 0:6bf9c1ce7bdc | 88 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 89 | i2c -> write(ADXL375_I2C_WRITE, &tx, 1); |
Sigma884 | 0:6bf9c1ce7bdc | 90 | i2c -> read(ADXL375_I2C_READ, &output, 1); |
Sigma884 | 0:6bf9c1ce7bdc | 91 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 92 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 93 | spi -> write(address | 0x80 & 0xBF); |
Sigma884 | 0:6bf9c1ce7bdc | 94 | output = spi -> write(0x00); |
Sigma884 | 0:6bf9c1ce7bdc | 95 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 96 | |
Sigma884 | 0:6bf9c1ce7bdc | 97 | return output; |
Sigma884 | 0:6bf9c1ce7bdc | 98 | } |
Sigma884 | 0:6bf9c1ce7bdc | 99 | |
Sigma884 | 0:6bf9c1ce7bdc | 100 | void ADXL375_spi :: singleByteWrite(char address, char data){ |
Sigma884 | 0:6bf9c1ce7bdc | 101 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 102 | char tx[2]; |
Sigma884 | 0:6bf9c1ce7bdc | 103 | tx[0] = address; |
Sigma884 | 0:6bf9c1ce7bdc | 104 | tx[1] = data; |
Sigma884 | 0:6bf9c1ce7bdc | 105 | i2c -> write(ADXL375_I2C_WRITE, tx, 2); |
Sigma884 | 0:6bf9c1ce7bdc | 106 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 107 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 108 | spi -> write(address & 0x3F); |
Sigma884 | 0:6bf9c1ce7bdc | 109 | spi -> write(data); |
Sigma884 | 0:6bf9c1ce7bdc | 110 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 111 | } |
Sigma884 | 0:6bf9c1ce7bdc | 112 | |
Sigma884 | 0:6bf9c1ce7bdc | 113 | void ADXL375_spi :: multiByteRead(char address, char* output, int size){ |
Sigma884 | 0:6bf9c1ce7bdc | 114 | /* |
Sigma884 | 0:6bf9c1ce7bdc | 115 | i2c -> write(ADXL375_I2C_WRITE, &address, 1); |
Sigma884 | 0:6bf9c1ce7bdc | 116 | i2c -> read(ADXL375_I2C_READ, output, size); |
Sigma884 | 0:6bf9c1ce7bdc | 117 | */ |
Sigma884 | 0:6bf9c1ce7bdc | 118 | cs = 0; |
Sigma884 | 0:6bf9c1ce7bdc | 119 | spi -> write(address | 0xC0); |
Sigma884 | 0:6bf9c1ce7bdc | 120 | for(int i = 0; i < size; i ++){ |
Sigma884 | 0:6bf9c1ce7bdc | 121 | output[i] = spi -> write(0x00); |
Sigma884 | 0:6bf9c1ce7bdc | 122 | } |
Sigma884 | 0:6bf9c1ce7bdc | 123 | cs = 1; |
Sigma884 | 0:6bf9c1ce7bdc | 124 | } |
Sigma884 | 0:6bf9c1ce7bdc | 125 | |
Sigma884 | 0:6bf9c1ce7bdc | 126 | void ADXL375_spi :: getOutput(float* output){ |
Sigma884 | 0:6bf9c1ce7bdc | 127 | char buffer[6]; |
Sigma884 | 0:6bf9c1ce7bdc | 128 | short int data[3]; |
Sigma884 | 0:6bf9c1ce7bdc | 129 | multiByteRead(ADXL375_DATAX0_REG, buffer, 6); |
Sigma884 | 0:6bf9c1ce7bdc | 130 | data[0] = (int)buffer[1] << 8 | (int)buffer[0]; |
Sigma884 | 0:6bf9c1ce7bdc | 131 | data[1] = (int)buffer[3] << 8 | (int)buffer[2]; |
Sigma884 | 0:6bf9c1ce7bdc | 132 | data[2] = (int)buffer[5] << 8 | (int)buffer[4]; |
Sigma884 | 0:6bf9c1ce7bdc | 133 | |
Sigma884 | 0:6bf9c1ce7bdc | 134 | output[0] = (float)data[0] / 20.0f - offset_x; |
Sigma884 | 0:6bf9c1ce7bdc | 135 | output[1] = (float)data[1] / 20.0f - offset_y; |
Sigma884 | 0:6bf9c1ce7bdc | 136 | output[2] = (float)data[2] / 20.0f - offset_z; |
Sigma884 | 0:6bf9c1ce7bdc | 137 | } |
Sigma884 | 0:6bf9c1ce7bdc | 138 | |
Sigma884 | 0:6bf9c1ce7bdc | 139 | int ADXL375_spi :: whoAmI(){ |
Sigma884 | 0:6bf9c1ce7bdc | 140 | char who_am_i = singleByteRead(ADXL375_DEVID_REG); |
Sigma884 | 0:6bf9c1ce7bdc | 141 | if(who_am_i == 0xE5){ |
Sigma884 | 0:6bf9c1ce7bdc | 142 | return 1; |
Sigma884 | 0:6bf9c1ce7bdc | 143 | } |
Sigma884 | 0:6bf9c1ce7bdc | 144 | else{ |
Sigma884 | 0:6bf9c1ce7bdc | 145 | return -1; |
Sigma884 | 0:6bf9c1ce7bdc | 146 | } |
Sigma884 | 0:6bf9c1ce7bdc | 147 | } |
Sigma884 | 0:6bf9c1ce7bdc | 148 | |
Sigma884 | 0:6bf9c1ce7bdc | 149 | void ADXL375_spi :: offset(float x, float y, float z){ |
Sigma884 | 0:6bf9c1ce7bdc | 150 | offset_x = x; |
Sigma884 | 0:6bf9c1ce7bdc | 151 | offset_y = y; |
Sigma884 | 0:6bf9c1ce7bdc | 152 | offset_z = z; |
Sigma884 | 0:6bf9c1ce7bdc | 153 | } |
Sigma884 | 0:6bf9c1ce7bdc | 154 | |
Sigma884 | 0:6bf9c1ce7bdc | 155 | void ADXL375_spi :: setDataRate(char rate){ |
Sigma884 | 0:6bf9c1ce7bdc | 156 | char buff = singleByteRead(ADXL375_BW_RATE_REG); |
Sigma884 | 0:6bf9c1ce7bdc | 157 | buff &= 0x10; |
Sigma884 | 0:6bf9c1ce7bdc | 158 | buff |= rate; |
Sigma884 | 0:6bf9c1ce7bdc | 159 | singleByteWrite(ADXL375_BW_RATE_REG, buff); |
Sigma884 | 0:6bf9c1ce7bdc | 160 | } |