1+
2+ #include " AEAT8800Q24.h"
3+
4+
5+ AEAT8800Q24::AEAT8800Q24 (int nCS, int pinNSL, SPISettings spiSettings, SPISettings ssiSettings) : nCS(nCS), pinNSL(pinNSL), spiSettings(spiSettings), ssiSettings(ssiSettings) {
6+ };
7+ AEAT8800Q24::~AEAT8800Q24 (){
8+ };
9+
10+ void AEAT8800Q24::init (SPIClass* _spi){
11+ spi = _spi;
12+ spi->beginTransaction (ssiSettings);
13+ };
14+
15+
16+ float AEAT8800Q24::getCurrentAngle () {
17+ return ((float )readRawAngle ())/(float )AEAT8800Q24_CPR * 2 .0f * (float )PI;
18+ }; // angle in radians, return current value
19+
20+
21+ // reads angle via ssi
22+ uint16_t AEAT8800Q24::readRawAngle () {
23+ // digitalWrite(pinNSL, LOW); //TODO maybe we don't need it...
24+ // // 300ns delay
25+ // delayMicroseconds(1);
26+ uint16_t value = spi->transfer16 (0x0000 );
27+ uint8_t status = spi->transfer (0x00 );
28+ // digitalWrite(pinNSL, HIGH);
29+ // // 200ns delay before next read...
30+ // delayMicroseconds(1);
31+ lastStatus.reg = status;
32+ return value;
33+ };
34+
35+ AEAT8800Q24_Status_t AEAT8800Q24::getLastStatus () {
36+ return lastStatus;
37+ }
38+
39+ uint16_t AEAT8800Q24::getZero (){
40+ uint8_t value = readRegister (AEAT8800Q24_REG_ZERO_MSB);
41+ return (value<<8 )|readRegister (AEAT8800Q24_REG_ZERO_LSB);
42+ };
43+ void AEAT8800Q24::setZero (uint16_t value){
44+ writeRegister (AEAT8800Q24_REG_ZERO_MSB, (value>>8 )&0xFF );
45+ writeRegister (AEAT8800Q24_REG_ZERO_LSB, value&0xFF );
46+ };
47+
48+ AEAT8800Q24_CONF0_t AEAT8800Q24::getConf0 (){
49+ AEAT8800Q24_CONF0_t result;
50+ result.reg = readRegister (AEAT8800Q24_REG_CONF0);
51+ return result;
52+ };
53+ void AEAT8800Q24::setConf0 (AEAT8800Q24_CONF0_t value){
54+ writeRegister (AEAT8800Q24_REG_CONF0, value.reg );
55+ };
56+
57+ AEAT8800Q24_CONF1_t AEAT8800Q24::getConf1 (){
58+ AEAT8800Q24_CONF1_t result;
59+ result.reg = readRegister (AEAT8800Q24_REG_CONF1);
60+ return result;
61+ };
62+ void AEAT8800Q24::setConf1 (AEAT8800Q24_CONF1_t value){
63+ writeRegister (AEAT8800Q24_REG_CONF1, value.reg );
64+ };
65+
66+ AEAT8800Q24_CONF2_t AEAT8800Q24::getConf2 (){
67+ AEAT8800Q24_CONF2_t result;
68+ result.reg = readRegister (AEAT8800Q24_REG_CONF2);
69+ return result;
70+ };
71+ void AEAT8800Q24::setConf2 (AEAT8800Q24_CONF2_t value){
72+ writeRegister (AEAT8800Q24_REG_CONF2, value.reg );
73+ };
74+
75+
76+
77+
78+ uint16_t AEAT8800Q24::transfer16SPI (uint16_t outValue) {
79+ // delay 1us between switching the CS line to SPI
80+ delayMicroseconds (1 );
81+ if (nCS >= 0 )
82+ digitalWrite (nCS, LOW);
83+ spi->endTransaction ();
84+ spi->beginTransaction (spiSettings);
85+ uint16_t value = spi->transfer16 (outValue);
86+ spi->endTransaction ();
87+ if (nCS >= 0 )
88+ digitalWrite (nCS, HIGH);
89+ // delay 1us between switching the CS line to SSI
90+ delayMicroseconds (1 );
91+ spi->beginTransaction (ssiSettings);
92+ return value;
93+ };
94+ uint8_t AEAT8800Q24::readRegister (uint8_t reg) {
95+ uint16_t cmd = 0x8000 | ((reg&0x001F )<<8 );
96+ uint16_t value = transfer16SPI (cmd);
97+ return value&0x00FF ;
98+ };
99+ void AEAT8800Q24::writeRegister (uint8_t reg, uint8_t value) {
100+ uint16_t cmd = 0x4000 | ((reg&0x1F )<<8 ) | value;
101+ uint16_t result = transfer16SPI (cmd);
102+ };
0 commit comments