📄 main.c
字号:
//#define XRDY 0X0002
//#define RRDY 0X0002
#define nop asm(" NOP ")
#define set_spi_cs() SPSD |= 0X0008
#define clr_spi_cs() SPSD &= 0XFFF7
#define set_spi_clk() SPSD |= 0X0002
#define clr_spi_clk() SPSD &= 0XFFFD
#define set_spi_di() SPSD |= 0X0020
#define clr_spi_di() SPSD &= 0XFFDF
#define read_spi_do SPSD & 0X0010
#define reset 15
ioport unsigned char port1;
//int i=0;
unsigned int counter=0;
#include "mcbsp.h"
#include "HPI.H"
#include "CC2400.H"
unsigned char CC2400status;
unsigned int sramaddr = 0x8000;//发送数据起始地址
unsigned int READ_DATA = 0x8100;//发送数据起始地址
void init_pll();
void Init_HPI();
void data_buffer(void);
void write_fifo();
void mcbsp_gpio();
interrupt void xint0();
interrupt void xint1();
void SPI_STROBE(unsigned char Address);
void SPI_RX_ADDR(unsigned char Address);
void spi_write(unsigned char spi_bValue);
void SPI_SETREG(unsigned char Address,unsigned char Var_High,unsigned char Var_Low);
void rfInit();
void SPI_UPD_STATUS(unsigned char spi_bValue);
void spi_write_data_16(unsigned int out_data);
void Init_cc2400();
void rfon(void);
void SPI_GETREG(unsigned char spi_bValue);
void SPI_RX_ADDR(unsigned char spi_bValue);
void read_fifo();
void delay();
void delay_Nms(unsigned int n);
/*********************************************************************************
* 无线发送主函数
*********************************************************************************/
void main(void)
{
//int i;
PMST = 0XA8;
port1 = 0x08;
init_pll();
Init_HPI();
mcbsp_gpio();
data_buffer();
Init_cc2400();
asm (" SSBX INTM ");//关中断
IMR = 1;//允许INT0中断
// IMR = 2;//允许INT1中断
IFR =0XFF;//清除所有挂起的中断
asm (" RSBX INTM ");//开中断
//发送
//GPIOSR |=RX_HIGH;
// SPI_GETREG(CC2400_FSMSTATE);
//SPI_STROBE(CC2400_STX);
//for(;;)
//{
// write_fifo();
SPI_SETREG(0X70, 0X00,0X01);
SPI_SETREG(0X70, 0X02,0X03);
SPI_SETREG(0X70, 0X04,0X05);
SPI_SETREG(0X70, 0X06,0X07);
SPI_SETREG(0X70, 0X08,0X09);
SPI_SETREG(0X70, 0X0A,0X0B);
SPI_SETREG(0X70, 0X0C,0X0D);
SPI_SETREG(0X70, 0X0E,0X0F);
//}
//for (i=0;i<100;i++)
// {
// for(;;)
SPI_GETREG(0X70);
SPI_GETREG(0X70);
SPI_GETREG(0X70);
SPI_GETREG(0X70);
SPI_GETREG(0X70);
SPI_GETREG(0X70);
SPI_GETREG(0X70);
SPI_GETREG(0X70);
// {
// read_fifo();
// }
// write_fifo();
//}
SPI_STROBE(CC2400_STX);
// SPI_GETREG(CC2400_FSMSTATE);
//发送
//GPIOSR |=RX_LOW;
for(;;)
{
}
}
/*********************************************************************************
* 设置DSP工作频率
*********************************************************************************/
void init_pll()
{
int i;
CLKMD = 0;
do{
i=0x01&CLKMD;
}
while(i!=0);
CLKMD = 0x47ff;//1倍16MHZ
i=0;
}
/*********************************************************************************
* 发送数据缓冲区填充
*********************************************************************************/
//144*180字=0X6540字
void data_buffer(void)
{
unsigned int i;
for(i =0; i<0xff;i++)//0x6540
{
*(unsigned int *)sramaddr++ = i+0x4412;
}
sramaddr=0X8000;
i=0;
}
/*********************************************************************************
* 将HPI配置为IO接口
*********************************************************************************/
void Init_HPI()
{
GPIOCR = GPIOCR & 0X0F9;//HD1(GIO6)、 HD2(GIO1)输入
GPIOCR = GPIOCR | 0X009;//HD0(TX)、 DD3(RX)输出
}
/*********************************************************************************
* 将MCBSP配置为SPI接口
*********************************************************************************/
void mcbsp_gpio()
{
//地1步XRST=RRST=0;
SPSA=SPCR1;
SPSD = 0X0000;
SPSA=SPCR2;
SPSD = 0X0000;
SPSA=PCR;
SPSD = 0X3F00;
}
/*********************************************************************************
* FIFO写函数
*********************************************************************************/
void write_fifo()
{
int i;
//CS=0;
clr_spi_cs();
//FIFO寄存器地址;
spi_write(CC2400_FIFOREG);
//连续写入要发送的15个字+1个长度字节,31字节
for(i=0;i<8;i++)
{
spi_write_data_16(*((unsigned int *)sramaddr++));
if(sramaddr >= 0X80FF)
{
sramaddr=0X8000;
}
//sramaddr +=1;
}
delay();
set_spi_cs();
}
/*******************************************************************************
}**
* 中断0服务函数
*********************************************************************************/
interrupt void xint0() // XINT0中断服务程序(发送完毕中断)
{
delay_Nms(1000);
counter=counter+1;
// SPI_GETREG(CC2400_FSMSTATE);
//关闭
// SPI_STROBE(CC2400_SRFOFF);
//返回FS;
//GPIOSR |=RX_HIGH;
// SPI_GETREG(CC2400_FSMSTATE);
SPI_STROBE(CC2400_SFSON);
// 等待频率合成器锁定
do
{
SPI_UPD_STATUS(CC2400_MAIN);
} while (!(CC2400status & FS_LOCK));
// SPI_GETREG(CC2400_FSMSTATE);
//GPIOSR |=RX_LOW;
//write_fifo();
SPI_SETREG(0X70, 0X00,0X01);
SPI_SETREG(0X70, 0X02,0X03);
SPI_SETREG(0X70, 0X04,0X05);
SPI_SETREG(0X70, 0X06,0X07);
SPI_SETREG(0X70, 0X08,0X09);
SPI_SETREG(0X70, 0X0A,0X0B);
SPI_SETREG(0X70, 0X0C,0X0D);
SPI_SETREG(0X70, 0X0E,0X0F);
SPI_STROBE(CC2400_STX);
// SPI_GETREG(CC2400_FSMSTATE);
}
interrupt void xint1() // XINT1中断服务程序(FIFO空中断)
{
counter=counter+1;
}
/*********************************************************************************
* CC2400初始化
*********************************************************************************/
void Init_cc2400()
{
// RF default state
// GPIOSR = GPIOSR & RX_LOW;//RX = 0;
// GPIOSR = GPIOSR & TX_LOW;//TX = 0;
rfInit();
rfon();
}
/*********************************************************************************
* CC2400寄存器配置
*********************************************************************************/
void SPI_SETREG(unsigned char Address,unsigned char Var_High,unsigned char Var_Low)
{
clr_spi_cs();
spi_write(Address);
spi_write(Var_High);
spi_write(Var_Low);
set_spi_cs();
}
/*********************************************************************************
* 无线初始化(初始化寄存器)
*********************************************************************************/
void rfInit()
{
// unsigned int j;
//for(;;)
//{
// Optional reset
SPI_SETREG(CC2400_MAIN,0x00,0X00);
SPI_SETREG(CC2400_MAIN,0x80,0X00);
// Register settings
SPI_SETREG(CC2400_FSDIV, FSDIV_Var_HIGH,FSDIV_Var_LOW);
SPI_SETREG(CC2400_MDMCTRL, MDMCTRL_Var_HIGH,MDMCTRL_Var_LOW);
SPI_SETREG(CC2400_FREND, FREND_Var_HIGH,FREND_Var_LOW);
SPI_SETREG(CC2400_IOCFG, IOCFG_Var_HIGH,IOCFG_Var_LOW);
SPI_SETREG(CC2400_MDMTST0, MDMTST0_Var_HIGH,MDMTST0_Var_LOW);
SPI_SETREG(CC2400_GRMDM, GRMDM_Var_HIGH,GRMDM_Var_LOW);
SPI_SETREG(CC2400_FSMTC, FSMTC_Var_HIGH,FSMTC_Var_LOW);
SPI_SETREG(CC2400_MANAND, MANAND_Var_HIGH,MANAND_Var_LOW);
SPI_SETREG(CC2400_LMTST, LMTST_Var_HIGH,LMTST_Var_LOW);
SPI_SETREG(CC2400_MDMTST1,MDMTST1_Var_HIGH,MDMTST1_Var_LOW);
SPI_SETREG(CC2400_GRDEC,GRDEC_Var_HIGH,GRDEC_Var_LOW);
//SPI_SETREG(CC2400_INT,INT_Var_HIGH,INT_Var_LOW);
//}
//for(;;)
//{
//读取寄存器值
SPI_GETREG(CC2400_MAIN);
SPI_GETREG(CC2400_FSCTRL);
SPI_GETREG(CC2400_FSDIV);
SPI_GETREG(CC2400_MDMCTRL);
SPI_GETREG(CC2400_AGCCTRL);
SPI_GETREG(CC2400_FREND);
SPI_GETREG(CC2400_RSSI);
SPI_GETREG(CC2400_FREQEST);
SPI_GETREG(CC2400_IOCFG);
SPI_GETREG(CC2400_FSMTC);
SPI_GETREG(CC2400_MANAND);
SPI_GETREG(CC2400_FSMSTATE);
SPI_GETREG(CC2400_ADCTST);
SPI_GETREG(CC2400_RXBPFTST);
SPI_GETREG(CC2400_PAMTST);
SPI_GETREG(CC2400_LMTST);
SPI_GETREG(CC2400_MANOR);
SPI_GETREG(CC2400_MDMTST0);
SPI_GETREG(CC2400_MDMTST1);
SPI_GETREG(CC2400_DACTST);
SPI_GETREG(CC2400_AGCTST0);
SPI_GETREG(CC2400_AGCTST1);
SPI_GETREG(CC2400_AGCTST2);
SPI_GETREG(CC2400_FSTST0);
SPI_GETREG(CC2400_FSTST1);
SPI_GETREG(CC2400_FSTST2);
SPI_GETREG(CC2400_FSTST3);
SPI_GETREG(CC2400_MANFIDL);
SPI_GETREG(CC2400_MANFIDH);
SPI_GETREG(CC2400_GRMDM);
SPI_GETREG(CC2400_GRDEC);
SPI_GETREG(CC2400_PKTSTATUS);
SPI_GETREG(CC2400_INT);
SPI_GETREG(CC2400_SYNCL);
SPI_GETREG(CC2400_SYNCH);
// }
}
/*********************************************************************************
* 发送打开
*********************************************************************************/
void rfon(void)
{
// 晶振工作
SPI_STROBE(CC2400_SXOSCON);
// 等待晶振稳定
do
{
SPI_UPD_STATUS(CC2400_MAIN);
} while (!(CC2400status & XOSC16M_STABLE));
// 打开频率合成器
//R_RX = 1;
//GPIOSR |=RX_HIGH;
//R_TX = 1;
//GPIOSR |=TX_HIGH;
SPI_STROBE(CC2400_SFSON);
// 等待频率合成器锁定
do
{
SPI_UPD_STATUS(CC2400_MAIN);
} while (!(CC2400status & FS_LOCK));
// 开始接收
//if (M_MASTER) {
// R_TX = 0;
//}
}
//向控制选通寄存器写地址
/*********************************************************************************
* CC2400指令选通寄存器访问
*********************************************************************************/
void SPI_STROBE(unsigned char Address)
{
clr_spi_cs();
spi_write(Address);
set_spi_cs();
}
//PCR = 0011 1111 00 DX_TAT(DX输出) DR_STAT(DR输入) FSXP(FSX片选) 0 CLKXP(CLKX时钟) 0
/*********************************************************************************
* 获取CC2400芯片状态
*********************************************************************************/
//获取芯片的状态位CC2400status
void SPI_UPD_STATUS(unsigned char spi_bValue)
{
unsigned int i;
CC2400status=0;
for(i=0;i<8;i++)
{
//时钟低
clr_spi_clk();
CC2400status = (CC2400status <<1);
if ((spi_bValue&0x80)==0x80)
{
set_spi_di();
}
else
{
clr_spi_di();
}
//上升沿
set_spi_clk();
//读取输入状态
if ((read_spi_do)==0X10)
{
CC2400status |= 0X01;
}
else
{
CC2400status &= ~0X01;
}
//下一位
spi_bValue = (spi_bValue << 1);
}
}
/*********************************************************************************
* 单字节写(值或地址)
*********************************************************************************/
//向寄存器写值
void spi_write(unsigned char spi_bValue)
{
int timer;
for(timer=0;timer<8;timer++)
{
//时钟低
clr_spi_clk();
if ((spi_bValue&0x80)==0x80)
{
set_spi_di();
}
else
{
clr_spi_di();
}
//上升沿
set_spi_clk();
//下一位
spi_bValue = (spi_bValue << 1);
}
}
/*********************************************************************************
* 单字写函数(写数据)
*********************************************************************************/
void spi_write_data_16(unsigned int out_data)
{
int count;
for(count=0;count<16;count++)
{
//时钟低
clr_spi_clk();
if ((out_data&0x8000)==0x8000)
{
set_spi_di();
}
else
{
clr_spi_di();
}
//上升沿
set_spi_clk();
//下一位
out_data = (out_data << 1);
}
}
/*********************************************************************************
* 获得寄存器值或FIFO值?
*********************************************************************************/
//读取一寄存器数据(写寄存器后测试用)
unsigned int SPI_RX_WORD()
{
int cishu;
unsigned int In_data=0;
for(cishu=0;cishu<17;cishu++)
{
clr_spi_clk();
In_data=(In_data<<1);
//set_spi_clk();
if ((read_spi_do)==0X10)
{
In_data |= 0X0001;
}
else
{
In_data &= ~0X0001;
}
set_spi_clk();
}
return(In_data);
}
void SPI_RX_ADDR(unsigned char spi_bValue)
{
int shu;
spi_bValue = spi_bValue | 0x80;
for(shu=0;shu<8;shu++)
{
//时钟低
clr_spi_clk();
if ((spi_bValue&0x80)==0x80)
{
set_spi_di();
//counter=counter+1;
}
else
{
clr_spi_di();
}
//上升沿
set_spi_clk();
//下一位
spi_bValue = (spi_bValue << 1);
}
}
void SPI_GETREG(unsigned char spi_bValue)
{
clr_spi_cs();
SPI_RX_ADDR(spi_bValue);
*((unsigned int *)READ_DATA++) = SPI_RX_WORD();//jkdlsfjlasfjlskdjfsaldjfaksjf
delay();
set_spi_cs();
//READ_DATA =READ_DATA+1;
}
void read_fifo()
{
int jishu;
//CS=0;
clr_spi_cs();
//FIFO寄存器地址;
spi_write(CC2400_FIFOREG |0X80);
//连续写读出要发送的15个字+1个长度字节,31字节
for(jishu=0;jishu<8;jishu++)
{
*((unsigned int *)READ_DATA++) = SPI_RX_WORD();
//READ_DATA =READ_DATA+1;
}
clr_spi_clk();
delay();
set_spi_cs();
}
//注:寄存器0X23的值需要变化,以使FIFO每次容纳31字节
void delay()
{
int j;
for(j=0;j<80;j++)
{
nop;
}
}
void delay_Nms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<1000;j++)
{
nop;
nop;
nop;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -