📄 cc2420.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 + -