📄 xe1205driver.c
字号:
return;
}
SetRFMode(RF_TRANSMITTER);
RFState |= RF_BUSY;
RFState &= ~RF_STOP;
RFFrameSize = size;
pRFFrame = buffer;
TxEventsOn(); // Enable Tx events
clear_bit(PORTO, NSS_DATA);
for(ByteCounter = 0; ByteCounter < 4; ByteCounter++){
SendByte(0xAA);
}
for(ByteCounter = 0; ByteCounter < PatternSize; ByteCounter++){
SendByte(StartByte[ByteCounter]);
}
SendByte(RFFrameSize);
SyncByte = 0;
for(ByteCounter = 0, RFFramePos = 0; ByteCounter < RFFrameSize; ByteCounter++){
if(SyncByte == SYNC_BYTE_FREQ){
if(EnableSyncByte){
SyncByte = 0;
SendByte(0x55);
ByteCounter--;
}
}
else{
if(EnableSyncByte){
SyncByte++;
}
SendByte(pRFFrame[RFFramePos++]);
}
}
clear_bit(PORTO, NSS_DATA);
TxEventsOff(); // Disable Tx events
RFState |= RF_STOP;
RFState &= ~RF_TX_DONE;
*pReturnCode = OK;
} // void SendRfFrame(_U8 *buffer, _U8 size, _U8 *pReturnCode)
/*******************************************************************
** ReceiveRfFrame : Receives a RF frame **
********************************************************************
** In : - **
** Out : *buffer, size, *pReturnCode **
*******************************************************************/
void ReceiveRfFrame(_U8 *buffer, _U8 *size, _U8 *pReturnCode){
_U8 dummy = 0;
pRFFrame = buffer;
RFFramePos = 0;
RFFrameSize = 2;
SyncByte = 0;
SetRFMode(RF_RECEIVER);
RxEventsOn(); // Enable events (timeout)
do{
if((RegEvn & 0x80) == 0x80){ // Tests if counter A generates an event (timeout)
RxEventsOff();
*size = RFFrameSize;
*pReturnCode = RX_TIMEOUT;
return; // Returns the status TimeOut
}
}while((RegPAIn & IRQ_0) == 0x00); // Waits The Pattern detection of the XE1205
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
RFFrameSize = ReceiveByte();
RFFramePos++;
// The following lines performs the same behavior as RxEventsOff then RxEventsOn inlined
RegCntOn &= 0xFC; // Disables counters A&B
RegEvnEn &= 0x6F; // Disables events from PortA bit 1 and Cnt A
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
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
// End of RxEventsOff then RxEventsOn inlined
if(RFFrameSize >= RF_BUFFER_SIZE_MAX){
*size = RFFrameSize;
*pReturnCode = ERROR;
return;
}
while(RFFramePos < RFFrameSize + 1){
if(SyncByte == SYNC_BYTE_FREQ){
if(EnableSyncByte){
SyncByte = 0;
dummy = ReceiveByte();
RFFramePos--;
}
}
else{
pRFFrame[RFFramePos-1] = ReceiveByte();
if(EnableSyncByte){
SyncByte++;
}
}
if ((RegEvn & 0x80) == 0x80){ // Tests if counter A generates an event
RxEventsOff();
*size = RFFrameSize;
*pReturnCode = RX_TIMEOUT;
return ; // Returns the status TimeOut
}
RFFramePos++;
}
*size = RFFrameSize;
*pReturnCode = OK;
return;
} // void ReceiveRfFrame(_U8 *buffer, _U8 size, _U8 *pReturnCode)
/*******************************************************************
** SendByte : Send a data of 8 bits to the transceiver LSB first **
********************************************************************
** In : b **
** Out : - **
*******************************************************************/
void SendByte(_U8 b){
_U8 bitCounter;
for(bitCounter = 0x01; bitCounter != 0x00; bitCounter <<= 1){
do{
asm("halt");
}while ((RegEvn & 0x80) == 0x00); // Waits the event from the counter A
if (b & bitCounter){
set_bit(PORTO, NSS_DATA);
}
else{
clear_bit(PORTO, NSS_DATA);
}
RegEvn = 0x80; // Clears the event from the counter A on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
} // for(bitCounter = 0x01; bitCounter != 0x00; bitCounter <<= 1)
} // void Sendbyte(_U8 b)
/*******************************************************************
** ReceiveByte : Receives a data of 8 bits from the transceiver **
** LSB first **
********************************************************************
** In : - **
** Out : b **
*******************************************************************/
_U8 ReceiveByte(void){
_U8 b = 0;
// Bit 0
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x01;
}
// Bit 1
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x02;
}
// Bit 2
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x04;
}
// Bit 3
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x08;
}
// Bit 4
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x10;
}
// Bit 5
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x20;
}
// Bit 6
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x40;
}
// Bit 7
do{
asm("halt");
}while ((RegEvn & 0x90) == 0x00); // Waits the event from the PortA or the counter A
RegEvn = 0x10; // Clears the event from the PortA on the event register
asm("clrb %stat, #0"); // Clears the event on the CoolRISC status register
if(RegPAIn & DATA){
b |= 0x80;
}
return b;
} // _U8 ReceiveByte(void)
/*******************************************************************
** Transceiver specific functions **
*******************************************************************/
/*******************************************************************
** AutoFreqControl : Calibrates the receiver LO frequency to the **
** transmitter LO frequency **
********************************************************************
** In : - **
** Out : *pReturnCode **
*******************************************************************/
void AutoFreqControl(_U8 *pReturnCode){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -