void Sync_Main(void) { static uint16 frac = FracN_DEFAULT; static int16 prev_error = 0; static uint8 pll_resetting = 0; static uint16 pll_testing = PLL_VERIFY_TIME; static uint16 pll_diff_acc = 0, pll_error_count = 0; int16 cur_error, diff, p_term, d_term; uint16 pos; pos = CY_GET_REG8(SyncSOF_FRAME_POS_LO__STATUS_REG); if (pos & 0x01) { pos += (uint16)CY_GET_REG8(SyncSOF_FRAME_POS_HI__STATUS_REG) << 8; cur_error = pos - SYNC_SOF_CENTER; diff = cur_error - prev_error; p_term = cur_error * SYNC_P_GAIN; d_term = diff * SYNC_D_GAIN; prev_error = cur_error; frac += p_term + d_term; if (frac > SYNC_FRAC_MAX) frac = SYNC_FRAC_MAX; if (frac < SYNC_FRAC_MIN) frac = SYNC_FRAC_MIN; if (pll_testing) { if (pll_resetting) { frac = 0; // Wait for PLL reset if (!(--pll_resetting)) { Control_Write(Control_Read() & ~CONTROL_LED); frac = FracN_DEFAULT; FRAC_CLK_SetDividerValue(13); } } else { pll_testing--; if (diff < 0) pll_diff_acc -= diff; else pll_diff_acc += diff; pll_diff_acc /= 2; if (pll_diff_acc < 2) { if (pll_error_count) pll_error_count--; } else if (pll_diff_acc > 7) { pll_error_count++; } if (pll_error_count > 50) { pll_diff_acc = 0; pll_error_count = 0; pll_resetting = PLL_RESET_TIME; pll_testing = PLL_VERIFY_TIME; Control_Write(Control_Read() | CONTROL_LED); FRAC_CLK_SetDividerValue(14); } } } FracN_Set(frac); } }
void NRF_ReuseTxPayload(void){ SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_REUSE_TX_PL); while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
void NRF_WriteSingleRegister(uint8_t reg, uint8_t data){ SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_W_REGISTER | reg); SPI_WriteTxData(data); while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
/** * @brief Vaciamos el TX FIFO. */ void NRF_FlushTx(void){ SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_FLUSH_TX); while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
/** * @brief Funcion para obtener el registro STATUS. * @return Valor del registro STATUS. */ uint8_t NRF_GetStatus(void){ SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteByte(NRF_NOP); while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return (uint8_t)SPI_ReadRxData(); }
void NRF_ReadSingleRegister(uint8_t reg, uint8_t* data){ SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_R_REGISTER | reg); SPI_WriteTxData(NRF_NOP); while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); (void)SPI_ReadRxData(); /* Dummy read, this is the STATUS Register */ *data = SPI_ReadRxData(); return; }
void NRF_WriteMultipleRegister(uint8_t reg, uint8_t* bufIn, uint8_t bufSize){ uint8_t i = 0; SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_W_REGISTER | reg); for(; i < bufSize; i++){ SPI_WriteTxData(bufIn[i]); } while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
void NRF_RxWritePayload(uint8_t pipe, uint8_t* data, uint8_t payloadSize){ uint8_t i = 0; SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_W_ACK_PAYLOAD | (pipe & 0x7)); for(; i < payloadSize; i++){ SPI_WriteTxData(data[i]); } while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
void NRF_FillTxFIFO(uint8_t* data, uint8_t payloadSize){ uint8_t i = 0; SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_W_TX_PAYLOAD); for(; i < payloadSize; i++){ SPI_WriteTxData(data[i]); } while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
// Example usage: // Morse_Main("Repeating Message ");for(;;){sleep(240);Morse_Main(0);} void Morse_Main(char* msg) { static uint8 pos, codes, len, state, timer, *message; uint8 i; if (msg) { state = pos = 0; message = msg; } else switch (state) { case 0: if (!message[pos]) pos = 0; i = message[pos++]; if (i >= 0x61 && i <= 0x7A) i -= 32; if (i < 0x22 || i > 0x5A) codes = 7; else codes = MCODES[i-0x22]; len = codes & 0x07; if (len==0) len = 6; if (codes==7) { timer = MORSE_WORD - MORSE_CHAR - 2; len = 0; state = 3; break; } case 1: if (codes & 0x80) timer = MORSE_DASH; else timer = MORSE_DOT; codes <<= 1; len--; Control_Write(Control_Read() & ~CONTROL_LED); state = 2; case 2: if (!timer) { state = 3; if (!len) timer = MORSE_CHAR - 1; else timer = MORSE_DOT - 1; Control_Write(Control_Read() | CONTROL_LED); } else { timer--; break; } case 3: if (!timer) { if (!len) state = 0; else state = 1; } else timer--; } }
void NRF_TxTransmitWaitNoACK(uint8_t* data, uint8_t payloadSize){ uint8_t i = 0; SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_W_TX_PAYLOAD_NOACK); for(; i < payloadSize; i++){ SPI_WriteTxData(data[i]); } while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); NRF_TransmitPulse(); return; }
void writeBufferTest(uint8_t reg, uint8_t* bufIn, uint8_t bufSize){ SPI_ClearRxBuffer(); uint8_t auxBuffer[(bufSize + 1)], i = bufSize, h = bufSize; for(; i > 0; i--){ h--; auxBuffer[i] = bufIn[h]; } auxBuffer[0] = (uint8_t)(NRF_W_REGISTER | reg); Control_Write(0); SPI_PutArray(auxBuffer, (bufSize + 1)); while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
void NRF_ReadMultipleRegister(uint8_t reg, uint8_t* bufIn , uint8_t bufSize){ uint8_t i = 0, j = 0; SPI_ClearRxBuffer(); Control_Write(0); SPI_WriteTxData(NRF_R_REGISTER | reg); for(; i < bufSize; i++){ SPI_WriteTxData(NRF_NOP); } (void)SPI_ReadRxData(); /* Dummy read, this is the STATUS Register */ for(; j < bufSize; j++){ *(bufIn + j) = SPI_ReadRxData(); } while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE)); Control_Write(1); return; }
void T1_Main(void) { static uint8 state = 0, timer, band, send, bits, band_request, band_request_timer; static uint16 tune_timer; if (tune_timer) { tune_timer--; if (!tune_timer) { Control_Write(Control_Read() & ~CONTROL_ATU_1); } } if (band_request_timer) band_request_timer--; else if (T1_Band_Number != band) { band_request = 1; band_request_timer = 200; } switch(state) { case 0: // idle if (Status_Read() & STATUS_ATU_0) timer++; else { if (timer >= 85 && timer <= 115) { state = 1; timer = 20; send = band = T1_Band_Number; bits = 4; Control_Write(Control_Read() & ~CONTROL_ATU_0 | CONTROL_ATU_0_OE); } else { timer = 0; if (band_request || T1_Tune_Request) { Control_Write(Control_Read() | CONTROL_ATU_1); if (T1_Tune_Request) tune_timer = 1000; else tune_timer = 10; band_request = T1_Tune_Request = 0; } } } break; case 1: // data low timer--; if (!timer) { if (bits) { Control_Write(Control_Read() | CONTROL_ATU_0); if (send & 0x08) timer = 8; else timer = 3; send <<= 1; bits--; state = 2; } else { Control_Write(Control_Read() & ~(CONTROL_ATU_0 | CONTROL_ATU_0_OE)); state = 0; } } break; case 2: // data high timer--; if (!timer) { if (bits) timer = 3; else timer = 10; Control_Write(Control_Read() & ~CONTROL_ATU_0); state = 1; } break; } }