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 + -
显示快捷键?