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

📄 cc2420.c

📁 该程序通过调试
💻 C
字号:
/***************************************
*2008,浙江工业大学信息与控制研究所
*All rights reserved
*
*文件名称:cc2420.c
*摘    要:无线收发芯片cc2420驱动程序
*
*当前版本:1.0
*作    者:董齐芬
*完成日期:2008.8.11
****************************************/

#include "cc2420.h"
#include "spi.h"
#include "common.h"

/*******************************************
*函数功能:写命令寄存器
*输入参数:命令字
*输出参数:无
*返 回 值:状态寄存器的值
********************************************/
unsigned char Write_Command(unsigned char command)
{
  unsigned char statueval;
  
  enable_spi();     //使能SPI口
  statueval=SpiWrite(command);
  disable_spi();      //禁止SPI口  
  
  return statueval;
}

/*******************************************
*函数功能:读状态寄存器
*输入参数:无
*输出参数:无
*返 回 值:状态寄存器的值
********************************************/
unsigned char Read_Status(void)
{
  unsigned char statuevalue;
  statuevalue=Write_Command(SNOP);        //空操作命令,为了读取当前状态寄存器的值
  return statuevalue;
}

/*******************************************
*函数功能:写配置字
*输入参数:Addr:配置寄存器的地址;
           DataH:配置字的高字节;
		   DataL:配置字的低字节;
*输出参数:无
*返 回 值:状态寄存器的值
********************************************/
unsigned char Write_ConfigureWord(unsigned char Addr,unsigned char DataH,unsigned char DataL)
{
  unsigned char statuevalue;
  
  // enable_spi();     //使能SPI口   以具体情况而定使能/禁止SPI口放在何处
  statuevalue=SpiWrite(Addr);  //发送配置寄存器的地址,同时返回当前状态寄存器的值
  SpiWrite(DataH); //发送配置字的高字节
  SpiWrite(DataL); //发送配置字的低字节
  // disable_spi();      //禁止SPI口  
 
  return statuevalue;
}

/*******************************************
*函数功能:读配置字
*输入参数:Addr:配置寄存器的地址;	   
*输出参数:DataH:配置字的高字节;
           DataL:配置字的低字节;
*返 回 值:状态寄存器的值
********************************************/
unsigned char Read_ConfigureWord(unsigned char Addr,unsigned char *DataH,unsigned char *DataL)
{
  unsigned char statuevalue;
  
  Addr|=0x40;     //读标志位为1
  enable_spi();     //使能SPI口   以具体情况而定使能/禁止SPI口放在何处
  statuevalue=SpiWrite(Addr);  //发送配置寄存器的地址,同时返回当前状态寄存器的值
  *DataH=SpiWrite(0xff); //读配置字的高字节
  *DataL=SpiWrite(0xff); //读配置字的低字节
  disable_spi();      //禁止SPI口  
 
  return statuevalue;
}

/*******************************************
*函数功能:读RXFIFO 
*输入参数:Data_Num:欲读取的字节个数
*输出参数:p_Data:存储数据的缓存首地址;
*返 回 值:状态寄存器的值
********************************************/
unsigned char Read_RXFIFO(unsigned char Data_Num,unsigned char *p_Data) 
{
  unsigned char statuevalue,Addr,i;
  
  Addr=RXFIFO|0x40;     //读标志位为1
  enable_spi();         //使能SPI口 
  statuevalue=SpiWrite(Addr);
  
  for(i=0;i<Data_Num;i++)
  {
    *(p_Data+i)=SpiWrite(0xff);
  }
  
  disable_spi();      //禁止SPI口  
 
  return statuevalue;
}

/*******************************************
*函数功能:读一字节RXFIFO
*输入参数:无
*输出参数:无
*返 回 值:读取的数据
********************************************/
unsigned char Read_RXFIFO_Byte(void)
{
  unsigned char readvalue,Addr;
  
  Addr=RXFIFO|0x40;     //读标志位为1
  enable_spi();         //使能SPI口 
  SpiWrite(Addr);
  readvalue=SpiWrite(0xff);
  disable_spi();      //禁止SPI口  
  return readvalue;  
}

/*******************************************
*函数功能:写TXFIFO
*输入参数:Data_Num:欲写入的字节个数
*输出参数:p_Data:存储数据的缓存首地址;
*返 回 值:状态寄存器的值
********************************************/
unsigned char Write_TXFIFO(unsigned char Data_Num,unsigned char *p_Data)
{
  unsigned char statuevalue,i;
  
  enable_spi();         //使能SPI口 
  SpiWrite(TXFIFO);
  
  for (i=0;i<Data_Num;i++)
  {
    statuevalue=SpiWrite(*(p_Data+i));
	
	if ((statuevalue&(1<<TX_UNDERFLOE))!=0x00)         //发生下溢
	{
	  Write_Command(SFLUSHTX);
	  enable_spi();     //重新使能SPI口
	}
  }
  
  disable_spi();      //禁止SPI口 
  return statuevalue;
} 

/*******************************************
*函数功能:写一字节TXFIFO
*输入参数:p_Data:要写入的数据
*输出参数:无
*返 回 值:状态寄存器的值
********************************************/
unsigned char Write_TXFIFO_Byte(unsigned char p_Data)
{
  unsigned char statuevalue;
  
  enable_spi();         //使能SPI口 
  SpiWrite(TXFIFO);  
  statuevalue=SpiWrite(p_Data);
  disable_spi();      //禁止SPI口 
  return statuevalue;
}

/*******************************************
*函数功能:写RAM 
*输入参数:p_Data:存储数据的缓存首地址;
           Data_Num:要写入的字节数
		   AddrH:在选定的RAM存储块中确定RAM地址
		   AddrL:选择RAM存储块
*输出参数:无
*返 回 值:状态寄存器的值
********************************************/
unsigned char Write_RAM(unsigned char AddrH,unsigned char AddrL,unsigned char Data_Num,unsigned char *p_Data)
{
  unsigned char statuevalue,i;
  AddrH|=0X80;      //访问RAM位置1
  AddrL<<=6;
  AddrL&=0XDF;      //读写操作位置0,表示写操作
  
  enable_spi();         //使能SPI口 
  statuevalue=SpiWrite(AddrH);  
  SpiWrite(AddrL);
  
  for (i=0;i<Data_Num;i++)
  {
    SpiWrite(*(p_Data+i));
  }
  
  disable_spi();      //禁止SPI口 
  return statuevalue;
}

/*******************************************
*函数功能:写一字节RAM
*输入参数:p_Data:要写入的数据
           AddrH:在选定的RAM存储块中确定RAM地址
		   AddrL:选择RAM存储块
*输出参数:无
*返 回 值:状态寄存器的值
********************************************/
unsigned char Write_RAM_Byte(unsigned char AddrH,unsigned char AddrL,unsigned char p_Data)
{
  unsigned char statuevalue;
  AddrH|=0X80;      //访问RAM位置1
  AddrL<<=6;
  AddrL&=0XDF;      //读写操作位置0,表示写操作
  
  enable_spi();         //使能SPI口 
  statuevalue=SpiWrite(AddrH);  
  SpiWrite(AddrL);
  
  SpiWrite(p_Data); 
   
  disable_spi();      //禁止SPI口 
  return statuevalue;
}

/*******************************************
*函数功能:读RAM
*输入参数:p_Data:存储数据的缓存首地址;
           Data_Num:要读取的字节数
		   AddrH:在选定的RAM存储块中确定RAM地址
		   AddrL:选择RAM存储块
*输出参数:无
*返 回 值:状态寄存器的值
********************************************/
unsigned char Read_RAM(unsigned char AddrH,unsigned char AddrL,unsigned char Data_Num,unsigned char *p_Data)  
{
  unsigned char statuevalue,i;
  AddrH|=0X80;      //访问RAM位置1
  AddrL<<=6;
  AddrL|=0X20;      //读写操作位置1,表示读操作
  
  enable_spi();         //使能SPI口 
  statuevalue=SpiWrite(AddrH);  
  SpiWrite(AddrL);
  
  for (i=0;i<Data_Num;i++)
  {
    *(p_Data+i)=SpiWrite(0xff);
  }
  
  disable_spi();      //禁止SPI口 
  return statuevalue;
}

/*******************************************
*函数功能:读一字节RAM
*输入参数:AddrH:在选定的RAM存储块中确定RAM地址
		   AddrL:选择RAM存储块
*输出参数:无
*返 回 值:读取的数据值
********************************************/
unsigned char Read_RAM_Byte(unsigned char AddrH,unsigned char AddrL)
{
  unsigned char readvalue;
  AddrH|=0X80;      //访问RAM位置1
  AddrL<<=6;
  AddrL|=0X20;      //读写操作位置1,表示读操作
  
  enable_spi();         //使能SPI口 
  SpiWrite(AddrH);  
  SpiWrite(AddrL);                         
  
  readvalue=SpiWrite(0xff); 
  
  disable_spi();      //禁止SPI口 
  return readvalue;
}

/*******************************************
*函数功能:关闭电压校准器模式
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void PowerOff(void)
{
  PORTE &=~(1<<VREGEN);     //禁止电压校准器   
}

/*******************************************
*函数功能:从电压校准器关闭模式转换到掉电模式 
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void PwOff_PwDown(void)  
{
  PORTE |=1<<VREGEN;     //启动电压校准器  
  Delay600us();  
  
  enable_spi();     //使能SPI口 
  Write_ConfigureWord(MAIN,0x78,0x00);  //先将reset位设置为低  
  Write_ConfigureWord(MAIN,0xf8,0x00);  //先将reset位设置为高,完成复位过程
  disable_spi();      //禁止SPI口 
  
}

/*******************************************
*函数功能:其他任何模式转换到掉电模式 
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void AllStates_PwDown(void)   
{
  Write_Command(SXOSCOFF);
}

/*******************************************
*函数功能:从掉电模式转换到空闲模式 
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void PwDown_Idle(void)
{
  unsigned char statue;
  Write_Command(SXOSCON);
  
  while(1)              //等待晶体振荡器稳定运行
  {
    statue=Read_Status();
    if((statue&(1<<XOSC16M_STABLE))!=0)
	{
	  break;
	}
  }
} 

/*******************************************
*函数功能:从其他任何模式转换到空闲模式 
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void AllStates_Idle(void)   
{
  Write_Command(SRFOFF);
}   

/*******************************************
*函数功能:从空闲模式启动发送 
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void Idle_Tx(void)  
{
  Write_Command(STXON);
}    

/*******************************************
*函数功能:从接收状态转换到发送模式
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void Rx_Tx(void)                     
{
  while(1)
  {
    if((PINA&(1<<CCA))!=0)      //信道空闲
    {
    Write_Command(STXONCCA);  
	break;
    }
  }
} 

/*******************************************
*函数功能:从空闲模式启动接收模式
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void Idle_Rx(void)
{
  Write_Command(SRXON);
}     

/*******************************************
*函数功能:设置配置字(用于初始化)
*输入参数:无
*输出参数:无
*返 回 值:无
********************************************/
void Set_Configure(void)       
{
  unsigned char RegisterValueH,RegisterValueL;
  PowerOff();   //???????????????????????????????
  PwOff_PwDown();  //在power down模式下设置配置寄存器
  
  enable_spi();     //使能SPI口 
  
  RegisterValueH=0X0A;
  RegisterValueL=0XE2;  //地址认证使能,自动应答不使能
  Write_ConfigureWord(MDMCTRL0,RegisterValueH,RegisterValueL); 
  
  RegisterValueH=0X05;
  RegisterValueL=0X00; 
  Write_ConfigureWord(MDMCTRL1,RegisterValueH,RegisterValueL); 
  
 // RegisterValueH=-50;
 // RegisterValueL=0X00; 
 // Write_ConfigureWord(RSSI,RegisterValueH,RegisterValueL); //???????????????????????调试时修改
  
  RegisterValueH=0x41;
  RegisterValueL=0X92;    //2.45GHz
  Write_ConfigureWord(FSCTRL,RegisterValueH,RegisterValueL); 
  
  RegisterValueH=0x01;
  RegisterValueL=0Xe4;    //安全模式不使能
  Write_ConfigureWord(SECCTRL0,RegisterValueH,RegisterValueL); 
  
  //RegisterValueH=128;
  //RegisterValueL=128; 
  //Write_ConfigureWord(SECCTRL1,RegisterValueH,RegisterValueL); //???????????????????????调试时修改
  
  RegisterValueH=0;
  RegisterValueL=TX_length;  //RXFIFO的极限值
  Write_ConfigureWord(IOCFG0,RegisterValueH,RegisterValueL); //???????????????????????调试时修改
  
  disable_spi();      //禁止SPI口 
}
  
  
  
                       
	  
	
  
  
                                  

⌨️ 快捷键说明

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