CC1101汉语文字注解
- 格式:doc
- 大小:144.50 KB
- 文档页数:38
/*引入文件************************************************/ #include<iom8V.h>#include<macros.h>#include "CC1100.h"/*接口定义************************************************/ #define key 0 //按键输入#define spz 6 //喇叭输出#define Led1 1 //输出指示#define Led2 2 //输出指示#define key_L (!(key_H)) //按键触发#define key_H (PINB &= (1<<key)) //按键弹起#define led1_Off PORTB &= ~(1<<Led1) //关闭指示#define led1_On PORTB |= (1<<Led1) //打开指示#define led2_Off PORTB &= ~(1<<Led2) //关闭指示#define led2_On PORTB |= (1<<Led2) //打开指示#define spz_H PORTD |= (1<<spz) //蜂鸣器响#define spz_L PORTD &= ~(1<<spz) //蜂鸣器关/*模块接口************************************************/ #define SLK 0 //时钟接口#define CSN 1 //芯片选择#define MOSI 2 //数据输出#define MISO 3 //数据输入#define GDO0 4 //状态指示#define GDO2 5 //状态指示#define SCLK_L PORTD &= ~(1<<SLK) //发出时钟#define SCLK_H PORTD |= (1<<SLK) //结束时钟#define CSN_L PORTD &= ~(1<<CSN) //使能选择#define CSN_H PORTD |= (1<<CSN) //使能结束#define MOSI_L PORTD &= ~(1<<MOSI) //低位数据#define MOSI_H PORTD |= (1<<MOSI) //高位数据#define MISO_L (!(MISO_H)) //输入低位#define MISO_H (PIND &= (1<<MISO)) //输入高位#define GDO0_L (!(GDO0_H)) //低位指示#define GDO0_H (PIND &= (1<<GDO0)) //高位指示#define GDO2_L (!(GDO2_H)) //低位指示#define GDO2_H (PIND &= (1<<GDO2)) //高位指示/*发送数据************************************************/ unsigned char Tx_data[] ={0x01 ,0xFE, 0xD6, 0x29, 0x0E, 0x0E, 0x77, 0x88};/*接收数据************************************************/ unsigned char Rx_data[10];/*功率配置************************************************/ unsigned char PaTabel[] ={0xC0, 0xC8, 0x85, 0x51, 0x3A, 0x06, 0x1C, 0x6C};/*********************************************************/ /*函数名字:delay_ns *//*输入参数:延时周期参数 *//*输出参数:无 *//*功能描述:延时1 纳秒 *//*建造日期;2008年03月30日 *//*********************************************************/ void delay_ns(unsigned char n) //纳秒延时{while (n--);}/*********************************************************/ /*函数名字:delay_ms *//*输入参数:无 *//*输出参数:无 *//*功能描述:延时1 毫秒 *//*建造日期;2008年03月30日 *//*********************************************************/ void delay_ms(void) //毫秒延时{unsigned int i;for (i=0; i<1500; i++){NOP();}}/*********************************************************/ /*函数名字:delay_nms *//*输入参数:延时周期参数据 *//*输出参数:无 *//*功能描述:延时程序 *//*建造日期;2008年03月30日 *//*********************************************************/ void delay_nms(unsigned int n) //延时周期{unsigned int i;for (i=0; i<n; i++){delay_ms();}}/*********************************************************/ /*函数名字:Spz_dealy *//*输入参数:鸣响延时周期 *//*输出参数:无 *//*功能描述:蜂鸣器鸣叫 *//*建造日期;2008年03月30日 *//*********************************************************/ void Spz_delay(unsigned char n){unsigned char i;spz_H; //蜂鸣器响for (i=0; i<n; i++) //延时周期{delay_ms();}spz_L; //蜂鸣器关}/*********************************************************/ /*函数名字:PORT_Init *//*输入参数:无 *//*输出参数:无 *//*功能描述:单片机端口初始化 *//*建造日期;2008年03月30日 *//*********************************************************/ void PORT_Init(void){DDRD =0B11000111; //模块接脚PORTD=0B10111111; //DDRB =0B11111110; //按键输入PORTB=0B11111001; //}/*********************************************************/ /*函数名字:Led_Light *//*输入参数:无 *//*输出参数:无 *//*功能描述:LED1闪烁三次 *//*建造日期;2008年03月30日 *//*********************************************************/ void Led_Light(void){unsigned char i;for (i=0;i<3;i++) //闪烁三次{led1_On; //输出指示delay_nms(50); //led1_Off; //关闭指示delay_nms(50); //}}/*********************************************************/ /*函数名字:SpiTxRx_Byte *//*输入参数:写入寄存器的数据 *//*输出参数:读取寄存器的数据 *//*功能描述:通过SPI 串口读写一字节数据 *//*建造日期;2008年03月30日 *//*********************************************************/ unsigned char SpiTxRx_Byte(unsigned char data){unsigned char i, temp = 0;for (i=0; i<8; i++) //读写八位{if (data & 0x80){MOSI_H; //写出高位}else{MOSI_L; //写出低位}SCLK_H; //发出时钟NOP();NOP();data <<= 1;temp <<= 1; //数据左移if (MISO_H){temp += 1 ; //记录高位}else{temp += 0; //记录低位}SCLK_L; //结束时钟NOP();NOP();}return temp; //返回数据}/*********************************************************/ /*函数名字:RESET_CC1100 *//*输入参数:无 *//*输出参数:无 *//*功能描述:写入复位滤波命 *//*建造日期;2008年03月30日 *//*********************************************************/ void RESET_CC1100(void){CSN_L; //片选使能while (MISO_H); //等待响应SpiTxRx_Byte(CC_SRES); //复位命令while (MISO_H); //等待响应CSN_H; //结束使能}/*********************************************************/ /*函数名字:POWER_UP_RESET_CC1100 *//*输入参数:无 *//*输出参数:无 *//*功能描述:模块上电初始化 *//*建造日期;2008年03月30日 *//*********************************************************/ void POWER_UP_RESET_CC1100(void){CSN_H; //上电拉高SCLK_H,MOSI_L; //delay_ns(1); //CSN_L; //片选使能delay_ns(1); //CSN_H; //选择拉高delay_ns(80); //SCLK_L; //拉低时钟RESET_CC1100(); //复位命令}/*********************************************************/ /*函数名字:Init_cc1100 *//*输入参数:无 *//*输出参数:无 *//*功能描述:初始化模块 *//*建造日期;2008年03月30日 *//*********************************************************/ void Init_cc1100(void){POWER_UP_RESET_CC1100(); //上电复位WriteRfSettings(); //写入配置Spi_Write_Burst(CC_PA TABLE,PaTabel,8); //功率配置Spi_Write_Strobe(CC_SIDLE); //进入空闲Spi_Write_Strobe(CC_SRX); //进入接收}/*********************************************************//*函数名字:Spi_Write_Strobe *//*输入参数:滤波命令 *//*输出参数:无 *//*功能描述:写入滤波命令 *//*建造日期;2008年03月30日 *//*********************************************************/ void Spi_Write_Strobe(unsigned char strobe){CSN_L; //片选使能while (MISO_H); //等待响应SpiTxRx_Byte(strobe); //写入命令CSN_H; //结束使能}/*********************************************************/ /*函数名字:Spi_Read_Byte *//*输入参数:寄存器地址 *//*输出参数:寄存器配置 *//*功能描述:单字节读取寄存器 *//*建造日期;2008年03月30日 *//*********************************************************/ unsigned char Spi_Read_Byte(unsigned char addr){unsigned char value;CSN_L; //片选使能while (MISO_H); //等待响应SpiTxRx_Byte((addr|Read_Byte)); //送出地址value = SpiTxRx_Byte(0); //读寄存器CSN_H; //结束使能return value; //返回数据}/**********************************************************/ /*函数名字:Spi_Write_Byte *//*输入参数:寄存器地址,配置 *//*输出参数:无 *//*功能描述:单字节写入寄存器 *//*建造日期;2008年03月30日 *//**********************************************************/ void Spi_Write_Byte(unsigned char addr,unsigned char value){CSN_L; //片选使能while (MISO_H); //等待响应SpiTxRx_Byte(addr); //送出地址SpiTxRx_Byte(value); //写入配置CSN_H; //结束使能}/**********************************************************//*函数名字:Spi_Read_Burst *//*输入参数:寄存器地址,接收缓冲区首址,接收字节数 *//*输出参数:结果存储在缓冲区地址 *//*功能描述:连续读取寄存器数据 *//*建造日期;2008年03月30日 *//**********************************************************/void Spi_Read_Burst (unsigned char addr,unsigned char *buffer,unsigned char count) {unsigned char i;CSN_L; //片选使能while (MISO_H); //等待响应SpiTxRx_Byte((addr|Read_Burst)); //连续读取for (i = 0; i < count; i++) //{buffer[i] = SpiTxRx_Byte(0); //存储数据}CSN_H; //结束使能}/**********************************************************//*函数名字:Spi_Write_Burst *//*输入参数:寄存器地址,发射缓冲区首址,发送字节数 *//*输出参数:无 *//*功能描述:连续写入寄存器数据 *//*建造日期;2008年03月30日 *//**********************************************************/void Spi_Write_Burst(unsigned char addr,unsigned char *buffer,unsigned char count) {unsigned char i;CSN_L; //片选使能while (MISO_H); //等待响应SpiTxRx_Byte((addr|Write_Burst)); //连续写入for (i = 0; i < count; i++) //{SpiTxRx_Byte(buffer[i]); //送出数据}CSN_H; //结束使能}/*********************************************************/ /*函数名字:Spi_Write_Packet *//*输入参数:发送缓冲区首址,数组长度 *//*输出参数:无 *//*功能描述:发送缓冲区数据 *//*建造日期;2008年03月30日 *//*********************************************************/ void Spi_Write_Packet(unsigned char *Tx_buffer,unsigned char size) {unsigned char i;Spi_Write_Byte(CC_TXFIFO,size); //先送长度Spi_Write_Burst(CC_TXFIFO,Tx_buffer,size); //发送数据Spi_Write_Strobe(CC_STX); //发送模式i = 0;while (GDO0_L) //等待送出{if (i > 10) break; //限时等待delay_nms(1); //i++; //}i = 0;while (GDO0_H) //送出完毕{if (i > 10) break; //限时等待delay_nms(1); //i++; //}delay_nms(1);Spi_Write_Strobe(CC_SFTX); //清缓冲区Spi_Write_Strobe(CC_SIDLE); //进入空闲Spi_Write_Strobe(CC_SRX); //进入接收}/*********************************************************/ /*函数名字:Spi_Read_Packet *//*输入参数:接收缓冲区首址,最大长度 *//*输出参数:校验标志 *//*功能描述:数据存入缓冲区 *//*建造日期;2008年03月30日 *//*********************************************************/ unsigned char Spi_Read_Packet(unsigned char *Rx_buffer,unsigned char length) {unsigned char status[2];unsigned char size = 0;delay_nms(1);size = Spi_Read_Byte(CC_RXFIFO); //数据长度if (size < length){Spi_Read_Burst(CC_RXFIFO,Rx_buffer,size); //接收数据Spi_Read_Burst(CC_RXFIFO,status,2); //校验数据}Spi_Write_Strobe(CC_SFRX); //清缓冲区return (status[1] & CRC_OK); //校验标志}/*********************************************************//*函数名字:WriteRfSettings *//*输入参数:无 *//*输出参数:无 *//*功能描述:模块寄存器配置 *//*建造日期;2008年03月30日 *//*********************************************************/void WriteRfSettings(void){Spi_Write_Byte (CC_IOCFG2,IOCFG2); //Spi_Write_Byte (CC_IOCFG0,IOCFG0); //Spi_Write_Byte (CC_FIFOTHR,FIFOTHR); //Spi_Write_Byte (CC_PKTLEN,PKTLEN); //Spi_Write_Byte (CC_PKTCTRL1,PKTCTRL1); //Spi_Write_Byte (CC_PKTCTRL0,PKTCTRL0); //Spi_Write_Byte (CC_ADDR,ADDR); //Spi_Write_Byte (CC_CHANNR,CHANNR); //Spi_Write_Byte (CC_FSCTRL1,FSCTRL1); //Spi_Write_Byte (CC_FSCTRL0,FSCTRL0); //Spi_Write_Byte (CC_FREQ2,FREQ2); //Spi_Write_Byte (CC_FREQ1,FREQ1); //Spi_Write_Byte (CC_FREQ0,FREQ0); //Spi_Write_Byte (CC_MDMCFG4,MDMCFG4); //Spi_Write_Byte (CC_MDMCFG3,MDMCFG3); //Spi_Write_Byte (CC_MDMCFG2,MDMCFG2); //Spi_Write_Byte (CC_MDMCFG1,MDMCFG1); //Spi_Write_Byte (CC_MDMCFG0,MDMCFG0); //Spi_Write_Byte (CC_DEVIA TN,DEVIATN); //Spi_Write_Byte (CC_MCSM0,MCSM0); //Spi_Write_Byte (CC_FOCCFG,FOCCFG); //Spi_Write_Byte (CC_BSCFG,BSCFG); //Spi_Write_Byte (CC_AGCCTRL2,AGCCTRL2); //Spi_Write_Byte (CC_AGCCTRL1,AGCCTRL1); //Spi_Write_Byte (CC_AGCCTRL0,AGCCTRL0); //Spi_Write_Byte (CC_FREND1,FREND1); //Spi_Write_Byte (CC_FREND0,FREND0); //Spi_Write_Byte (CC_FSCAL3,FSCAL3); //Spi_Write_Byte (CC_FSCAL2,FSCAL2); //Spi_Write_Byte (CC_FSCAL1,FSCAL1); //Spi_Write_Byte (CC_FSCAL0,FSCAL0); //Spi_Write_Byte (CC_FSTEST,FSTEST); //Spi_Write_Byte (CC_TEST2,TEST2); //Spi_Write_Byte (CC_TEST1,TEST1); //Spi_Write_Byte (CC_TEST0,TEST0); //}/*********************************************************/ /*函数名字:RX_ACK *//*输入参数:无 *//*输出参数:应答标志 *//*功能描述:等待从机应答,返回应答标志 *//*建造日期;2008年03月30日 *//*********************************************************/ unsigned char RX_ACK(void){unsigned char *buffer = Rx_data;unsigned int size,i=0;size = sizeof(Rx_data); //最大长度while (i <10000) //限时应答{delay_ns(15);i++;if (GDO0_H) //等待应答{if (Spi_Read_Packet(Rx_data,size)) //应答出现{if (!(buffer[0] ^= buffer[1])) //{if ((buffer[2] == (~(buffer[3])))) //{return 1; //成功应答}}}}}return 0; //没有应答}/*********************************************************/ /*函数名字:TX_ACK *//*输入参数:无 *//*输出参数:无 *//*功能描述:接收成功发送应答 *//*建造日期;2008年03月30日 *//*********************************************************/ void TX_ACK(void){unsigned char PA;PA = Rx_data[4]; //获取功率Spz_delay(50); //成功接收Spi_Write_Byte (CC_FREND0,PA); //功率配置Spi_Write_Packet(Tx_data,4); //发送应答}/*********************************************************/ /*函数名字:Tx_cc1100 *//*输入参数:无 *//*输出参数:无 *//*功能描述:发送数据,应答失败从发 *//*建造日期;2008年03月30日 *//*********************************************************/ void Tx_cc1100(void){unsigned char PA,i;unsigned char ACK,Tx_Size;Tx_Size = sizeof(Tx_data); //数组长度Tx_data[4] = PA = 0x10; //最大功率for (i=0; i<2; i++){Spi_Write_Byte (CC_FREND0,PA); //功率配置Spi_Write_Packet(Tx_data,Tx_Size); //开始发送ACK = RX_ACK();if (ACK) //是否应答{Led_Light(); //对方应答break; //应答退出}Tx_data[4] = PA = 0x17; //降低功率}delay_nms(1);Spi_Write_Strobe(CC_SIDLE); //进入空闲Spi_Write_Strobe(CC_SRX); //进入接收}/*********************************************************/ /*函数名字:Rx_cc1100 *//*输入参数:无 *//*输出参数:无 *//*功能描述:接收数据,成功发送应答 *//*建造日期;2008年03月30日 *//*********************************************************/ void Rx_cc1100(void){unsigned char *buffer = Rx_data;unsigned char i, size;for (i = 0; i < 15; i++){buffer[i] = 0;}size = sizeof(Rx_data); //最大长度if (Spi_Read_Packet(Rx_data,size)) //接收数据{if (!(buffer[0] ^= buffer[1])) //{if ((buffer[2] == (~(buffer[3])))) //{TX_ACK(); //发送应答}}}delay_nms(1);Spi_Write_Strobe(CC_SIDLE); //进入空闲Spi_Write_Strobe(CC_SRX); //进入接收}/*********************************************************/ /*函数名字:nain *//*输入参数:无 *//*输出参数:无 *//*功能描述:主程序 *//*建造日期;2008年03月30日 *//*********************************************************/ void main(void){PORT_Init(); //脚位定义Led_Light(); //输出指示Init_cc1100(); //模块设置while(1) //循环程序{if (key_L) //按键检测{delay_nms(20); //防误处理if (key_L) //{led2_On; //打开指示Tx_cc1100(); //发送数据while(key_L); //等待弹起led2_Off; //关闭指示}}if (GDO0_H) Rx_cc1100(); //接收数据}}/*********************************************************//*模块操作指令*****************************************************************/#define CRC_OK 0x80 //校验标志*********** **************/#define Read_Byte 0x80 //读单字节************** ***********/#define Read_Burst 0xC0 //连续读取*************** **********/#define Write_Byte 0x00 //写单字节*************** **********/#define Write_Burst 0x40 //连续写入**************** *********//*配置寄存器定义***************************************************************/#define CC_IOCFG2 0x00 // GDO2输出脚配置****** ************/#define CC_IOCFG1 0x01 // GDO1输出脚配置****** ************/#define CC_IOCFG0 0x02 // GDO0输出脚配置****** ************/#define CC_FIFOTHR 0x03 // RX FIFO和TX FIFO门限************/#define CC_SYNC1 0x04 // 同步词汇,高字节*** *************/#define CC_SYNC0 0x05 // 同步词汇,低字节*** *************/#define CC_PKTLEN 0x06 // 数据包长度********** ************/#define CC_PKTCTRL1 0x04 // 数据包自动控制******** **********/#define CC_PKTCTRL0 0x08 // 数据包自动控制******** **********/#define CC_ADDR 0x09 // 设备地址/********* **************/#define CC_CHANNR 0x0A // 信道数************** ************/#define CC_FSCTRL1 0x0B // 频率合成器控制******* ***********/#define CC_FSCTRL0 0x0C // 频率合成器控制******* ***********/#define CC_FREQ2 0x0D // 频率控制词汇,高字节************/#define CC_FREQ1 0x0E // 频率控制词汇,中间字节**********/#define CC_FREQ0 0x0F // 频率控制词汇,低字节************/#define CC_MDMCFG4 0x10 // 调制器配置*********** ***********/#define CC_MDMCFG3 0x11 // 调制器配置*********** ***********/#define CC_MDMCFG2 0x12 // 调制器配置*********** ***********/#define CC_MDMCFG1 0x13 // 调制器配置*********** ***********/#define CC_MDMCFG0 0x14 // 调制器配置*********** ***********/#define CC_DEVIATN 0x15 // 调制器背离设置***** ************/#define CC_MCSM2 0x16 // 主通信控制状态机配置************/#define CC_MCSM1 0x17 // 主通信控制状态机配置************/#define CC_MCSM0 0x18 // 主通信控制状态机配置************/#define CC_FOCCFG 0x19 // 频率偏移补偿配置**** ************/#define CC_BSCFG 0x1A // 位同步配置********* *************/#define CC_AGCCTRL2 0x1B // AGC控制*************** **********/#define CC_AGCCTRL1 0x1C // AGC控制*************** **********/#define CC_AGCCTRL0 0x1D // AGC控制*************** **********/#define CC_WOREVT1 0x1E // 高字节时间0暂停***** ************/#define CC_WOREVT0 0x1F // 低字节时间0暂停***** ************/#define CC_WORCTRL 0x20 // 电磁波激活控制******* ***********/#define CC_FREND1 0x21 // 前末端RX配置******* *************/#define CC_FREND0 0x22 // 前末端RX配置******* *************/#define CC_FSCAL3 0x23 // 频率合成器校准******************/#define CC_FSCAL2 0x24 // 频率合成器校准****** ************/#define CC_FSCAL1 0x25 // 频率合成器校准****** ************/#define CC_FSCAL0 0x26 // 频率合成器校准****** ************/#define CC_RCCTRL1 0x27 // RC振荡器配置********* ***********/#define CC_RCCTRL0 0x28 // RC振荡器配置********* ***********/#define CC_FSTEST 0x29 // 频率合成器标度**** *************/#define CC_PTEST 0x2A // 产品测试*********** *************/#define CC_AGCTEST 0x2B // AGC测试************** ***********/#define CC_TEST2 0x2C // 不同的测试设置***** *************/#define CC_TEST1 0x2D // 不同的测试设置***** *************/#define CC_TEST0 0x2E // 不同的测试设置***** *************//*命令滤波定义*****************************************************************/#define CC_SRES 0x30 // 重启芯片********** **************/#define CC_SFSTXON 0x31 // 开启和校准频率合成器* ***********/#define CC_SXOFF 0x32 // 关闭晶体振荡器***** *************/#define CC_SCAL 0x33 // 校准频率合成器并关断************/#define CC_SRX 0x34 // 启用RX。