@@ -12,66 +12,42 @@ arduino::ZephyrSPI::ZephyrSPI(const struct device *spi) : spi_dev(spi) {
12
12
}
13
13
14
14
uint8_t arduino::ZephyrSPI::transfer (uint8_t data) {
15
- int ret;
16
- uint8_t rx;
17
- const struct spi_buf tx_buf = {.buf = &data, .len = sizeof (data)};
18
- const struct spi_buf_set tx_buf_set = {
19
- .buffers = &tx_buf,
20
- .count = 1 ,
21
- };
22
- const struct spi_buf rx_buf = {.buf = &rx, .len = sizeof (rx)};
23
- const struct spi_buf_set rx_buf_set = {
24
- .buffers = &rx_buf,
25
- .count = 1 ,
26
- };
27
-
28
- ret = spi_transceive (spi_dev, &config, &tx_buf_set, &rx_buf_set);
29
- if (ret < 0 ) {
15
+ uint8_t rx = data;
16
+ if (transfer (&rx, sizeof (rx), &config) < 0 ) {
30
17
return 0 ;
31
18
}
32
-
33
19
return rx;
34
20
}
35
21
36
22
uint16_t arduino::ZephyrSPI::transfer16 (uint16_t data) {
37
- int ret;
38
- uint16_t rx;
39
- const struct spi_buf tx_buf = {.buf = &data, .len = sizeof (data)};
40
- const struct spi_buf_set tx_buf_set = {
41
- .buffers = &tx_buf,
42
- .count = 1 ,
43
- };
44
- const struct spi_buf rx_buf = {.buf = &rx, .len = sizeof (rx)};
45
- const struct spi_buf_set rx_buf_set = {
46
- .buffers = &rx_buf,
47
- .count = 1 ,
48
- };
49
-
50
- ret = spi_transceive (spi_dev, &config16, &tx_buf_set, &rx_buf_set);
51
- if (ret < 0 ) {
23
+ uint16_t rx = data;
24
+ if (transfer (&rx, sizeof (rx), &config16) < 0 ) {
52
25
return 0 ;
53
26
}
54
-
55
27
return rx;
56
28
}
57
29
58
30
void arduino::ZephyrSPI::transfer (void *buf, size_t count) {
31
+ int ret = transfer (buf, count, &config);
32
+ (void )ret;
33
+ }
34
+
35
+ int arduino::ZephyrSPI::transfer (void *buf, size_t len, const struct spi_config *config) {
59
36
int ret;
60
- const struct spi_buf tx_buf = {.buf = buf, .len = count};
37
+
38
+ const struct spi_buf tx_buf = {.buf = buf, .len = len};
61
39
const struct spi_buf_set tx_buf_set = {
62
40
.buffers = &tx_buf,
63
41
.count = 1 ,
64
42
};
65
43
66
- uint8_t rx[count];
67
- const struct spi_buf rx_buf = {.buf = &rx, .len = count};
44
+ const struct spi_buf rx_buf = {.buf = buf, .len = len};
68
45
const struct spi_buf_set rx_buf_set = {
69
46
.buffers = &rx_buf,
70
47
.count = 1 ,
71
48
};
72
49
73
- spi_transceive (spi_dev, &config, &tx_buf_set, &rx_buf_set);
74
- memcpy (buf, rx, count);
50
+ return spi_transceive (spi_dev, config, &tx_buf_set, &rx_buf_set);
75
51
}
76
52
77
53
void arduino::ZephyrSPI::usingInterrupt (int interruptNumber) {
@@ -80,21 +56,31 @@ void arduino::ZephyrSPI::usingInterrupt(int interruptNumber) {
80
56
void arduino::ZephyrSPI::notUsingInterrupt (int interruptNumber) {
81
57
}
82
58
83
- #ifndef SPI_MIN_CLOCK_FEQUENCY
84
- #define SPI_MIN_CLOCK_FEQUENCY 1000000
85
- #endif
86
-
87
59
void arduino::ZephyrSPI::beginTransaction (SPISettings settings) {
88
- memset (&config, 0 , sizeof (config));
89
- memset (&config16, 0 , sizeof (config16));
90
- config.frequency = settings.getClockFreq () > SPI_MIN_CLOCK_FEQUENCY ? settings.getClockFreq () :
91
- SPI_MIN_CLOCK_FEQUENCY;
92
- config16.frequency = config.frequency ;
60
+ uint32_t mode = 0 ;
61
+
62
+ // Set bus mode
63
+ switch (settings.getBusMode ()) {
64
+ case SPI_CONTROLLER:
65
+ break ;
66
+ case SPI_PERIPHERAL:
67
+ mode |= SPI_OP_MODE_SLAVE;
68
+ break ;
69
+ }
93
70
94
- auto mode = SPI_MODE_CPOL | SPI_MODE_CPHA;
71
+ // Set data format
72
+ switch (settings.getBitOrder ()) {
73
+ case LSBFIRST:
74
+ mode |= SPI_TRANSFER_LSB;
75
+ break ;
76
+ case MSBFIRST:
77
+ mode |= SPI_TRANSFER_MSB;
78
+ break ;
79
+ }
80
+
81
+ // Set data mode
95
82
switch (settings.getDataMode ()) {
96
83
case SPI_MODE0:
97
- mode = 0 ;
98
84
break ;
99
85
case SPI_MODE1:
100
86
mode = SPI_MODE_CPHA;
@@ -106,12 +92,16 @@ void arduino::ZephyrSPI::beginTransaction(SPISettings settings) {
106
92
mode = SPI_MODE_CPOL | SPI_MODE_CPHA;
107
93
break ;
108
94
}
109
- config.operation = SPI_WORD_SET (8 ) |
110
- (settings.getBitOrder () == MSBFIRST ? SPI_TRANSFER_MSB : SPI_TRANSFER_LSB) |
111
- mode;
112
- config16.operation =
113
- SPI_WORD_SET (16 ) |
114
- (settings.getBitOrder () == MSBFIRST ? SPI_TRANSFER_MSB : SPI_TRANSFER_LSB) | mode;
95
+
96
+ // Set SPI configuration structure for 8-bit transfers
97
+ memset (&config, 0 , sizeof (struct spi_config ));
98
+ config.operation = mode | SPI_WORD_SET (8 );
99
+ config.frequency = max (SPI_MIN_CLOCK_FEQUENCY, settings.getClockFreq ());
100
+
101
+ // Set SPI configuration structure for 16-bit transfers
102
+ memset (&config16, 0 , sizeof (struct spi_config ));
103
+ config16.operation = mode | SPI_WORD_SET (16 );
104
+ config16.frequency = max (SPI_MIN_CLOCK_FEQUENCY, settings.getClockFreq ());
115
105
}
116
106
117
107
void arduino::ZephyrSPI::endTransaction (void ) {
@@ -125,8 +115,6 @@ void arduino::ZephyrSPI::detachInterrupt() {
125
115
}
126
116
127
117
void arduino::ZephyrSPI::begin () {
128
- beginTransaction (SPISettings ());
129
- endTransaction ();
130
118
}
131
119
132
120
void arduino::ZephyrSPI::end () {
0 commit comments