aishadow 发表于 2012-6-22 18:27:00

四轴飞行器 源代码 有兴趣一起研究下

本帖最后由 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;
}

260186221 发表于 2012-8-28 14:02:16

楼主有点扯为何不把全部源代码上传?只是贴看不懂的

lxl_lw 发表于 2012-8-28 17:28:02

水帖,不解释。

pine222 发表于 2012-9-8 20:45:55

加个注释啊

zhuizhudelan 发表于 2012-9-13 11:40:25

水贴,最讨厌这种自私鬼,都贴上来啊。又不是专利!{:shutup:}

renkd 发表于 2012-9-13 23:24:03

wo shi lu guo de .

eva_yang 发表于 2012-11-28 16:47:05

这个代码木有看头。。木用..

松夏0928 发表于 2013-5-27 04:23:09

我日,乱发

sunliezhi 发表于 2013-5-27 12:28:05

这段代码是CC2500的驱动代码,在飞行模式代码中调用CC2500_SendData()发送不同的命令来实现左飞飞、右飞飞、筋斗云....{:lol:}

woshisangao 发表于 2013-5-28 11:15:33

不懂。。。

jialing678 发表于 2013-5-29 21:01:07

你发的啥东西,俺看不懂

xiefy21 发表于 2013-8-12 22:40:39

mark……
顶一个…

磊磊映画 发表于 2013-9-28 21:43:36

库函数 头文件呢

小乖 发表于 2013-9-29 17:51:32

坑爹{:shocked:}{:shocked:}{:shocked:}{:shocked:}

金牛AKI 发表于 2013-9-29 18:19:58

这不是全部的源代码可好?
页: [1]
查看完整版本: 四轴飞行器 源代码 有兴趣一起研究下