MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / frequencyToSPIClock

Function frequencyToSPIClock

modules/pins/spi/esp/modSPI.c:520–584  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

518}
519
520uint32_t frequencyToSPIClock(uint32_t freq)
521{
522 if (freq >= ESP8266_CLOCK)
523 return 0x80000000;
524
525 const spiClk_t minFreqReg = { 0x7FFFF000 };
526 uint32_t minFreq = ClkRegToFreq((spiClk_t*) &minFreqReg);
527 if(freq < minFreq)
528 return minFreqReg.regValue; // use minimum possible clock
529
530 uint8_t calN = 1;
531
532 spiClk_t bestReg = { 0 };
533 int32_t bestFreq = 0;
534
535 // find the best match
536 while(calN <= 0x3F) { // 0x3F max for N
537
538 spiClk_t reg = { 0 };
539 int32_t calFreq;
540 int32_t calPre;
541 int8_t calPreVari = -2;
542
543 reg.regN = calN;
544
545 while(calPreVari++ <= 1) { // test different variants for Pre (we calculate in int so we miss the decimals, testing is the easyest and fastest way)
546 calPre = (((ESP8266_CLOCK / (reg.regN + 1)) / freq) - 1) + calPreVari;
547 if(calPre > 0x1FFF) {
548 reg.regPre = 0x1FFF; // 8191
549 } else if(calPre <= 0) {
550 reg.regPre = 0;
551 } else {
552 reg.regPre = calPre;
553 }
554
555 reg.regL = ((reg.regN + 1) / 2);
556 // reg.regH = (reg.regN - reg.regL);
557
558 // test calculation
559 calFreq = ClkRegToFreq(&reg);
560 //os_printf("-----[0x%08X][%d]\t EQU: %d\t Pre: %d\t N: %d\t H: %d\t L: %d = %d\n", reg.regValue, freq, reg.regEQU, reg.regPre, reg.regN, reg.regH, reg.regL, calFreq);
561
562 if(calFreq == (int32_t) freq) {
563 // accurate match use it!
564 memcpy(&bestReg, &reg, sizeof(bestReg));
565 break;
566 } else if(calFreq < (int32_t) freq) {
567 // never go over the requested frequency
568 if(abs(freq - calFreq) < abs(freq - bestFreq)) {
569 bestFreq = calFreq;
570 memcpy(&bestReg, &reg, sizeof(bestReg));
571 }
572 }
573 }
574 if(calFreq == (int32_t) freq) {
575 // accurate match use it!
576 break;
577 }

Callers 1

modSPIInitFunction · 0.85

Calls 1

ClkRegToFreqFunction · 0.85

Tested by

no test coverage detected