四轴飞行器 源代码 有兴趣一起研究下
本帖最后由 aishadow 于 2012-6-22 18:47 编辑用的是CC2500发送接收数据
有些代码不太明白
发部分代码懂的可以加我Q 314699903共同学习下全套程序
/*======================================================================
; FileName: RF_Transmit.asm
; Device: 2.4G RF Module CC2500
======================================================================*/
#include "N79E85X.h"
#include <intrins.h>
#include "DEF_DataType.h"
#include "UART.h"
#include "main.h"
#include "CC2500_head.h"
//--------------------------------------------------------------
#defineRF_DATA_LEN 16 //发射/接收 字节数
code U8ConfigTab[] = {
0x09, // 00 IOCFG2
DEFAULT_IOCFG1, // 01 IOCFG1 0x2E
0x06, // 02 IOCFG0
0x07, // 03 FIFOTHR
DEFAULT_SYNC1, // 04 SYNC1 0xD3
DEFAULT_SYNC0, // 05 SYNC0 0x91
RF_DATA_LEN, // 06 PKTLEN
0x04, // 07 PKTCTRL1 ;bit3:CRC_AUTOFLUSH, bit2:APPEND_STATUS, bit10:ADR_CHK
0x44, // 08 PKTCTRL0 ;bit6:WHITE_DATA, bit2:CRC_EN
0x00, // 09 ADDR
0x00, // 0A CHANNR
0x09, // 0B FSCTRL1
0x00, // 0C FSCTRL0
0x5C, // 0D FREQ2
0xCE, // 0E FREQ1
0xC4, // 0F FREQ0
0x2C, // 10 MDMCFG4
0xB4, // 11 MDMCFG3
0x73, // 12 MDMCFG2 ;bit6-4:MOD_FORMAT, bit3:MANCHESTER_EN
0x23, // 13 MDMCFG1 ;bit7:FEC_EN
0xFE, // 14 MDMCFG0
0x01, // 15 DEVIATN
0x07, // 16 MCSM2
0x30, // 17 MCSM1
0x18, // 18 MCSM0 ;bit0:XOSC_FORCE_ON
0x1D, // 19 FOCCFG
0x1C, // 1A BSCFG
0xC7, // 1B AGCCTRL2
0x00, // 1C AGCCTRL1
0xB2, // 1D AGCCTRL0
DEFAULT_WOREVT1, // 1E WOREVT1 0x87
DEFAULT_WOREVT0, // 1F WOREVT0 0x6B
DEFAULT_WORCTRL, // 20 WORCTRL 0xF8
0xB6, // 21 FREND1
0x10, // 22 FREND0
0xEA, // 23 FSCAL3
0x0A, // 24 FSCAL2
0x00, // 25 FSCAL1
0x11, // 26 FSCAL0
DEFAULT_RCCTRL1, // 27 RCCTRL1 0x41
DEFAULT_RCCTRL0, // 28 RCCTRL0 0x00
DEFAULT_FSTEST, // 29 FSTEST
DEFAULT_PTEST, // 2A PTEST
DEFAULT_AGCTEST // 2B AGCTEST
};
code U8JumpFreqTab = { 67, 3, 131, 35, 99, 10, 86, 48, 118, 22, 93,
138, 54, 106, 16, 80, 42, 125, 74, 29, 112, 61 };
code U8JumpFreqTab1 = { 60, 111, 28, 73, 124, 34, 79, 15, 105, 53,
137, 92, 21, 117, 47, 85, 9, 41, 98, 130, 66, 2};
code U8JumpFreqTab2 = { 35, 61, 112, 29, 74, 106, 42, 80, 16, 125, 54,
10, 138, 93, 22, 118, 48, 86, 131, 67, 99, 3 };
code U8JumpFreqTab3 = { 33, 65, 97, 129, 20, 52, 84, 116, 8, 40, 72,
104, 136, 27, 59, 91, 123, 14, 46, 78, 110, 1 };
RF_INFOsRfData;
U8FreChnlIndex;
U8SPI_Check(void);
voidCC2500_Reset(void);
voidCC2500_Config(void);
voidUpdateTxData(void);
voidWrite_TxFIFO(void);
//voidSPI_WriteCommand(U8 cmd);
//voidSPI_WriteRegister(U8 addr, U8 tdata);
//U8SPI_ReadRegister(U8 addr);
voidSPI_WriteByte(U8 tdata);
U8SPI_ReadByte(void);
/*==============================================================
//
==============================================================*/
voidCC2500_Initial(void)
{
U8i;
SysFlag = SF_SpiErr;
for(i=0; i<120; i++)
{
if( SPI_Check() )
{
UART_Print("SPI Interface OK\n",0);
SysFlag &= ~SF_SpiErr;
break;
}
}
CC2500_Reset();
CC2500_Config();
}
//======================================================
// (128 - 128*p/147 + AD*p/147)
//======================================================
U8Multiply_Percent(U16 val)
{
U8ret;
if(SysFlag&SF_FastMode)
{
ret = 50 + (U8)((val*90)/147);
}
else
{
ret = 41 + (U8)((val*100)/147);
}
returnret;
}
//==============================================================
//==============================================================
voidCC2500_SendData(void)
{
U8i,CheckSum;
U8* pbuf;
if(!(RockerFlag&RF_ChkThroOK))
return;
if(SysFlag&SF_TxData)//每8MS
{
SysFlag &= ~SF_TxData;
// sRfData.Address = 0x00; //test
sRfData.Thro = ThroData;
sRfData.Rudd = Multiply_Percent(RuddData); //MUL_PERCENT(RuddData,i);
sRfData.Elev = Multiply_Percent(ElevData);
sRfData.Aile = Multiply_Percent(AileData);
sRfData.RuddTrim = RuddTrim;
sRfData.ElevTrim = ElevTrim;
sRfData.AileTrim = AileTrim;
CheckSum = 0;
pbuf = (U8*)(&sRfData);
for(i=0; i<(RF_DATA_LEN-1); i++)
{
CheckSum += *pbuf;
pbuf++;
}
sRfData.CheckSum = CheckSum;
PA_EN = 0;
Write_TxFIFO();
PA_EN = 1;
if(SysFlag&SF_LinkOK)
{
if((sRfData.Address&0x18)==0x08)
i = JumpFreqTab1;
else if((sRfData.Address&0x18)==0x10)
i = JumpFreqTab2;
else if((sRfData.Address&0x18)==0x18)
i = JumpFreqTab3;
else
i = JumpFreqTab;
i += (sRfData.Address&0x07);
}
else
i = JumpFreqTab;
SPI_WriteRegister(CCxxx0_CHANNR, i);
SPI_WriteCommand(CCxxx0_SCAL);
if(FreChnlIndex<20)
FreChnlIndex++;
else
FreChnlIndex = 0;
}
}
//======================================================
voidWrite_TxFIFO(void)
{
U8i;
U8* pbuf;
SPI_WriteCommand(CCxxx0_SIDLE);
SPI_WriteCommand(CCxxx0_SFTX);
pbuf = (U8*)(&sRfData);
CSN = 0;
for(i=0; i<255; i++)
{
if(!MISO) break;
}
SPI_WriteByte(0x40|WRITE_BURST); //0x3F|0x40
for(i=0; i<RF_DATA_LEN; i++)
{
SPI_WriteByte(*pbuf);
pbuf++;
}
CSN = 1;
SPI_WriteCommand(CCxxx0_STX);
#if 0
while(!GDO0); //wait high for start sync
while(GDO0); //wait low for Tx end
#else
TIME_OUT_RST(8);
while(!(SysFlag&SF_TimeOut)) //wait high for start sync
{
for(i=0;i<150;i++);
if(SPI_ReadRegister(CCxxx0_PKTSTATUS)&0x01)
break;
}
TIME_OUT_RST(8);
while(!(SysFlag&SF_TimeOut)) //wait low for Tx end
{
for(i=0;i<150;i++);
if(!(SPI_ReadRegister(CCxxx0_PKTSTATUS)&0x01))
break;
}
// while(!(SPI_ReadRegister(CCxxx0_PKTSTATUS)&0x01)); //wait high for start sync
// while((SPI_ReadRegister(CCxxx0_PKTSTATUS)&0x01)); //wait low for Tx end
#endif
// RockerFlag |= RF_ReadLevel;
}
//======================================================
voidCC2500_Config(void)
{
U8i;
for(i=0; i<0x27; i++)
{
SPI_WriteRegister(i, ConfigTab);
// UART_Print("%x,",ConfigTab);
}
SPI_WriteRegister(CCxxx0_PATABLE, 0xFF); //Output PowerLevel: +1dBm
sRfData.FactroyID = 0x6D; //厂家码
sRfData.BitInfo = 0xC8; //刚开始发的是对码数据,无LCD
}
//======================================================
// |-- t --| ;// t > 40us
//___________ _____ ____________CSn
// |_| |______|
// _ _____________SO(MISO)
//-------------------| |___|
//_____________________<SRES>------------SI(MOSI)
//------------------------------------------------------
voidCC2500_Reset(void)
{
U8i;
CSN = 1;
for(i=0; i<15; i++);
CSN = 0;
for(i=0; i<60; i++);
CSN = 1;
for(i=0; i<150; i++);
SPI_WriteCommand(CCxxx0_SRES);
for(i=0; i<5; i++);
}
//======================================================
U8SPI_Check(void)
{
U8tdata;
SPI_WriteRegister(CCxxx0_CHANNR, 0x59);
SPI_WriteRegister(CCxxx0_ADDR, 0xAA);
tdata = SPI_ReadRegister(CCxxx0_CHANNR);
if(tdata==0x59)
return 1;
else
return 0;
}
//======================================================
voidSPI_WriteCommand(U8 cmd)
{
U8i;
CSN = 0;
for(i=0; i<255; i++)
{
if(!MISO) break;
}
SPI_WriteByte(cmd);
CSN = 1;
}
//======================================================
voidSPI_WriteRegister(U8 addr, U8 tdata)
{
U8i;
CSN = 0;
for(i=0; i<255; i++)
{
if(!MISO) break;
}
SPI_WriteByte(addr);
SPI_WriteByte(tdata);
CSN = 1;
}
//======================================================
U8SPI_ReadRegister(U8 addr)
{
U8i, tdata;
CSN = 0;
for(i=0; i<255; i++)
{
if(!MISO) break;
}
SPI_WriteByte(addr|0x80);
tdata = SPI_ReadByte();
CSN = 1;
return tdata;
}
//======================================================
voidSPI_WriteByte(U8 tdata)
{
U8i;
for(i=0; i<8; i++)
{
SCK = 0;
if(tdata&0x80)
MOSI = 1;
else
MOSI = 0;
_nop_();
SCK = 1;
tdata <<= 1;
}
// SCK = 0;
}
//------------------------------------------------------
U8SPI_ReadByte(void)
{
U8i, tdata;
tdata = 0;
for(i=0; i<8; i++)
{
SCK = 0;
_nop_(); _nop_();
SCK = 1;
tdata <<= 1;
if(MISO)
tdata |= 0x01;
}
// SCK = 0;
return tdata;
} 楼主有点扯为何不把全部源代码上传?只是贴看不懂的 水帖,不解释。 加个注释啊
水贴,最讨厌这种自私鬼,都贴上来啊。又不是专利!{:shutup:} wo shi lu guo de . 这个代码木有看头。。木用.. 我日,乱发 这段代码是CC2500的驱动代码,在飞行模式代码中调用CC2500_SendData()发送不同的命令来实现左飞飞、右飞飞、筋斗云....{:lol:} 不懂。。。 你发的啥东西,俺看不懂 mark……
顶一个… 库函数 头文件呢 坑爹{:shocked:}{:shocked:}{:shocked:}{:shocked:} 这不是全部的源代码可好?
页:
[1]