⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7960.c

📁 我里面有比较详细的7960的PDF
💻 C
字号:
#include "include.h"

//*************************************************************************************************
// 功能描述 : 初始化I/O
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void InitPort(void)
{
    EnableSet;

    TRFDirOUT;			        // 设置并口输出0 
    TRFFunc;
    TRFWrite = 0x00;	                        //

    clkOFF;
    clkPINset;			        // CLK 输出 

    irqPINset;
    irqEDGEset;			        // IRQ上升沿中断

    LEDallOFF;
    LEDportSET;
    LEDpowerON;
    
    OOKdirIN;		                        // 设置OOK 端口   
}						

//*************************************************************************************************
// 功能描述 : 简单结束并口通信
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void STOPcondition(void)
{
    TRFWrite |= 0x80;	
    clkON;
    TRFWrite = 0x00;
    clkOFF;
}						

//*************************************************************************************************
// 功能描述 : 彻底结束并口通信
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void STOPcont(void)
{
    TRFWrite = 0x00;
    TRFDirOUT;
    TRFWrite = 0x80;
    TRFWrite = 0x00;
}	

//*************************************************************************************************
// 功能描述 : 并口通信起始
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void STARTcondition(void)
{
    TRFWrite = 0x00;
    clkON;
    TRFWrite = 0xff;
    clkOFF;
}	

//*************************************************************************************************
// 功能描述 : 单个写
// 输入参数 : 内容指针,长度
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void WriteSingle(unsigned char *pbuf, unsigned char lenght)
{
    unsigned char i;
    STARTcondition();
    while(lenght > 0)
    {
        *pbuf = (0x1f &*pbuf);	                        // 设置地址为非连续写  register address 
        for(i = 0; i < 2; i++)                          // 单个地址和数据写操作
        {
            TRFWrite = *pbuf;	                        //发送命令和数据 
            clkON;
            clkOFF;
            pbuf++;
            lenght--;
        }
    }	
    STOPcondition();
}		

//*************************************************************************************************
// 功能描述 : 连续写
// 输入参数 : 内容指针,长度
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void WriteCont(unsigned char *pbuf, unsigned char lenght)
{
    STARTcondition();
    *pbuf = (0x20 | *pbuf);                             // 设置地址写为连续模式   address, write, continous
    *pbuf = (0x3f & *pbuf);	                        // 设置寄存器地址 
    
    while(lenght > 0)
    {
        TRFWrite = *pbuf;	                        //发送命令
        clkON;
        clkOFF;
        pbuf++;
        lenght--;
    }						
    STOPcont();
}	 

//*************************************************************************************************
// 功能描述 : 单个读
// 输入参数 : 地址和长度
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void ReadSingle(unsigned char *pbuf, unsigned char lenght)
{
    STARTcondition();
    while(lenght > 0)
    {
        *pbuf = (0x40 | *pbuf);                         //地址, 读,单个
        *pbuf = (0x5f & *pbuf);	                        //积存器地址 

        TRFWrite = *pbuf;	                        // 发送命令
        clkON;
        clkOFF;

        TRFDirIN;	                        // 上升沿读取数据 
        clkON;
        *pbuf = TRFRead;
        clkOFF;

        TRFWrite = 0x00; 
        TRFDirOUT;

        pbuf++;
        lenght--;
    }	
    STOPcondition();
}		


//*************************************************************************************************
// 功能描述 : 连续读
// 输入参数 : 地址和长度
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void ReadCont(unsigned char *pbuf, unsigned char lenght)
{
    STARTcondition();
    *pbuf = (0x60 | *pbuf);                             //地址, 读,连续 
    *pbuf = (0x7f & *pbuf);	                        //积存器地址
    TRFWrite = *pbuf;	                        //发送命令 
    clkON;
    clkOFF;
    TRFDirIN;		                        //上升沿读取数据 

    while(lenght > 0)
    {
        clkON;
        *pbuf = TRFRead;

        clkOFF;
        pbuf++;
        lenght--;
    }						
    STOPcont();
}	

//*************************************************************************************************
// 功能描述 : 发送命令
// 输入参数 : 命令指针
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void DirectCommand(unsigned char *pbuf)
{
    STARTcondition();
    *pbuf = (0x80 | *pbuf);                                 //命令 
    *pbuf = (0x9f & *pbuf);	                            //命令码
    TRFWrite = *pbuf;		            //发送命令 
    clkON;
    clkOFF;
    STOPcondition();
}	

//*************************************************************************************************
// 功能描述 : 直接写数据
// 输入参数 : 数据指针,长度
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void RAWwrite(unsigned char *pbuf, unsigned char lenght)
{
    STARTcondition();
    while(lenght > 0)
    {
        TRFWrite = *pbuf;	                            //发送命令 
        clkON;
        clkOFF;
        pbuf++;
        lenght--;
    }						
    STOPcont();
}	


//*************************************************************************************************
// 功能描述 : 初始化7860
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void Initial7960s(void)
{    
    unsigned char command[2];
    
    TRFDisable;                                                 // 复位TRF7960
    DelayMs(8);
    TRFEnable;
    
    command[0] = ModulatorControl;
    command[1] = 0x01;                                          //调制形式为 OOK  
    WriteSingle(command, 2);
    command[0] = ModulatorControl;
    ReadSingle(command, 1);
}

//*************************************************************************************************
// 功能描述 : IRQ中断处理
// 输入参数 : FIFO状态
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void InterruptHandlerReader(unsigned char *Register)
{
// TX IRQ 
     if(*Register == 0xA0)                                      //正在发送,并且FIFO只剩下3字节
     {					
         i_reg = 0x00;
     }
     else if(*Register == BIT7)                                 // 在TX开始时置位,TX完毕后产生中断,发送完毕
     {				
         i_reg = 0x00;
         *Register = Reset;	                                // FIFO 复位
         DirectCommand(Register);
     }
// RX IRQ 
    else if(*Register == 0x60)                                  //  FIFO 中数据超过 75% (9 bytes) 
    {         			
         i_reg = 0x01;                                          // 仍然是接收状态
         buf[RXTXstate] = FIFO;
         ReadCont(&buf[RXTXstate], 9);	                // 从 FIFO 读 9 bytes 
         RXTXstate = RXTXstate + 9;
         if(irqPORT & irqPIN)       
         {
              *Register = IRQStatus;	                // IRQ 状态积存器地址 
              ReadSingle(Register, 1);	
              irqCLR;

              if(*Register == 0x40)                             // 接收完成
              {	
                   *Register = FIFOStatus;
                   ReadSingle(Register, 1);		//判断在FIFO中剩余的BYTES
                   *Register = 0x0F & (*Register + 0x01);       //
                   buf[RXTXstate] = FIFO;		//将接收的内容放到正确的缓存中
                                                                                                                                                                                                                             
                   ReadCont(&buf[RXTXstate], *Register);
                   RXTXstate = RXTXstate + *Register;

                   *Register = TXLenghtByte2;		 //判断是否有数据损坏 
                   ReadSingle(Register, 1);		 //判断损坏的位数 

                   if((*Register & BIT0) == BIT0)
                   {
                        *Register = (*Register >> 1) & 0x07;	// 隐藏前面无关的5位
                        *Register = 8 - *Register;              //坏掉的位数
                        buf[RXTXstate - 1] &= 0xFF << *Register;
                   }			
                   i_reg = 0xFF;		//接收结束
                   *Register = Reset;		// FIFO 复位
                   DirectCommand(Register);
              }
              else if(*Register == 0x50)                        //CRC错误
              {				//接收结束,并且错误 
                   i_reg = 0x02;
              }
         }
         else                                                   // 接收完毕中断
         {
              Register[0] = IRQStatus;
              ReadSingle(Register, 2);	                
              if(Register[0] == 0x00)
              {
                 i_reg = 0xFF;
              }
         }
    }
    else if(*Register == BIT6)                                  // RX结束
    {	                     
        if(RXErrorFlag == RXERROR)                              // CRC错误 BIT60x0f
         {
              i_reg = 0x02;                                     // RX 完成
              return;
         }

         *Register = FIFOStatus;
         ReadSingle(Register, 1);		//确定FIFI中剩余的字节数
         *Register = (0x0F & *Register) + 0x01;                 // data bytes + addr
         buf[RXTXstate] = FIFO;			// 将接收的数据放入缓存中;
                                                                                                                                                                                        
         ReadCont(&buf[RXTXstate], *Register);
         RXTXstate = RXTXstate + *Register;

        *Register = TXLenghtByte2;		//判断是否有数据损坏
         ReadSingle(Register, 1);		//判断损坏的位数
         if((*Register & BIT0) == BIT0)
         {
              *Register = (*Register >> 1) & 0x07;	// 隐藏前面无关的5位
              *Register = 8 -*Register;
              buf[RXTXstate - 1] &= 0xFF << *Register;
         } 					
         *Register = Reset;			//接收完成复位FIFO
         DirectCommand(Register);
         i_reg = 0xFF;			//最后接收的字节
    }
    else if((*Register & BIT4) == BIT4)                         // CRC错误
    {						
         if((*Register & BIT5) == BIT5)                         // 是否有FIFO益出中断
         {
              i_reg = 0x01;	                                // 正在RX 
              RXErrorFlag = RXERROR;
         }
         else
         {
              i_reg = 0x02;	                                // RX结束 无FIFO益出
         }
    }
    else if((*Register & BIT2) == BIT2)                         // byte framing 错误
    {					
         if((*Register & BIT5) == BIT5)
         {
             i_reg = 0x01;	                                 //正在RX 
             RXErrorFlag = RXERROR;
         }
         else
         {
              i_reg = 0x02;	                                //RX结束
         }
    }
    else if(*Register == BIT0)
    {			                //无应答中断
         i_reg = 0x00;
    }
    else
    {			                //其他中断处理 
        i_reg = 0x02;
        
        *Register = StopDecoders;	                //接收完成复位FIFO
        DirectCommand(Register);
        
        *Register = Reset;
        DirectCommand(Register);
        
        *Register = IRQStatus;		                
        ReadSingle(Register, 1);	                
        irqCLR;
    }
}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -