?? 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 + -