历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2020年09月09日 | stm32 驱动2.4g cc2500 无线模块

2020-09-09 来源:eefocus

驱动代码

 

BYTE spi_writebyte(BYTE value)
{
 BYTE i,T;
 
 for(i=8; i; i--)
 { 
  SPI_CLR_CLK();
  SETDATA(value); 

  Delay(3);
  value<<=1;
  SPI_SET_CLK();
  T <<= 1;
  T |= RF_SPI_MISO;
        Delay(1);

 }
 SPI_CLR_CLK();
 return T;
}
/**
*@brief send one byte
**/
void SpiStrobe(value)
{
 SPI_SELECT();
 spi_writebyte(value);
 SPI_DIS_SELECT();
}


/**
*@brief reset cc2500
*@
**/

void POWER_UP_RESET_CCxxx0(void)
{
 WORD i =0 ;

 SpiStrobe(CCxxx0_SIDLE);

 

 Delay(20);

 SPI_SELECT();
// while(1);
 Delay(20);

 SPI_DIS_SELECT();

 Delay(40);

 

 SpiStrobe(CCxxx0_SRES);


 

}


/**
*@brief wirte cc2500 register
*@
*
**/

void cc2500_WriteReg(BYTE addr, BYTE value)
{
 SPI_SELECT();

 addr &= 0x7F;
 spi_writebyte(addr);

 spi_writebyte(value);
 SPI_DIS_SELECT();
}

/**
*@brief read cc2500 register
*@
*
**/


BYTE cc2500_ReadReg(BYTE addr)
{
 BYTE value;

 SPI_SELECT();

 spi_writebyte(addr|0x80);
 value = spi_writebyte(0xff);
    SPI_DIS_SELECT();
 return value;
}

/**
*@brief wirte setting register to cc2500
*@
**/

void cc2500_WriteRfSettings()
{
 
 do{

  cc2500_WriteReg(CCxxx0_FSCTRL1, 0x09); // 0x0c
  cc2500_ReadReg(CCxxx0_FSCTRL1);
  cc2500_WriteReg(CCxxx0_FSCTRL0, 0x00);
  cc2500_WriteReg(CCxxx0_FREQ2, 0x5D);
  cc2500_WriteReg(CCxxx0_FREQ1, 0x93);
  cc2500_WriteReg(CCxxx0_FREQ0, 0xB1);
//#define _10k
#ifdef _10k
  cc2500_WriteReg(CCxxx0_MDMCFG4, 0x78); //0x78-10k   0x86
  cc2500_WriteReg(CCxxx0_MDMCFG3, 0x93); //0x93-10k   0x83
//  halSpiWriteReg(CCxxx0_MDMCFG2, 0x70);
  cc2500_WriteReg(CCxxx0_MDMCFG2, 0x03); //0x03-10k  0x03
  cc2500_WriteReg(CCxxx0_MDMCFG1, 0x22); //0x22-10k  0x22       // 0x22????
  cc2500_WriteReg(CCxxx0_MDMCFG0, 0xF8); //0xf8        0xf8  

#else
  cc2500_WriteReg(CCxxx0_MDMCFG4, 0x2D); //0x78-10k   0x86
  cc2500_WriteReg(CCxxx0_MDMCFG3, 0x3B); //0x93-10k   0x83
//  halSpiWriteReg(CCxxx0_MDMCFG2, 0x70);
  cc2500_WriteReg(CCxxx0_MDMCFG2, 0x73); //0x03-10k  0x03
  cc2500_WriteReg(CCxxx0_MDMCFG1, 0xA2); //0x22-10k  0x22       // 0x22????
  cc2500_WriteReg(CCxxx0_MDMCFG0, 0xF8); //0xf8        0xf8
#endif

  cc2500_WriteReg(CCxxx0_CHANNR, 0x00);
  cc2500_WriteReg(CCxxx0_DEVIATN, 0x01); //0x44       // 00
  cc2500_WriteReg(CCxxx0_FREND1, 0x56);        // 0xB6   56错误机率减少
  cc2500_WriteReg(CCxxx0_FREND0, 0x10);
  cc2500_WriteReg(CCxxx0_MCSM1, 0x00);        // 0X00>NO CCA; 0X30>CCA   ?????
  cc2500_WriteReg(CCxxx0_MCSM0, 0x18);
  cc2500_WriteReg(CCxxx0_FOCCFG, 0x15);        // 0x1D   频率偏移补偿
  cc2500_WriteReg(CCxxx0_BSCFG, 0x6C);        // 0x1c   位同步配置
  cc2500_WriteReg(CCxxx0_AGCCTRL2, 0x07);        // 0xc3    增益控制
  cc2500_WriteReg(CCxxx0_AGCCTRL1, 0x00);        // cca=0x10
  cc2500_WriteReg(CCxxx0_AGCCTRL0, 0x91);        // 0xb2
  cc2500_WriteReg(CCxxx0_FSCAL3, 0xEA);
  cc2500_WriteReg(CCxxx0_FSCAL2, 0x0A);  //0x0a - 250k  0x06 --10k,0x08-2.4k
  cc2500_WriteReg(CCxxx0_FSCAL1, 0x00);        // 增加频率同步校准

  cc2500_WriteReg(CCxxx0_FSCAL0, 0x11);
  cc2500_WriteReg(CCxxx0_FSTEST, 0x59);
  cc2500_WriteReg(CCxxx0_TEST2, 0x8F);        // 0x88
  cc2500_WriteReg(CCxxx0_TEST1, 0x21);        // 0x31
  cc2500_WriteReg(CCxxx0_TEST0, 0x0B);
  cc2500_WriteReg(CCxxx0_IOCFG2, 0x24); //29       // CCA=0x09:1=free   ??????
  cc2500_WriteReg(CCxxx0_IOCFG0, 0x06);        //                  ?????
  cc2500_WriteReg(CCxxx0_PKTCTRL1, 0x00); //04       //                      ??????
  cc2500_WriteReg(CCxxx0_PKTCTRL0, 0x40); //0x41 whiter+val  //crc on 05      //                          ????
  cc2500_WriteReg(CCxxx0_ADDR,  0x01);        //                     ?????
  cc2500_WriteReg(CCxxx0_PKTLEN, 0x05);//                      ??????
      // cc2500_ReadReg(CCxxx0_MDMCFG1);
 }while(cc2500_ReadReg(CCxxx0_FSCAL3) != 0xEA);
}

/**
*@brief read chip id
*@
**/

BYTE cc2500_GetChipId(void)
{
 BYTE id = 0;

 

 SPI_SELECT();
 spi_writebyte(0x30|0xc0);
 id = spi_writebyte(0xff);
 spi_writebyte(0x31|0xc0);
 id = spi_writebyte(0xff);
 SPI_DIS_SELECT();
    return id;
}


/**
*@brief set cc2500 to TX mode
*@
**/

void Set_CCxx00Rxd(void)
{
 SpiStrobe(CCxxx0_SIDLE);

 Delay(2);

 SpiStrobe(CCxxx0_SFRX);

 Delay(2);

 SpiStrobe(CCxxx0_SRX);
}


/**
*@brief setup cc2500
*@
**/
void cc2500_Init(void)
{

 BYTE i = 0;

 
 SPI_SELECT();
 while(RF_SPI_MISO);
 POWER_UP_RESET_CCxxx0();
    cc2500_GetChipId();
 
 cc2500_WriteRfSettings();

 //set pa

 SPI_SELECT();
 spi_writebyte(CCxxx0_PATABLE|0x40);
 for(i=0;i<8;i++)
 {
  spi_writebyte(paTable_CC2500[i]);
 }
 SPI_DIS_SELECT();

 Set_CCxx00Rxd();
}


/**
*@brief  send paket data to cc2500
*@
**/
BYTE cc2500_SendPacket(BYTE *txBuffer, BYTE size)
{
 BYTE i =0;
 
 SpiStrobe(CCxxx0_SIDLE);
 SpiStrobe(CCxxx0_SFTX);//SFRX SFTX只用于IDLE模式 执行后将FIFOs里上溢或下溢的数据清空

             //进入SLEEP模式FIFOs也同样清
// SpiStrobe(SPI1, CCxxx0_TXFIFO_Muti); 
 SPI_SELECT();
 spi_writebyte(CCxxx0_TXFIFO_Muti);
    for(i=0;i    {
     spi_writebyte(txBuffer[i]);

 }

 SPI_DIS_SELECT();

 SpiStrobe(CCxxx0_STX);
 cc2500_ReadStatus(0x3a);
 while(!GDO0);   //wait high
 while(GDO0);    //wait low ,end send
    return 0;
}

 

/**
*@brief read state
*@
**/
BYTE cc2500_ReadStatus(BYTE addr)
{
 BYTE  value;

 SPI_SELECT();
 addr  |= READ_BURST;

 spi_writebyte(addr);
 value = spi_writebyte(0xff);
 
 SPI_DIS_SELECT();

 return value;
}


/**
*@brief receive a paket data form cc2500
*@
**/

BYTE  cc2500_ReceivePacket(BYTE *rxBuffer)
{
    BYTE status;
    BYTE LEN=0,i=0;
 //BYTE n=0,l=0;

    status =1 | (cc2500_ReadStatus(CCxxx0_RXBYTES));          //RX FIFO 等于0 CRC校验失败 如果大于0CRC校验OK数据能读出
    if((status & 0x7F)==0x00)
    {
        status = cc2500_ReadStatus(CCxxx0_MARCSTATE);
        if((status!=0x0D)&&(status!=0x08))    //0x0D为RX状态
        {
         Set_CCxx00Rxd();    //激活(接收或传送)
        }
        return 0;
    }


 //LEN = cc2500_ReadReg(CCxxx0_RXFIFO_one);
    LEN = 0x06;   //采用定长模式
    if(LEN > 0)
    {
     SPI_SELECT();
  if(LEN<=RFTXDBUFFSIZE)
  {
   
   //SpiStrobe(CCxxx0_RXFIFO_Muti);
   SPI_SELECT();
   spi_writebyte(CCxxx0_RXFIFO_Muti);
   for(i=0;i   {
    rxBuffer[i] = spi_writebyte(0xff);
   }
   Set_CCxx00Rxd();
   SPI_DIS_SELECT();
   return LEN;//(status & CRC_OK);
  }
  else
  {
   SpiStrobe(CCxxx0_RXFIFO_Muti);
   for(i=0;i   {
    rxBuffer[i] = spi_writebyte(0xff);
   }

   Set_CCxx00Rxd();
   SPI_DIS_SELECT(); 
   return 0;
  }
  

    }
    else
    {
        Set_CCxx00Rxd();
        return 0;
    }
}


*/
/**
*@brief enter sleep mode,cc2500 strobe SPWD must in idle mode
*@
**/
void cc2500_Enter_Sleep(void)
{
 SpiStrobe(CCxxx0_SIDLE);
 SpiStrobe(CCxxx0_SPWD); 
 
}

推荐阅读

史海拾趣

ebm-papst公司的发展小趣事

1996年,ebm-papst独资的中国子公司(依必安派特)正式成立,标志着公司正式进入中国市场。当时,中国市场正处于经济快速增长的阶段,ebm-papst看准这一机遇,决定加大在中国的投入。除了在上海设立总部外,公司还在北京、西安、深圳等地建立了分公司或办事机构,形成了覆盖全国的销售网络。这一战略布局使得ebm-papst能够迅速适应中国市场的需求,并为其在中国市场的快速发展奠定了基础。

Advanced Optoelectronic Technology Corp公司的发展小趣事

随着产品线的不断扩展,AOTC开始进军国际市场。公司积极与各大电子厂商合作,将光电转换器集成到各类电子产品中,从而实现了市场份额的快速增长。同时,公司还不断投入研发,对产品进行升级迭代,以满足市场不断变化的需求。

EPIC公司的发展小趣事

Epic Games一直关注并支持独立游戏开发者的发展。过去,独立开发者有机会与Epic Store签订协议以获得财务支持或提高游戏的知名度。然而,随着市场环境的变化和金融合约结构的转变,独立开发者面临着越来越多的挑战。尽管如此,Epic Games仍然致力于提供支持和资源来帮助独立开发者克服障碍、实现创新并推动整个游戏行业的进步。通过与独立开发者的紧密合作和持续支持,Epic Games不仅促进了游戏行业的多样性发展,也为自己赢得了广泛的好评和声誉。

Herley New York公司的发展小趣事

近年来,随着元宇宙概念的兴起,Epic Games也开始在这一领域进行布局。公司首席执行官Tim Sweeney对元宇宙的发展潜力持乐观态度,并认为这将是未来游戏和社交领域的重要发展方向。为了实现这一愿景,Epic Games不仅在技术上进行了大量投入和研发,还与多个合作伙伴共同推动元宇宙生态的建设和发展。这些举措使得Epic Games在元宇宙领域取得了显著的进展,并有望在未来成为该领域的领军企业之一。

General Cable公司的发展小趣事
根据应用需求,将YN5103的数据和控制引脚连接到相应的输入或输出设备。例如,数据引脚可能连接到微控制器或其他数据源,控制引脚可能用于接收外部控制信号。
Gamma Microelectronics ( APM )公司的发展小趣事

G24i在发展过程中始终注重国际合作与市场拓展。公司董事长Mr. Edward J Stevenson及其团队多次访问国内外知名科研机构和企业,就DSSC技术的研发、产业化等方面进行深入交流。同时,G24i还积极参加国际太阳能展会和论坛,展示其最新的技术成果和产品应用。这些努力不仅提升了G24i在国际市场上的知名度和影响力,也为公司赢得了更多的合作机会和市场份额。通过国际合作与市场拓展,G24i正逐步成为全球DSSC领域的领军企业之一。

问答坊 | AI 解惑

数字化智能充电器的设计

[:P][:P] 摘 要:设计了基于单片机的智能充电器,介绍了其硬件和软件实现。该充电器可以实时采集和计算电池的参数,并进行智能控制,还可以通过串口和上位机进行通讯并进行实时   关键词:智能充电器 单片机 开关电源 锂离子电池   现代通 ...…

查看全部问答>

研发经典教材推荐(申请加精)

研发经典教材推荐: J2ME开发大全(清华大学出版社 2004.2) 现代信号处理习题与答案(张贤达 编著,清华大学出版社) Linux设备驱动程序(第二版)(中国电力出版社) ARM嵌入式系统开发:软件设计与优化 DSP算法、应用与设计(机械工业出 ...…

查看全部问答>

高薪诚聘:总工程师

高薪诚聘:总工程师(仪器仪表,自动化方向) 公司简介:本公司是国家机械部定点生产流量仪表的专业厂家,生产流量仪表已有是十多年历史。   我公司生产的动差式智能流量计、靶式流量计、插入式智能流量计、定量装车控制仪,广泛运用到石油、化 ...…

查看全部问答>

求CPLD开发合作

使用CPLD实现单片机通过并口或串口对TFT真彩色液晶屏的显示控制,要求显示颜色达到16K色,支持LVDS和TTL接口。[email=有能力者请发邮件到lcdspec@163.com]有能力者请发邮件到lcdspec@163.com[/email] qq:410965574 王先生。资料参见http://www.tech ...…

查看全部问答>

电子工程师必上的十大专业网站

本帖最后由 paulhyde 于 2014-9-15 09:37 编辑 [free][/free] [ 本帖最后由 yushiqian 于 2009-8-15 23:29 编辑 ]  …

查看全部问答>

室内摄像头被雷击坏,请问有何措施可避免?

看到有个问题,觉得值得讨论: 我做了一个小工程,楼下9个探头,普通红外一体机,楼上6个一样的摄像头,主机采用大华16路主机,年前打雷,现在楼下9个摄像机全部坏了,楼上6个安然无恙,而且大华主机的视频输出到普通监视器的输出口好像也击坏了, ...…

查看全部问答>

【藏书阁】数字系统的故障诊断

[ 本帖最后由 wzt 于 2010-3-11 14:45 编辑 ]…

查看全部问答>

各位前辈有用单片机读写过SD卡么?求助

如题,AVR M16+SD方式,如果有前辈愿意相助,能否给个联系方式~…

查看全部问答>

模拟器上提示“dllregister.exe不是一个有效的Pocket PC应用程序

我在VS2008中调试RDAExam(用RDA技术远程访问PC上的SQL2000)这个例子时, 出现:  hr -2147221164 {没有注册类别 } 的错误,我在模拟器上已经装上了SQLCE3.0,并且已经在虚拟器上建好了数据库。 然后我就网上查相关资料,查了好久。得出 ...…

查看全部问答>

超声波接收电路怎样抗干扰

我买了一对超声波头 是TR40系列的。 很奇怪,接收头接在示波器上,没有发射信号时,同样可以看到示波器上显示有一个50hz的正弦波信号? 接收电路不知道这样可以去除这样的干扰。 还有就是网上有些用555芯片做40khz的输出信号给超声波发射头,但 ...…

查看全部问答>