Explorar el Código

Very minor SPI speedup

Scott Lahteine hace 5 años
padre
commit
758c6c9464

+ 20
- 29
Marlin/src/HAL/HAL_AVR/HAL_spi_AVR.cpp Ver fichero

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

+ 17
- 17
Marlin/src/HAL/HAL_DUE/HAL_spi_Due.cpp Ver fichero

656
 
656
 
657
     // Read from SPI into buffer
657
     // Read from SPI into buffer
658
     void spiRead(uint8_t* buf, uint16_t nbyte) {
658
     void spiRead(uint8_t* buf, uint16_t nbyte) {
659
-      if (nbyte-- == 0) return;
660
-
659
+      if (!nbyte) return;
660
+      --nbyte;
661
       for (int i = 0; i < nbyte; i++) {
661
       for (int i = 0; i < nbyte; i++) {
662
         //WHILE_TX(0);
662
         //WHILE_TX(0);
663
         SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN);
663
         SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN);
669
     }
669
     }
670
 
670
 
671
     // Write single byte to SPI
671
     // Write single byte to SPI
672
-    void spiSend(byte b) {
672
+    void spiSend(const byte b) {
673
       // write byte with address and end transmission flag
673
       // write byte with address and end transmission flag
674
       SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER;
674
       SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER;
675
       WHILE_TX(0);
675
       WHILE_TX(0);
678
       //DELAY_US(1U);
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
         SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN);
685
         SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN);
685
         WHILE_TX(0);
686
         WHILE_TX(0);
686
         WHILE_RX(0);
687
         WHILE_RX(0);
687
         SPI0->SPI_RDR;
688
         SPI0->SPI_RDR;
688
         //DELAY_US(1U);
689
         //DELAY_US(1U);
689
       }
690
       }
690
-      spiSend(buf[n - 1]);
691
+      spiSend(buf[nbyte]);
691
     }
692
     }
692
 
693
 
693
     void spiSend(uint32_t chan, byte b) {
694
     void spiSend(uint32_t chan, byte b) {
698
       FLUSH_RX();
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
         WHILE_TX(0);
706
         WHILE_TX(0);
705
         SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan);
707
         SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan);
706
         WHILE_RX(0);
708
         WHILE_RX(0);
707
         FLUSH_RX();
709
         FLUSH_RX();
708
       }
710
       }
709
-      spiSend(chan, buf[n - 1]);
711
+      spiSend(chan, buf[nbyte]);
710
     }
712
     }
711
 
713
 
712
     // Write from buffer to SPI
714
     // Write from buffer to SPI
775
     uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
777
     uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); }
776
 
778
 
777
     void spiRead(uint8_t* buf, uint16_t nbyte) {
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
     void spiSend(uint8_t data) { spiTransfer(data); }
784
     void spiSend(uint8_t data) { spiTransfer(data); }
784
 
785
 
785
     void spiSend(const uint8_t* buf, size_t nbyte) {
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
     void spiSendBlock(uint8_t token, const uint8_t* buf) {
791
     void spiSendBlock(uint8_t token, const uint8_t* buf) {

+ 10
- 14
Marlin/src/HAL/HAL_LPC1768/HAL_spi.cpp Ver fichero

81
   uint8_t spiRec() { return spiTransfer(0xFF); }
81
   uint8_t spiRec() { return spiTransfer(0xFF); }
82
 
82
 
83
   void spiRead(uint8_t*buf, uint16_t nbyte) {
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
   void spiSend(uint8_t b) { (void)spiTransfer(b); }
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
   void spiSendBlock(uint8_t token, const uint8_t* buf) {
95
   void spiSendBlock(uint8_t token, const uint8_t* buf) {
178
 
176
 
179
   void spiSend(uint8_t b) { doio(b); }
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
   void spiSend(uint32_t chan, byte b) {
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
   // Read single byte from SPI
189
   // Read single byte from SPI
195
   uint8_t spiRec(uint32_t chan) { return 0; }
192
   uint8_t spiRec(uint32_t chan) { return 0; }
196
 
193
 
197
   // Read from SPI into buffer
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
   static uint8_t spiTransfer(uint8_t b) {
199
   static uint8_t spiTransfer(uint8_t b) {

Loading…
Cancelar
Guardar