少编程的工作量。
(1) CC2500初始化函数: void CC2500_Init(void) {
CSN = 1; delay_ms(1); CSN = 0; delay_ms(1); CSN = 1; delay_ms(1); CSN = 0;
SPI_Write(CCxxx0_SRES);
//写入复位命令
CSN = 1;
CC2500_WriteReg(CCxxx0_FSCTRL1, CC2500_Config.FSCTRL1); CC2500_WriteReg(CCxxx0_FSCTRL0, CC2500_Config.FSCTRL0); CC2500_WriteReg(CCxxx0_FREQ2, CC2500_Config.FREQ2); CC2500_WriteReg(CCxxx0_FREQ1, CC2500_Config.FREQ1); CC2500_WriteReg(CCxxx0_FREQ0, CC2500_Config.FREQ0); CC2500_WriteReg(CCxxx0_MDMCFG4, CC2500_Config.MDMCFG4); CC2500_WriteReg(CCxxx0_MDMCFG3, CC2500_Config.MDMCFG3); CC2500_WriteReg(CCxxx0_MDMCFG2, CC2500_Config.MDMCFG2); CC2500_WriteReg(CCxxx0_MDMCFG1, CC2500_Config.MDMCFG1); CC2500_WriteReg(CCxxx0_MDMCFG0, CC2500_Config.MDMCFG0); CC2500_WriteReg(CCxxx0_CHANNR, CC2500_Config.CHANNR); CC2500_WriteReg(CCxxx0_DEVIATN, CC2500_Config.DEVIATN); CC2500_WriteReg(CCxxx0_FREND1, CC2500_Config.FREND1); CC2500_WriteReg(CCxxx0_FREND0, CC2500_Config.FREND0); CC2500_WriteReg(CCxxx0_MCSM0 , CC2500_Config.MCSM0 );
CC2500_WriteReg(CCxxx0_FOCCFG, CC2500_Config.FOCCFG); CC2500_WriteReg(CCxxx0_BSCFG, CC2500_Config.BSCFG); CC2500_WriteReg(CCxxx0_AGCCTRL2, CC2500_Config.AGCCTRL2); CC2500_WriteReg(CCxxx0_AGCCTRL1, CC2500_Config.AGCCTRL1); CC2500_WriteReg(CCxxx0_FSCAL3, CC2500_Config.FSCAL3); CC2500_WriteReg(CCxxx0_FSCAL2, CC2500_Config.FSCAL2); CC2500_WriteReg(CCxxx0_FSCAL1, CC2500_Config.FSCAL1); CC2500_WriteReg(CCxxx0_FSCAL0, CC2500_Config.FSCAL0);
CC2500_WriteReg(CCxxx0_AGCCTRL0, CC2500_Config.AGCCTRL0);
CC2500_WriteReg(CCxxx0_FSTEST, CC2500_Config.FSTEST); CC2500_WriteReg(CCxxx0_TEST2, CC2500_Config.TEST2); CC2500_WriteReg(CCxxx0_TEST1, CC2500_Config.TEST1); CC2500_WriteReg(CCxxx0_TEST0, CC2500_Config.TEST0); CC2500_WriteReg(CCxxx0_IOCFG2, CC2500_Config.IOCFG2); CC2500_WriteReg(CCxxx0_IOCFG0, CC2500_Config.IOCFG0); CC2500_WriteReg(CCxxx0_PKTCTRL1, CC2500_Config.PKTCTRL1);
26
CC2500_WriteReg(CCxxx0_PKTCTRL0, CC2500_Config.PKTCTRL0);
CC2500_WriteReg(CCxxx0_ADDR, CC2500_Config.ADDR); CC2500_WriteReg(CCxxx0_PKTLEN, CC2500_Config.PKTLEN); //CC2500_WriteBurstReg(CCxxx0_PATABLE, PaTabel, 8); CC2500_Command(CCxxx0_SFRX);
CC2500_Command(CCxxx0_SFTX); CC2500_Command(CCxxx0_SIDLE); (2)SPI初始化函数: void SPI_Init(void) {
CSN = 1; SCK = 0;
}
(3)CC2500数据包接收函数 uint8 CC2500_RxPacket(void) {
if((1+CC2500_DATA_LEN) == CC2500_ReadReg(CCxxx0_RXBYTES|READ_BURST)) { CC2500_ReadBurstReg(CCxxx0_RXFIFO, CC2500_TxRxBuf, 1+CC2500_DATA_LEN); //读出所有接收到的数据 return TRUE;
} else { return FALSE;
} }
(1) CC2500数据包发送函数 void CC2500_TxPacket(void) {
//CC2500_WriteReg(CCxxx0_TXFIFO,1+CC2500_DATA_LEN);
CC2500_WriteBurstReg(CCxxx0_TXFIFO, CC2500_TxRxBuf,1+CC2500_DATA_LEN); //
//进入发
写入要发送的数据 CC2500_Command(CCxxx0_STX);
送模式发送数据 while (!GDO0);// Wait for GDO0 to be set -> sync transmitted }
while (GDO0);// Wait for GDO0 to be cleared -> end of packet
CC2500_Command(CCxxx0_SFTX); //刷新发送缓冲区 CC2500_Command(CCxxx0_SIDLE);
(2) 寄存器写入函数
void CC2500_WriteReg(uint8 addr, uint8 value) {
27
CSN = 0;
while (MISO);
SPI_Write(addr|WRITE_SINGLE); //写地址 SPI_Write(value); //写入配置 CSN = 1;
}
(3) 寄存器读取函数
uint8 CC2500_ReadReg(uint8 addr) {
uint8 value; CSN = 0; while (MISO);
SPI_Write(addr|READ_SINGLE); value = SPI_Read(); CSN = 1;
return value;
}
(7)CC2500接收地址设置函数: void CC2500_Write_RxADDR(void) {
CC2500_WriteReg(CCxxx0_ADDR,CC2500_RxAddr); }
(8)CC2500发送地址设置函数: void CC2500_Write_TxADDR(void)
{
CC2500_TxRxBuf[0] = CC2500_TxAddr; }
4.结论和心得
设计达到了预期的要求,而且在具体做出实物的过程中还具有很大的灵活性,能够更方便的移植到不同的应用系统中,是一个成功的设计。
这次我一共做了两个设计,另一个是基于Si4220的315/433/868/915MHz无线发射系统的设计,这两个设计都只要求做出文本设计,不要求做出实物,对无线这一具有挑战性的工作来说,无疑是对自己能力提高的一大损失。通过这次设计,我觉得在以下几个方面有不小的收获:
(1)学会了从众多芯片中挑选设计所需的最佳选择。
(2)学会阅读datasheet,能在短时间内从数百页的文档中找到所需信息。 (3)对可编程无线收发芯片有了更深的认识,对无线芯片控制的核心——对寄存器进
行操作有了一个整体感知。
28
(4)了解高频PCB设计的基本原则,并用Altium Designer动手设计了一个PCB,虽然
没有实物,但也是一次实践锻炼。 (5)强化了读程序、编程序的能力。
重要的是,这次课程设计强化了我对无线领域的浓厚兴趣,而对无线模块进行操作不需要复杂的高频和通信协议上的知识,只需要有一定的C语言基础就能完成。符合现阶段的学习特点,能够在有限的条件下取得比较好的效果,我会在以后的时间中,更加深入的学习这一领域的相关知识。
5.参考文献
1.Texas Instruments.CC2500datasheet[EB/OL].[2005]. http://focus.ti.com/docs/prod/folders/ print/cc2500.html.
2.宏晶科技.STC89C52RCdatasheet[EB/OL].[2009]. www.mcu-memory.com.
3.黄智伟.无线数字收发电路设计——电路原理与应用实例[M].北京:电子工业出版社.2003.5
4.Mark I.Montrose[美].电磁兼容和印刷电路板理论、设计和布线.北京:人民邮电出版社.2002.12
29