iosl.c
来自「cc1110,cc2510透传代码,IAR环境的」· C语言 代码 · 共 339 行
C
339 行
/*-------------------------------------*
* 头文件 *
*---------------------------------------------------------------------------*/
#include "includes.h"
/*-------------------------------------*
* 变量定义 *
*---------------------------------------------------------------------------*/
byte __xdata UARTrxtxbuf[1 + PACKET_LENGTH + 2];//串口接收缓存数据
byte __xdata UARTlen; //串口数据长度
byte __xdata WaitUARTtime; //等待串口回传时间
byte __xdata WaitRFtime; //等待RF回传时间
static bool uartRxTimeout =false;
byte __xdata *pUartTxData;
byte __xdata pUartTxDatalen;
static bool rfRcvdSentFlag = false; //Flag set whenever a packet is received or send
__interrupt void T1_IRQ(void);
__interrupt void uartRxIrq(void);
__interrupt void uartTxIrq(void);
void SetUartToTxMode(void);
void SetRFToTxMode(void);
void SetRFToRxMode(void);
void SetUartToRxMode(void);
void Reset(void);
void DMAClear(void);
void InitWDT(void);
void UartFlgClear(void);
byte rssi_dec;
signed char rssi_dBm;
byte rssi_offset = 72;
/*-------------------------------------*
* 函数定义 *
*---------------------------------------------------------------------------*/
/******************************************************************************
* @fn: InitAll
* @brief:
* This function initialize the I/O and the uart.
* Parameters:
* @param: void
* @return: void
******************************************************************************/
void InitAll()
{
P0SEL = 0x00;
P1SEL = 0x3C; //I/O use to UART0
P2SEL &= ~0x07;
IO_DIR_PORT_PIN(0, 6, IO_OUT); // Set P0_6 to output
IO_DIR_PORT_PIN(0, 7, IO_OUT); // Set P0_7 to output
IO_DIR_PORT_PIN(2, 0, IO_OUT); // Set P0_7 to output
P0_6=0; P0_7=1; // PA is in Rx state
//OpenUart(BR_9600,PARITY_ENABLE|HIGH_STOP|NINE_BIT_TRANSFER|ODD_PARITY);
OpenUart(BR_1200,PARITY_ENABLE|HIGH_STOP|NINE_BIT_TRANSFER|ODD_PARITY);
U0CSR &= ~0x40; // disable uart rx
INT_ENABLE(INUM_URX0, INT_ON); // UART Rx interrupt enable
INT_ENABLE(INUM_UTX0, INT_ON); // UART Tx interrupt enable
}
/******************************************************************************
* @fn: InitWDT
* @brief:
* This function initialize WDT to 1second.
* Parameters:
* @param: void
* @return: void
******************************************************************************/
void InitWDT(void)
{
WDT_SET_TIMEOUT_PERIOD(SEC_1);//WDT 1s
WDT_ENABLE();//WDT enable
INT_ENABLE(INUM_WDT,INT_ON);//WDT enable
}
unsigned int ResetTime;
/******************************************************************************
* @fn: SetRFToRxMode
* @brief:
* This function set RF to receiver Mode.When the rfRcvdSentFlag to be true,
* the packet is received.
* Parameters:
* @param: void
* @return: Function returns TRUE if the RF received data was successful and correct.
******************************************************************************/
void SetRFToRxMode()
{
P0_6=0; asm("NOP");P0_7=1; // PA mode change to rx
UartFlgClear();
DMAClear();
DMAARM = DMAARM_CHANNEL1; // Arm DMA channel 0
RFST = STROBE_RX; // Switch radio to RX
ResetTime = 0;
while (!rfRcvdSentFlag) // received completed
{
if(uartRxTimeout) //if uartrx interrupt,go out
return;
else if(ResetTime>1000) // 10s reset
Reset();
WDT_RESET();//喂狗
}
rfRcvdSentFlag = false;
if (pktCheckValidity())//&&rfRcvdSentFlag)
{
SetUartToTxMode(); // if Rf received packet is correctt,Send the packet to uart
}
}
/******************************************************************************
* @fn: SetRFToTxMode
* @brief:
* This function set RF to transfer Mode.When the rfRcvdSentFlag to be true,
* the packet is sent.
* Parameters:
* @param: void
* @return: Function returns TRUE if the RF sent data was finshed.
******************************************************************************/
void SetRFToTxMode()
{
P0_7=0; asm("NOP");P0_6=1; // PA mode change to tx
DMAClear();
DMAARM = DMAARM_CHANNEL0; // Arm DMA channel 0
RFST = STROBE_TX; // Switch radio to TX
WDT_RESET();//喂狗
WaitRFtime=0;
while(!rfRcvdSentFlag) //Wait Transmit is successful
{
WDT_RESET();//喂狗
if(WaitRFtime>30)
{
Reset();
}
}
rfRcvdSentFlag = false;
}
/******************************************************************************
* @fn: SetUartToRxMode
* @brief:
* This function set UART to receiver Mode.When the uartRxTimeout to be true,
* the packet is received.
* Parameters:
* @param: void
* @return: Function returns TRUE if the RF sent data was finshed.
******************************************************************************/
void SetUartToRxMode()//this is the code which runs after the uart data has been received
{
unsigned char i;
if(UARTlen==PACKET_LENGTH) // 去掉干扰
return;
radioPktBuffer[0] = UARTlen;
for(i=1;i<radioPktBuffer[0]+1;i++)
radioPktBuffer[i] = UARTrxtxbuf[i-1];
UartFlgClear();
SetRFToTxMode(); // get the uart received data to send in RF
}
/******************************************************************************
* @fn: SetUartToTxMode
* @brief:
* This function set Uart to transfer Mode.
* Parameters:
* @param: void
* @return: void.
******************************************************************************/
void SetUartToTxMode()
{
#if 1
pUartTxData = radioPktBuffer+1;
pUartTxDatalen = radioPktBuffer[0];
INT_SETFLAG(INUM_UTX0, INT_SET); // turn state to uart tx
#endif
#if 0 //rssi
byte temp;
rssi_dec = radioPktBuffer[radioPktBuffer[0]+1];
if(rssi_dec>128)
rssi_dBm = (word)((word)(rssi_dec-256)/2)-rssi_offset;
else
rssi_dBm = (rssi_dec/2)-rssi_offset;
temp= 0-rssi_dBm;
radioPktBuffer[radioPktBuffer[0]+1] = ((temp/10)<<4|(temp%10));
pUartTxData = radioPktBuffer+1;
pUartTxDatalen = radioPktBuffer[0]+1;
INT_SETFLAG(INUM_UTX0, INT_SET); // turn state to uart tx
#endif
}
/******************************************************************************
* @fn: Reset
* @brief:
* This function make WDT timer over,the MCU is reset.
* Parameters:
* @param: void
* @return: void.
******************************************************************************/
void Reset(void)
{
EA=0;
WDCTL=0x08|M_SEC_2;
while (1) {
asm("NOP");
}
}
/******************************************************************************
* @fn: DMAClear
* @brief:
* This function clear the DMA channel0 and channel1,ready to RF rx or tx.
* Parameters:
* @param: void
* @return: void.
******************************************************************************/
void DMAClear(void)
{
RFIF &= ~IRQ_DONE; // Tx/Rx completed, clear interrupt flag
S1CON &= ~0x03; // Clear the general RFIF interrupt registers
rfRcvdSentFlag = false;
dmaRadioSetup();
IEN2 |= 0x01; // Enable RF general interrupt
RFIM = IRQ_DONE; // Mask IRQ_DONE flag only
EA = 1; // Enable interrupts globally
DMAARM = DMAARM_CHANNEL1|0x80;
DMAARM = DMAARM_CHANNEL0|0x80;
RFST = STROBE_SIDLE;
}
/******************************************************************************
* @fn: UartFlgClear
* @brief:
* This function clear the uart receiver flag variable.
* Parameters:
* @param: void
* @return: void
******************************************************************************/
void UartFlgClear(void)
{
UARTlen = 0;//uart buf len clear
uartRxTimeout = false;
WaitUARTtime = 0;
U0CSR |= 0x40; // ensable uart rx
}
/******************************************************************************
* @fn: main
* @brief:
* This function is main.
* Parameters:
* @param: void
* @return: void.
******************************************************************************/
void main (void)
{
SET_MAIN_CLOCK_SOURCE(CRYSTAL);
CLKCON = (CLKCON&0xC7);
EA = 0; // disenable interrupts globally
InitAll(); //I/O init
timer1Init(); //timer1 init
halRfConfig(); //config RF
dmaRadioSetup(); //RF DMA seting
InitWDT();//开启看门狗
WDT_RESET();//喂狗
UartFlgClear();
DMAClear();
P2_0 = 0;
while(1)
{
WDT_RESET();//喂狗
SetRFToRxMode();
if(uartRxTimeout)
{
IEN2 &= ~0x01; // disable RF general interrupt
U0CSR &= ~0x40; // disable uart rx
SetUartToRxMode();
}
}
}
// The only interrupt flag which throws this interrupt is the IRQ_DONE interrupt.
// So this is the code which runs after a packet has been received or
// transmitted.
#pragma vector=RF_VECTOR
__interrupt void rf_IRQ(void)
{
RFIF &= ~IRQ_DONE; // Tx/Rx completed, clear interrupt flag
S1CON &= ~0x03; // Clear the general RFIF interrupt registers
rfRcvdSentFlag = true;
}
/*-------------------------------------*
* 串口接收中断服务程序 *
*---------------------------------------------------------------------------*/
#pragma vector=URX0_VECTOR
__interrupt void uartRxIrq(void)
{
INT_SETFLAG(INUM_URX0, INT_CLR);
UARTrxtxbuf[UARTlen++] = U0DBUF;
WaitUARTtime = 0;
if(UARTlen >PACKET_LENGTH)//长度大于PACKET_LENGTH 不收
{
UARTlen = PACKET_LENGTH;//超过长度的数据不接收 均存在最后一个缓存里面
}
}
/*-------------------------------------*
* 串口发送中断服务程序 *
*---------------------------------------------------------------------------*/
#pragma vector=UTX0_VECTOR
__interrupt void uartTxIrq(void)
{
EA = false;
INT_SETFLAG(INUM_UTX0, INT_CLR);
P2_0 = 0;
while(pUartTxDatalen)
{
U0DBUF = *pUartTxData;
while(U0CSR&0x01); // read the USART0 transmit active status until to be free
pUartTxData++;
pUartTxDatalen--;
}
P2_0 = 1;
EA = true;
}
//----------------------------------------------------------------------------
// 定时器1中断服务程序
//----------------------------------------------------------------------------
#pragma vector=T1_VECTOR
__interrupt void T1_IRQ(void)
{
EA = false;
/* T1 overflow */
if(T1CTL & 0x10)
{
WaitRFtime++;
ResetTime++;
if(UARTlen!=0)
{
if(WaitUARTtime++>1)//30ms内没有接受到数据 认为接收完成
{
uartRxTimeout = true;
}
}
}
EA = true;
T1CTL &= ~0x10;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?