@@ -350,49 +350,54 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
350350 while (SPI1CMD & SPIBUSY) {}
351351}
352352
353-
354353/* *
355- * Note:
356- * data need to be aligned to 32Bit
357- * or you get an Fatal exception (9)
358354 * @param data uint8_t *
359355 * @param size uint8_t max for size is 64Byte
360356 * @param repeat uint32_t
361357 */
362358void SPIClass::writePattern (uint8_t * data, uint8_t size, uint32_t repeat) {
363359 if (size > 64 ) return ; // max Hardware FIFO
364360
365- uint32_t byte = (size * repeat);
366- uint8_t r = (64 / size);
361+ while (SPI1CMD & SPIBUSY) {}
367362
368- while (byte) {
369- if (byte > 64 ) {
370- writePattern_ (data, size, r);
371- byte -= 64 ;
372- } else {
373- writePattern_ (data, size, (byte / size));
374- byte = 0 ;
375- }
376- }
377- }
363+ uint32_t buffer[16 ];
364+ uint8_t *bufferPtr=(uint8_t *)&buffer;
365+ uint8_t *dataPtr = data;
366+ volatile uint32_t * fifoPtr = &SPI1W0;
367+ uint8_t r = 64 / size;
368+ uint32_t repeatRem = repeat % r;
369+ repeat = repeat / r;
378370
379- void SPIClass::writePattern_ (uint8_t * data, uint8_t size, uint8_t repeat) {
380- uint8_t bytes = (size * repeat);
381- uint8_t buffer[64 ];
382- uint8_t * bufferPtr = &buffer[0 ];
383- uint8_t * dataPtr;
384- uint8_t dataSize = bytes;
385- for (uint8_t i = 0 ; i < repeat; i++) {
386- dataSize = size;
371+ while (r--){
387372 dataPtr = data;
388- while (dataSize--) {
373+ for ( uint8_t i= 0 ; i<size; i++) {
389374 *bufferPtr = *dataPtr;
390- dataPtr++;
391375 bufferPtr++;
376+ dataPtr++;
392377 }
393378 }
394379
395- writeBytes (&buffer[0 ], bytes);
380+ fifoPtr = &SPI1W0;
381+ for (uint8_t i=0 ; i<16 ; i++){
382+ *fifoPtr = buffer[i];
383+ fifoPtr++;
384+ }
385+
386+ r = 64 / size;
387+
388+ SPI1U = SPIUMOSI | SPIUSSE;
389+ // Fill fifo with data
390+ setDataBits (r * size * 8 );
391+ while (repeat--){
392+ SPI1CMD |= SPIBUSY;
393+ while (SPI1CMD & SPIBUSY) {}
394+ }
395+
396+ setDataBits (repeatRem * size * 8 );
397+ SPI1CMD |= SPIBUSY;
398+ while (SPI1CMD & SPIBUSY) {}
399+
400+ SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
396401}
397402
398403/* *
0 commit comments