历史上的今天
今天是: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);
}
史海拾趣
|
[:P][:P] 摘 要:设计了基于单片机的智能充电器,介绍了其硬件和软件实现。该充电器可以实时采集和计算电池的参数,并进行智能控制,还可以通过串口和上位机进行通讯并进行实时 关键词:智能充电器 单片机 开关电源 锂离子电池 现代通 ...… 查看全部问答> |
|
研发经典教材推荐: J2ME开发大全(清华大学出版社 2004.2) 现代信号处理习题与答案(张贤达 编著,清华大学出版社) Linux设备驱动程序(第二版)(中国电力出版社) ARM嵌入式系统开发:软件设计与优化 DSP算法、应用与设计(机械工业出 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:37 编辑 [free][/free] [ 本帖最后由 yushiqian 于 2009-8-15 23:29 编辑 ] … 查看全部问答> |
|
看到有个问题,觉得值得讨论: 我做了一个小工程,楼下9个探头,普通红外一体机,楼上6个一样的摄像头,主机采用大华16路主机,年前打雷,现在楼下9个摄像机全部坏了,楼上6个安然无恙,而且大华主机的视频输出到普通监视器的输出口好像也击坏了, ...… 查看全部问答> |
|
模拟器上提示“dllregister.exe不是一个有效的Pocket PC应用程序 我在VS2008中调试RDAExam(用RDA技术远程访问PC上的SQL2000)这个例子时, 出现: hr -2147221164 {没有注册类别 } 的错误,我在模拟器上已经装上了SQLCE3.0,并且已经在虚拟器上建好了数据库。 然后我就网上查相关资料,查了好久。得出 ...… 查看全部问答> |
|
我买了一对超声波头 是TR40系列的。 很奇怪,接收头接在示波器上,没有发射信号时,同样可以看到示波器上显示有一个50hz的正弦波信号? 接收电路不知道这样可以去除这样的干扰。 还有就是网上有些用555芯片做40khz的输出信号给超声波发射头,但 ...… 查看全部问答> |




