Browse Source

Very minor SPI speedup

Scott Lahteine 5 years ago
parent
commit
758c6c9464

+ 20
- 29
Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp View File

@@ -27,8 +27,6 @@
27 27
 
28 28
 /**
29 29
  * Description: HAL for AVR - SPI functions
30
- *
31
- * For __AVR__
32 30
  */
33 31
 
34 32
 #ifdef __AVR__
@@ -68,10 +66,12 @@ void spiBegin (void) {
68 66
 }
69 67
 
70 68
 
71
-//------------------------------------------------------------------------------
72 69
 #if DISABLED(SOFTWARE_SPI)
73
-  // functions for hardware SPI
70
+
74 71
   //------------------------------------------------------------------------------
72
+  // Hardware SPI
73
+  //------------------------------------------------------------------------------
74
+
75 75
   // make sure SPCR rate is in expected bits
76 76
   #if (SPR0 != 0 || SPR1 != 1)
77 77
     #error "unexpected SPCR bits"
@@ -95,14 +95,13 @@ void spiBegin (void) {
95 95
     SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X);
96 96
   }
97 97
 
98
-  //------------------------------------------------------------------------------
99 98
   /** SPI receive a byte */
100 99
   uint8_t spiRec(void) {
101 100
     SPDR = 0xFF;
102 101
     while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
103 102
     return SPDR;
104 103
   }
105
-  //------------------------------------------------------------------------------
104
+
106 105
   /** SPI read data  */
107 106
   void spiRead(uint8_t* buf, uint16_t nbyte) {
108 107
     if (nbyte-- == 0) return;
@@ -115,13 +114,13 @@ void spiBegin (void) {
115 114
     while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
116 115
     buf[nbyte] = SPDR;
117 116
   }
118
-  //------------------------------------------------------------------------------
117
+
119 118
   /** SPI send a byte */
120 119
   void spiSend(uint8_t b) {
121 120
     SPDR = b;
122 121
     while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ }
123 122
   }
124
-  //------------------------------------------------------------------------------
123
+
125 124
   /** SPI send block  */
126 125
   void spiSendBlock(uint8_t token, const uint8_t* buf) {
127 126
     SPDR = token;
@@ -191,25 +190,21 @@ void spiBegin (void) {
191 190
   }
192 191
 
193 192
 
194
-       //------------------------------------------------------------------------------
195
-#else  // SOFTWARE_SPI
196
-       //------------------------------------------------------------------------------
193
+#else
194
+
197 195
   /** nop to tune soft SPI timing */
198 196
   #define nop asm volatile ("\tnop\n")
199 197
 
200 198
   /** Set SPI rate */
201 199
   void spiInit(uint8_t spiRate) {
202
-    // nothing to do
203
-    UNUSED(spiRate);
200
+    UNUSED(spiRate);  // nothing to do
204 201
   }
205 202
 
206 203
   /** Begin SPI transaction, set clock, bit order, data mode */
207 204
   void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) {
208
-    // nothing to do
209
-    UNUSED(spiBeginTransaction);
205
+    UNUSED(spiBeginTransaction);  // nothing to do
210 206
   }
211 207
 
212
-  //------------------------------------------------------------------------------
213 208
   /** Soft SPI receive byte */
214 209
   uint8_t spiRec() {
215 210
     uint8_t data = 0;
@@ -221,8 +216,7 @@ void spiBegin (void) {
221 216
     for (uint8_t i = 0; i < 8; i++) {
222 217
       WRITE(SCK_PIN, HIGH);
223 218
 
224
-      // adjust so SCK is nice
225
-      nop;
219
+      nop; // adjust so SCK is nice
226 220
       nop;
227 221
 
228 222
       data <<= 1;
@@ -231,48 +225,45 @@ void spiBegin (void) {
231 225
 
232 226
       WRITE(SCK_PIN, LOW);
233 227
     }
234
-    // enable interrupts
228
+
235 229
     sei();
236 230
     return data;
237 231
   }
238
-  //------------------------------------------------------------------------------
232
+
239 233
   /** Soft SPI read data */
240 234
   void spiRead(uint8_t* buf, uint16_t nbyte) {
241 235
     for (uint16_t i = 0; i < nbyte; i++)
242 236
       buf[i] = spiRec();
243 237
   }
244
-  //------------------------------------------------------------------------------
238
+
245 239
   /** Soft SPI send byte */
246 240
   void spiSend(uint8_t data) {
247 241
     // no interrupts during byte send - about 8µs
248 242
     cli();
249 243
     for (uint8_t i = 0; i < 8; i++) {
250 244
       WRITE(SCK_PIN, LOW);
251
-
252 245
       WRITE(MOSI_PIN, data & 0x80);
253
-
254 246
       data <<= 1;
255
-
256 247
       WRITE(SCK_PIN, HIGH);
257 248
     }
258
-    // hold SCK high for a few ns
259
-    nop;
249
+
250
+    nop; // hold SCK high for a few ns
260 251
     nop;
261 252
     nop;
262 253
     nop;
263 254
 
264 255
     WRITE(SCK_PIN, LOW);
265
-    // enable interrupts
256
+
266 257
     sei();
267 258
   }
268
-  //------------------------------------------------------------------------------
259
+
269 260
   /** Soft SPI send block */
270 261
   void spiSendBlock(uint8_t token, const uint8_t* buf) {
271 262
     spiSend(token);
272 263
     for (uint16_t i = 0; i < 512; i++)
273 264
       spiSend(buf[i]);
274 265
   }
275
-#endif  // SOFTWARE_SPI
276 266
 
267
+#endif // SOFTWARE_SPI
277 268
 
278 269
 #endif // __AVR__

+ 17
- 17
Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp View File

@@ -656,8 +656,8 @@
656 656
 
657 657
     // Read from SPI into buffer
658 658
     void spiRead(uint8_t* buf, uint16_t nbyte) {
659
-      if (nbyte-- == 0) return;
660
-
659
+      if (!nbyte) return;
660
+      --nbyte;
661 661
       for (int i = 0; i < nbyte; i++) {
662 662
         //WHILE_TX(0);
663 663
         SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN);
@@ -669,7 +669,7 @@
669 669
     }
670 670
 
671 671
     // Write single byte to SPI
672
-    void spiSend(byte b) {
672
+    void spiSend(const byte b) {
673 673
       // write byte with address and end transmission flag
674 674
       SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER;
675 675
       WHILE_TX(0);
@@ -678,16 +678,17 @@
678 678
       //DELAY_US(1U);
679 679
     }
680 680
 
681
-    void spiSend(const uint8_t* buf, size_t n) {
682
-      if (n == 0) return;
683
-      for (size_t i = 0; i < n - 1; i++) {
681
+    void spiSend(const uint8_t* buf, size_t nbyte) {
682
+      if (!nbyte) return;
683
+      --nbyte;
684
+      for (size_t i = 0; i < nbyte; i++) {
684 685
         SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN);
685 686
         WHILE_TX(0);
686 687
         WHILE_RX(0);
687 688
         SPI0->SPI_RDR;
688 689
         //DELAY_US(1U);
689 690
       }
690
-      spiSend(buf[n - 1]);
691
+      spiSend(buf[nbyte]);
691 692
     }
692 693
 
693 694
     void spiSend(uint32_t chan, byte b) {
@@ -698,15 +699,16 @@
698 699
       FLUSH_RX();
699 700
     }
700 701
 
701
-    void spiSend(uint32_t chan, const uint8_t* buf, size_t n) {
702
-      if (n == 0) return;
703
-      for (int i = 0; i < (int)n - 1; i++) {
702
+    void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {
703
+      if (!nbyte) return;
704
+      --nbyte;
705
+      for (size_t i = 0; i < nbyte; i++) {
704 706
         WHILE_TX(0);
705 707
         SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan);
706 708
         WHILE_RX(0);
707 709
         FLUSH_RX();
708 710
       }
709
-      spiSend(chan, buf[n - 1]);
711
+      spiSend(chan, buf[nbyte]);
710 712
     }
711 713
 
712 714
     // Write from buffer to SPI
@@ -775,17 +777,15 @@
775 777
     uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
776 778
 
777 779
     void spiRead(uint8_t* buf, uint16_t nbyte) {
778
-      if (nbyte)
779
-        for (int i = 0; i < nbyte; i++)
780
-          buf[i] = spiTransfer(0xFF);
780
+      for (int i = 0; i < nbyte; i++)
781
+        buf[i] = spiTransfer(0xFF);
781 782
     }
782 783
 
783 784
     void spiSend(uint8_t data) { spiTransfer(data); }
784 785
 
785 786
     void spiSend(const uint8_t* buf, size_t nbyte) {
786
-      if (nbyte)
787
-        for (uint16_t i = 0; i < nbyte; i++)
788
-          spiTransfer(buf[i]);
787
+      for (uint16_t i = 0; i < nbyte; i++)
788
+        spiTransfer(buf[i]);
789 789
     }
790 790
 
791 791
     void spiSendBlock(uint8_t token, const uint8_t* buf) {

+ 10
- 14
Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp View File

@@ -81,17 +81,15 @@
81 81
   uint8_t spiRec() { return spiTransfer(0xFF); }
82 82
 
83 83
   void spiRead(uint8_t*buf, uint16_t nbyte) {
84
-    if (nbyte)
85
-      for (int i = 0; i < nbyte; i++)
86
-        buf[i] = spiTransfer(0xFF);
84
+    for (int i = 0; i < nbyte; i++)
85
+      buf[i] = spiTransfer(0xFF);
87 86
   }
88 87
 
89 88
   void spiSend(uint8_t b) { (void)spiTransfer(b); }
90 89
 
91
-  void spiSend(const uint8_t* buf, size_t n) {
92
-    if (n)
93
-      for (uint16_t i = 0; i < n; i++)
94
-        (void)spiTransfer(buf[i]);
90
+  void spiSend(const uint8_t* buf, size_t nbyte) {
91
+    for (uint16_t i = 0; i < nbyte; i++)
92
+      (void)spiTransfer(buf[i]);
95 93
   }
96 94
 
97 95
   void spiSendBlock(uint8_t token, const uint8_t* buf) {
@@ -178,15 +176,14 @@
178 176
 
179 177
   void spiSend(uint8_t b) { doio(b); }
180 178
 
181
-  void spiSend(const uint8_t* buf, size_t n) {
182
-    if (n)
183
-      for (uint16_t i = 0; i < n; i++) doio(buf[i]);
179
+  void spiSend(const uint8_t* buf, size_t nbyte) {
180
+    for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]);
184 181
   }
185 182
 
186 183
   void spiSend(uint32_t chan, byte b) {
187 184
   }
188 185
 
189
-  void spiSend(uint32_t chan, const uint8_t* buf, size_t n) {
186
+  void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {
190 187
   }
191 188
 
192 189
   // Read single byte from SPI
@@ -195,9 +192,8 @@
195 192
   uint8_t spiRec(uint32_t chan) { return 0; }
196 193
 
197 194
   // Read from SPI into buffer
198
-  void spiRead(uint8_t*buf, uint16_t nbyte) {
199
-    if (nbyte)
200
-      for (int i = 0; i < nbyte; i++) buf[i] = doio(0xff);
195
+  void spiRead(uint8_t *buf, uint16_t nbyte) {
196
+    for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF);
201 197
   }
202 198
 
203 199
   static uint8_t spiTransfer(uint8_t b) {

Loading…
Cancel
Save