📄 xe1205driver.c
字号:
_S16 Result = 0;
_S16 LoRegisterValue = 0;
_U8 Done = false;
_U8 TimeOut = 20;
// Initializes the FEI to enable his reading
InitFei();
do{
// FEI and LO register reading
Result = ReadFei();
LoRegisterValue = ReadLO();
LoRegisterValue = LoRegisterValue - Result;
WriteLO(LoRegisterValue);
TimeOut --;
if((Result >= -1) && (Result <= 1)){
Done = true;
}
if(TimeOut == 0){
*pReturnCode = RX_TIMEOUT;
return;
}
}while(!Done);
*pReturnCode = OK;
}
/*******************************************************************
** ReadLO : Reads the LO frequency value from XE1205 **
********************************************************************
** In : - **
** Out : value **
*******************************************************************/
_U16 ReadLO(void){
_U16 value;
value = ReadRegister(REG_MCPARAM4) << 8;
value |= ReadRegister(REG_MCPARAM5) & 0xFF;
return value;
}
/*******************************************************************
** WriteLO : Writes the LO frequency value on the XE1205 **
********************************************************************
** In : value **
** Out : - **
*******************************************************************/
void WriteLO(_U16 value){
WriteRegister(REG_MCPARAM4, (_U8) (value >> 8));
WriteRegister(REG_MCPARAM5, (_U8) value);
}
/*******************************************************************
** InitFei : Initializes the XE1205 to enable the FEI reading **
********************************************************************
** In : - **
** Out : - **
*******************************************************************/
void InitFei(void){
_U8 BitRate = 0;
BitRate = RegistersCfg[REG_MCPARAM3];
Wait(TS_FEI(BitRate));
}
/*******************************************************************
** ReadFei : Reads the FEI value from XE1205 **
********************************************************************
** In : - **
** Out : value **
*******************************************************************/
_S16 ReadFei(void){
_S16 value;
value = ReadRegister(REG_RXPARAM5); // Reads the FEI result LSB first (For trig)
value = value | (ReadRegister(REG_RXPARAM4) << 8); // Reads the FEI result MSB
return value;
}
/*******************************************************************
** InitRssi : Initializes the XE1205 to enable the RSSI reading **
********************************************************************
** In : - **
** Out : - **
*******************************************************************/
void InitRssi(void){
Wait(TS_RSSI);
}
/*******************************************************************
** ReadRssi : Reads the Rssi value from XE1205 **
********************************************************************
** In : - **
** Out : value **
*******************************************************************/
_U16 ReadRssi(void){
_U16 value;
value = ReadRegister(REG_RXPARAM2) & 0x03; // Reads the RSSI result
return value;
}
/*******************************************************************
** Utility functions **
*******************************************************************/
/*******************************************************************
** Wait : This routine uses the counter A&B to create a delay **
** using the RC ck source **
********************************************************************
** In : cntVal **
** Out : - **
*******************************************************************/
void Wait(_U16 cntVal){
RegCntOn &= 0xFC; // Disables counter A&B
RegEvnEn &= 0x7F; // Disables events from the counter A&B
RegEvn = 0x80; // Clears the event from the CntA on the event register
RegCntCtrlCk = (RegCntCtrlCk & 0xFC) | 0x01; // Selects RC frequency as clock source for counter A&B
RegCntConfig1 |= 0x34; // A&B counters count up, counter A&B are in cascade mode
RegCntA = (_U8)(cntVal); // LSB of cntVal
RegCntB = (_U8)(cntVal >> 8); // MSB of cntVal
RegEvnEn |= 0x80; // Enables events from CntA
RegEvn |= 0x80; // Clears the event from the CntA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
RegCntOn |= 0x03; // Enables counter A&B
do{
asm("halt");
}while ((RegEvn & 0x80) == 0x00); // Waits the event from counter A
RegCntOn &= 0xFE; // Disables counter A
RegEvnEn &= 0x7F; // Disables events from the counter A
RegEvn |= 0x80; // Clears the event from the CntA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
} // void Wait(_U16 cntVal)
/*******************************************************************
** TxEventsOn : Initializes the timers and the events related to **
** the TX routines PA1 CntA&B **
********************************************************************
** In : - **
** Out : - **
*******************************************************************/
void TxEventsOn(void){
RegCntCtrlCk = (RegCntCtrlCk & 0xFC) | 0x01; // Selects RC frequency as clock source for counter A&B
RegCntConfig1 |= 0x34; // A&B counters count up, counter A&B are in cascade mode
RegCntA = (char)RFBaudrate; // LSB of RFBaudrate
RegCntB = (char)(RFBaudrate >> 8); // MSB of RFBaudrate
RegEvnEn |= 0x80; // Enables events for the counter A&B
RegEvn |= 0x80; // Clears the event from the CntA on the event register
asm("and %stat, #0xDE"); // Clears the event on the CoolRISC status register, and disable all interrupts
RegCntOn |= 0x03; // Enables counter A&B
} // void TxEventsOn(void)
/*******************************************************************
** TxEventsOff : Initializes the timers and the events related to **
** the TX routines PA1 CntA&B **
********************************************************************
** In : - **
** Out : - **
*******************************************************************/
void TxEventsOff(void){
RegCntOn &= 0xFC; // Disables counter A&B
RegEvnEn &= 0x7F; // Disables events from the counter A&B
RegEvn = 0x80; // Clears the event from the CntA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
asm("setb %stat, #5"); // Enable all interrupts
} // void TxEventsOff(void)
/*******************************************************************
** RxEventsOn : Initializes the timers and the events related to **
** the RX routines PA1 CntA&B **
********************************************************************
** In : - **
** Out : - **
*******************************************************************/
void RxEventsOn(void){
RegCntCtrlCk = (RegCntCtrlCk & 0xFC) | 0x03; // Selects 128 Hz frequency as clock source for counter A&B
RegCntConfig1 |= 0x34; // A&B counters count up, counter A&B are in cascade mode
RegCntA = (_U8)RFFrameTimeOut; // LSB of RFFrameTimeOut
RegCntB = (_U8)(RFFrameTimeOut >> 8); // MSB of RFFrameTimeOut
RegEvnEn |= 0x90; // Enables events from PA1 and CntA
RegEvn |= 0x90; // Clears the event from the CntA and PA1 on the event register
asm("and %stat, #0xDE"); // Clears the event on the CoolRISC status register, and disable all interrupts
RegCntOn |= 0x03; // Enables counter A&B
} // void RxEventsOn(void)
/*******************************************************************
** RxEventsOff : Initializes the timers and the events related to **
** the RX routines PA1 CntA&B **
********************************************************************
** In : - **
** Out : - **
*******************************************************************/
void RxEventsOff(void){
RegCntOn &= 0xFC; // Disables counters A&B
RegEvnEn &= 0x6F; // Disables events from PortA bit 1 and Cnt A
RegEvn |= 0x90; // Clears the event from the CntA and PA1 on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
asm("setb %stat, #5"); // Enable all interrupts
} // void RxEventsOff(void)
/*******************************************************************
** InvertByte : Inverts a byte. MSB -> LSB, LSB -> MSB **
********************************************************************
** In : b **
** Out : b **
*******************************************************************/
_U8 InvertByte(_U8 b){
asm(" move %r0, #0x08");
asm("LoopInvertByte:");
asm(" shl %r3");
asm(" shrc %r2");
asm(" dec %r0");
asm(" jzc LoopInvertByte");
} // _U8 InvertByte(_U8 b)
/*******************************************************************
** SpiInOut : Sends and receives a byte from the SPI bus **
********************************************************************
** In : outputByte **
** Out : inputByte **
*******************************************************************/
_U8 SpiInOut (_U8 outputByte){
_U8 bitCounter;
_U8 inputByte = 0;
SPIClock(0);
for(bitCounter = 0x80; bitCounter != 0x00; bitCounter >>= 1){
if (outputByte & bitCounter){
SPIMosi(1);
}
else{
SPIMosi(0);
}
SPIClock(1);
if (SPIMisoTest()){
inputByte |= bitCounter;
}
SPIClock(0);
} // for(BitCounter = 0x80; BitCounter != 0x00; BitCounter >>= 1)
SPIMosi(0);
return inputByte;
} // _U8 SpiInOut (_U8 outputByte)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -