CC2500无线模块可以做无线鼠标,提供全套AVR程序和硬件图<br /><br />2.4G无线数据模块(CC2500芯片)<br /><br />频率范围:2400-2483.5Mhz (90信道)<br /><br />最大速率:500K<br /><br />调制方式:MSK,QPSK在500Kbps, GFSK ,OOK在250kbps<br /><br />RF输出功率:0dBm<br /><br />灵敏度: -101dBm在10Kbps 1%<br /><br />编程接口:SPI数字接口<br /><br />电压:1.8-3.6V<br /><br />最大功耗:20mA<br /><br />封装形式:COB<br /><br />模块尺寸:11 X 15 X 8mm (长X宽X高)<br /><br />天线形式:PCB天线<br /><br />最大距离:100米<br /><br />应用范围:工业数据传输,无线遥控,无线鼠标,无线键盘,无线电子标签,遥控玩具,自动化数据采集系统;工业无线控制;水、气、热、电等居民计量表具无线远传自动抄表<br /><br /><br /> <br /><br />无线鼠标接收程序:<br /><br />//接收端程序,内部振荡器,8Mhz<br />#include <iom8v.h><br />#include <macros.h><br /><br />#define uint unsigned int<br />#define uchar unsigned char<br />#define h_clk_read DDRD&=~0x08 <br />#define h_clk_ctrl DDRD|= 0x08<br />#define h_data_read DDRD&=~0x04<br />#define h_data_ctrl DDRD|= 0x04<br />#define h_clk_high PORTD|=0x08<br />#define h_clk_low PORTD&=~0x08<br />#define h_data_high PORTD|=0x04<br />#define h_data_low PORTD&=~0x04<br />//以上定义host端clk与data针脚的输入输出,高低电平<br />#define CSn_on PORTD|=0x20<br />#define CSn_off PORTD&=~0x20<br />#define sclk_on PORTD|=0x80<br />#define sclk_off PORTD&=~0x80<br />#define si_on PORTB|=0x01<br />#define si_off PORTB&=~0x01<br />#define so_read DDRD&=~0x40<br />//以上定义CC2500片选和spi针脚各状态<br />#define burst 0x40<br />#define read_reg 0x80<br />#define write_reg 0x00<br />#define sres 0x30<br />#define scal 0x33<br />#define srx 0x34<br />#define stx 0x35<br />#define sfrx 0x3a<br />#define sidle 0x36<br />//以上定义CC2500有关指令<br />uchar ps2update;<br />uchar tt;<br />uchar sample_rate,resolution,command;<br />uchar frommouse[6];<br />uchar reply_to_host[4];<br />void delay(uint tt)<br />{while(tt--);}<br />void timer2_init(void)<br />{<br /> TCCR2 = 0x00; //stop<br /> ASSR = 0x00;<br /> TCNT2 = 0x00;<br /> TIMSK = 0x80;//interrupt sourse<br /> OCR2 = 50; //interval parameter<br />}<br /><br />#pragma interrupt_handler timer2_comp_isr:4 //设置PS2协议传输的时间间距<br />void timer2_comp_isr(void)<br />{uchar temp;<br /> TCNT2 = 0x00;<br /> temp=~PORTD;<br /> PORTD|=temp&0x08;PORTD&=temp|0xf7;<br /> ps2update++;<br />}<br /><br />uchar sendbyte_to_host(unsigned char bitpointer) //发字节到主机子程序<br />{uchar i,temp,parity;<br /> ps2update=parity=0;<br /> h_clk_read;h_clk_high;h_data_read;h_data_high;NOP();NOP();<br /> while(!(PIND&0x08))<br /> { while(!(PIND&0x08))NOP(); delay(50);}<br /> h_clk_ctrl;h_data_ctrl;h_data_low;NOP();// send start bit<br /> h_clk_low;<br /> SEI();TCCR2 = 0x0A; //start,prescale=8,CTC mode<br /> while(ps2update!=1);ps2update=0;delay(10);<br /> for(i=0;i!=8;i++)<br /> {temp=(bitpointer>>i)<<2;<br /> if(temp&0x04)parity++;<br /> PORTD|=temp&0x04; PORTD&=temp|0xfb;<br /> h_clk_read;<br /> while(ps2update!=1)<br /> { if(!(PIND&0x08)){TCCR2=0x00;CLI();TCNT2=0x00;h_data_high;return 0;}<br /> }<br /> ps2update=0;h_clk_ctrl;<br /> while(ps2update!=1);ps2update=0;delay(10);<br /> }<br /> if(parity%2==0) h_data_high;//send parity bit<br /> else h_data_low;<br /> h_clk_read;<br /> while(ps2update!=1)<br /> { if(!(PIND&0x08)){TCCR2=0x00;CLI();TCNT2=0x00;h_data_high;return 0;}<br /> }<br /> ps2update=0;h_clk_ctrl;<br /> while(ps2update!=1);ps2update=0;delay(10);<br /> h_data_high; while(ps2update!=2);ps2update=0;delay(10); // stop bit<br /> TCCR2=0x00; CLI();TCNT2 = 0x00; //stop timer<br /> h_clk_read;NOP();NOP();//wait for release clock<br /> for(i=0;i!=5;i++)<br /> {if(!(PIND&0x08))i=0;delay(50);}<br /> return 1;<br />}<br /><br />uchar read_command(void) //从主机读命令<br />{uchar i,temp;uchar return_cmd=0;<br /> h_data_read;h_data_high;<br /> h_clk_read;h_clk_high;delay(3);<br /> for(i=0;i!=51;i++)<br /> {while(!(PIND&0x08));//wait for release clock<br /> if(PIND&0x04)i=0;//wait for data be low<br /> }<br /> while(!(PIND&0x08));delay(5);<br /> h_clk_ctrl;<br /><br /> ps2update=0;temp=0;delay(3);<br /> SEI();TCCR2 = 0x0A; //start,prescale=8,CTC mode<br /> for(i=0;i!=8;i++)<br /> {while(ps2update!=2);ps2update=0;delay(5);<br /> temp=PIND&0x04;<br /> return_cmd|=(temp>>2)<<i;<br /> }<br /> while(ps2update!=2);ps2update=0;delay(5);//get parity<br /> while(ps2update!=2);ps2update=0;delay(20);//get stop<br /> h_data_ctrl;h_data_low;//ack<br /> while(ps2update!=2);ps2update=0;<br /> TCCR2=0x00; CLI(); TCNT2 = 0x00;delay(50);//stop timer<br /> h_data_high;delay(10);<br /> h_clk_read;delay(3);//wait for release clock<br /> for(i=0;i!=100;i++)<br /> {if(!(PIND&0x08)){i=0;delay(6);}<br /> delay(6);<br /> }<br /> return return_cmd;<br />}<br /><br />uchar SPI_command(unsigned char bitpointer) //发指令到CC2500<br />{uchar i,temp_SI,temp_SO,return_SO;<br /> i=temp_SI=temp_SO=return_SO=0;<br /> sclk_off;NOP();NOP();NOP();<br /> CSn_off;NOP();NOP();//CSn low<br /> while(PIND&0x40); // wait until SO low<br /> for(i=0;i!=8;i++)<br /> {<br /> NOP();NOP();NOP();NOP();NOP();NOP();<br /> temp_SI=(bitpointer>>(7-i));<br /> PORTB|=temp_SI&0x01; PORTB&=temp_SI|0xfe;<br /> PORTD|=0x80; NOP();NOP();NOP();<br /> temp_SO=PIND&0x40;<br /> return_SO|=((temp_SO<<1)>>i);<br /> NOP();NOP();NOP();NOP();NOP();NOP();<br /> sclk_off;<br /> }<br /> if((!bitpointer&0x40)) // bitpointer is a cmmd,set CSn & SCLK high<br /> {CSn_on;NOP();NOP();NOP();<br /> sclk_on;<br /> }<br /> return return_SO;<br />}<br /><br />void SPI_host_send(unsigned char bitpointer) //写字节到CC2500,功能兼容SPI_command<br />{uchar i,temp_SI;<br /> i=temp_SI=0;<br /> sclk_off;NOP();NOP();NOP();<br /> CSn_off;NOP();NOP();//CSn low<br /> while(PIND&0x40);delay(3); // wait until SO low<br /> for(i=0;i!=8;i++)<br /> {NOP();NOP();NOP();NOP();NOP();NOP();<br /> temp_SI=(bitpointer>>(7-i));<br /> PORTB|=temp_SI&0x01; PORTB&=temp_SI|0xfe;<br /> sclk_on; <br /> NOP();NOP();NOP();NOP();NOP();NOP();<br /> sclk_off;<br /> }<br />}<br />uchar SPI_host_read(void) //读字节从CC2500<br />{uchar i,temp_SO,return_SO;<br /> i=temp_SO=return_SO=0;<br /> for(i=0;i!=8;i++)<br /> {<br /> sclk_on;NOP();NOP();NOP();<br /> temp_SO=PIND&0x40;<br /> return_SO|=((temp_SO<<1)>>i);<br /> NOP();NOP();NOP();NOP();NOP();NOP();<br /> sclk_off;<br /> NOP();NOP();NOP();NOP();NOP();NOP();<br /> }<br /> return return_SO;<br />}<br />void cc2500_RX_initialization(void) //CC2500初始化<br />{uchar read;<br /> SPI_host_send(sres);delay(1000);<br /> SPI_host_send(scal);delay(1000);<br /> SPI_host_send(0x00);SPI_host_send(0x07);<br /> SPI_host_send(0x06);SPI_host_send(0x06);//fixed packet length =6<br /> SPI_host_send(0x07);SPI_host_send(0x84);<br /> SPI_host_send(0x08);SPI_host_send(0x0c);<br /> SPI_host_send(0x0b);SPI_host_send(0x09);<br /> SPI_host_send(0x0d+burst+write_reg);<br /> SPI_host_send(0x5d);<br /> SPI_host_send(0xb1);<br /> SPI_host_send(0x38);<br /> SPI_host_send(0x3d);<br /> SPI_host_send(0x3b);<br /> SPI_host_send(0x73);<br /> SPI_host_send(0xa2);<br /> SPI_host_send(0xf8);<br /> SPI_host_send(0x01);<br /> SPI_host_send(0x07);<br /> SPI_host_send(0x30);<br /> SPI_host_send(0x18);<br /> SPI_host_send(0x1d);<br /> SPI_host_send(0x1c);<br /> SPI_host_send(0xc7);<br /> SPI_host_send(0x00);<br /> SPI_host_send(0xb2);<br /> CSn_on;NOP();NOP();NOP();NOP();NOP();NOP();<br /> SPI_host_send(0x21);SPI_host_send(0xb6);<br /> SPI_host_send(0x23);SPI_host_send(0xca);<br /> SPI_host_send(0x26);SPI_host_send(0x11);<br /> calibrate:<br /> read=SPI_command(sfrx);//sfrx <br /> SPI_host_send(scal);delay(690);<br /> SPI_host_send(0x25+read_reg);read=SPI_host_read();<br /> while(read==0x3f){SPI_host_send(0x25+read_reg);read=SPI_host_read();}<br /> }<br /> <br /> void main(void)<br />{uchar i,j,readcc2500,buffer;<br /> OSCCAL=0xa9;<br /> PORTB=0xff;PORTD=0xff;<br /> DDRB=0x01;DDRD=0xb0;<br /> delay(600);<br /> MCUCR = 0x00;<br /> GICR = 0x00;<br /> TIMSK = 0x00;<br /> delay(51000);<br /> cc2500_RX_initialization();<br /> timer2_init();<br /> sample_rate=100;resolution=0x03;<br /> ps2update=0;<br /> <br /> finish_init:<br /> SPI_command(sfrx);<br /> SPI_command(srx);<br /> while(9)<br /> { SPI_host_send(0xf5);readcc2500=SPI_host_read(); //循环检测CC2500有无接收到数据<br /> if(readcc2500==0x01)//check whether CRC ok<br /> {<br /> SPI_host_send(0xff);<br /> for(tt=0;tt!=6;tt++)<br /> {frommouse[tt]=SPI_host_read();}<br /> CSn_on;NOP();NOP();NOP();sclk_on;NOP();NOP();NOP();<br /> <br /> <br /> if((frommouse[0]==0xbb)&&(frommouse[1]==0xaa)) //模拟地址过滤<br /> {for(tt=2;tt!=6;tt++)<br /> {to_host: //把无线鼠标的相关字节发回电脑<br /> buffer=sendbyte_to_host(frommouse[tt]);<br /> if(buffer==0)<br /> {while(!(PIND&0x08))<br /> { while(!(PIND&0x08))NOP(); delay(50);}//每次发字节到主机后都要检测主机有无拉低CLK中止传输<br /> h_data_read;h_data_high;NOP();NOP();<br /> if(!(PIND&0x04))break;<br /> else goto to_host;<br /> }<br /> }<br /> <br /> } <br /> h_data_read;h_data_high;NOP();NOP();NOP();<br /> if(!(PIND&0x04)){SPI_command(sidle);break;} //睡眠CC2500<br /> SPI_command(sfrx);<br /> SPI_command(srx);<br /> }<br /> h_data_read;h_data_high;NOP();NOP();NOP();<br /> if(!(PIND&0x04)){SPI_command(sidle);break;}<br /> }<br /> <br /><br /> command=read_command(); //从主机接收命令并处理<br /> initialization: <br /> switch(command)<br /> {case 0xff:reply_to_host[0]=0xfa;reply_to_host[1]=0xaa;//reset<br /> reply_to_host[2]=0x00;j=3;break;//pass<br /> case 0xf6:reply_to_host[0]=0xfa;j=1;break;//set default<br /> case 0xf5:reply_to_host[0]=0xfa;j=1;break;//disable report<br /> case 0xf2:reply_to_host[0]=0xfa;reply_to_host[1]=0x03;j=2;break;//get ID<br /> case 0xea:reply_to_host[0]=0xfa;j=1;break;//set stream mode<br /> case 0xe6:reply_to_host[0]=0xfa;j=1;break;//scaling 1:1<br /> case 0xe7:reply_to_host[0]=0xfa;j=1;break;//scaling 2:1<br /> case 0xe9:reply_to_host[0]=0xfa;reply_to_host[1]=0x00;//status request<br /> reply_to_host[2]=resolution;<br /> reply_to_host[3]=sample_rate;j=4;break;<br /> case 0xe8:buffer=sendbyte_to_host(0xfa); //set resolution<br /> resolution=read_command();reply_to_host[0]=0xfa;j=1;break;<br /> case 0xf3:buffer=sendbyte_to_host(0xfa); //set sample rate<br /> sample_rate=read_command();reply_to_host[0]=0xfa;j=1;break;<br /> case 0xf4:buffer=sendbyte_to_host(0xfa);goto finish_init; //set resolution<br /> }<br /> <br /> for(i=0;i!=j;i++)<br /> {h_clk_read;h_clk_high;h_data_read;h_data_high;delay(3);<br /> while(!(PIND&0x08));<br /> if(!(PIND&0x04))break;<br /> else buffer=sendbyte_to_host(reply_to_host);<br /> } <br /> command=read_command(); goto initialization;<br />}<br /><br /><br /><br />无线鼠标发送程序:<br /><br />//transmitter<br />//crystal = 4.0Mhz<br />//NO movement in 327s then M8 turns off mouse&CC2500 & goes to power-down mode,resulting in 0.2ma consumption<br />//every time CC2500 finishes transmitting,it will be forced to goto SLEEP mode<br />//NO movement in 2s, M8 goes to IDLE state,consumption decreases from 7.23ma down to 4.48ma<br />//watch dog timer:WDTCR = 0x0D,512K pulses,about 0.52s<br />#include <iom8v.h><br />#include <macros.h><br /><br />#define uint unsigned int<br />#define uchar unsigned char<br />#define m_clk_read DDRD&=~0x08<br />#define m_clk_ctrl DDRD|= 0x08<br />#define m_data_read DDRC&=~0x01<br />#define m_data_ctrl DDRC|= 0x01<br />#define m_clk_high PORTD|=0x08<br />#define m_clk_low PORTD&=~0x08<br />#define m_data_high PORTC|=0x01<br />#define m_data_low PORTC&=~0x01<br />#define mouse_on PORTD&=~0x10<br />#define mouse_off PORTD|=0x10<br />//以上定义PS2鼠标的CLK,DATA针脚的输入输出,高低电平和开,关鼠标电源<br />#define CSn_on PORTD|=0x20<br />#define CSn_off PORTD&=~0x20<br />#define sclk_on PORTD|=0x80<br />#define sclk_off PORTD&=~0x80<br />#define si_on PORTB|=0x01<br />#define si_off PORTB&=~0x01<br />#define so_read DDRD&=~0x40<br />//以上定义cc2500有关的spi协议的针脚<br />#define burst 0x40<br />#define read_reg 0x80<br />#define write_reg 0x00<br />#define scal 0x33<br />#define srx 0x34<br />#define stx 0x35<br />#define sftx 0x3b<br />#define spwd 0x39<br />#define sxoff 0x32<br />#define snop 0x3d<br />//以上定义cc2500有关的指令<br />#define cc2500_on PORTB&=~0x80<br />#define cc2500_off PORTB|=0x80<br />//以上定义cc2500的电源开关<br />#define enable_int0 GICR |=0x40<br />#define disable_int0 GICR &=~0x40<br />#define enable_int1 GICR |=0x80<br />#define disable_int1 GICR &=~0x80<br />#define enable_powerdown MCUCR |=0xa0<br />#define disable_powerdown MCUCR &=~0xa0<br />#define enable_idle MCUCR |=0x80<br />#define disable_idle MCUCR &=~0x80<br />#define wdt_off WDTCR = (1<<WDCE)|(1<<WDE);WDTCR =0x00<br />uint sleeptime;<br />uchar tt,gotosleep;<br />uchar sample_rate,resolution,command;<br />uchar frommouse[6];<br /><br />void delay(uint tt)<br />{while(tt--);}<br /><br />void timer0_init(void) //定义睡眠定时器<br />{<br /> TCCR0 = 0x00; //stop<br /> TCNT0 = 0x00; //set count<br /> TIMSK |= 0x01; //interrupt sourse<br /> TCCR0 = 0x05; //start timer<br />}<br />#pragma interrupt_handler timer0_ovf_isr:10<br />void timer0_ovf_isr(void)<br />{TCNT0 = 0x00;<br /> sleeptime++;<br /> if(sleeptime==5000)gotosleep=1; //about 327 seconds<br />}<br />#pragma interrupt_handler int0_isr:2 //定义掉电睡眠的外中断唤醒服务程序<br />void int0_isr(void)<br />{delay(500);<br /> TCCR0 = 0x05;disable_int0;disable_powerdown;<br /> PORTD=0xec;PORTB=0xff;PORTC=0xff;<br /> DDRB=0x81;DDRD=0xb0;DDRC=0x00;<br /> mouse_on;cc2500_on;WDTCR = 0x0D; //使用看门狗<br />}<br />#pragma interrupt_handler int1_isr:3 //定义待机睡眠的外中断唤醒服务程序<br />void int1_isr(void)<br />{<br /> disable_int1;disable_idle;WDTCR = 0x0D;<br />}<br /><br />uchar read_from_mouse(void) //定义从鼠标读字节子程<br />{uchar i,temp;<br /> uchar receive=0;<br /> m_clk_high;m_data_high;<br /> m_clk_read;m_data_read;//NOP();NOP();<br /> WDR();<br /> while(PIND&0x08); //wait start bit<br /> if(PINC&0x01)while(9); //if start bit is faulty,wait for watchdog to reset<br /> while(!(PIND&0x08));<br /> NOP();<br /> for(i=0;i!=8;i++)<br /> {while(PIND&0x08);<br /> temp=PINC&0x01;receive|=temp<<i;<br /> NOP();<br /> while(!(PIND&0x08));WDR();<br /> NOP();<br /> }<br /> while(PIND&0x08); //wait parity bit<br /> NOP();<br /> while(!(PIND&0x08));<br /> NOP();<br /> while(PIND&0x08);NOP(); //wait stop bit<br /> while(!(PIND&0x08));NOP();<br /> WDR();<br /> return receive;<br />}<br />void send_a_command(uchar command) //定义发命令到鼠标子程<br />{uchar i,temp,parity;<br /> parity=0;<br /> WDR();<br /> m_clk_ctrl;m_data_ctrl;NOP();NOP();m_clk_low;//pull clock low<br /> delay(20);<br /> m_data_low;delay(20); //pull data low<br /> m_clk_high;m_clk_read; //release clock<br /> for(i=0;i!=8;i++)<br /> {while(PIND&0x08);NOP();<br /> temp=command>>i;<br /> if(temp&0x01)parity++;<br /> PORTC|=temp&0x01; PORTC&=temp|0xfe;<br /> while(!(PIND&0x08));NOP();WDR();<br /> }<br /> while((PIND&0x08));NOP();<br /> if(parity%2==0) m_data_high;<br /> else m_data_low; //send parity bit<br /> while(!(PIND&0x08));NOP();<br /> while((PIND&0x08));NOP();<br /> m_data_high; //send stop bit<br /> while(!(PIND&0x08));WDR();<br /> m_data_read;NOP();NOP();<br /> while(PIND&0x08);NOP(); //wait ack<br /> while(!(PIND&0x08));<br /> WDR();<br />}<br />void connectmouse_init(void) //定义鼠标初始化<br />{uchar i,buffer,counter; <br /> WDR(); <br /> send_a_command(0xff);buffer=read_from_mouse(); //reset<br /> buffer=read_from_mouse();buffer=read_from_mouse();WDR();<br /> send_a_command(0xf2);buffer=read_from_mouse();buffer=read_from_mouse();//get ID<br /> send_a_command(0xf3);buffer=read_from_mouse(); //set sample<br /> send_a_command(200); buffer=read_from_mouse(); //sample rate =200<br /> send_a_command(0xf3);buffer=read_from_mouse(); //set sample rate<br /> send_a_command(0x64);buffer=read_from_mouse(); //sample rate =100<br /> send_a_command(0xf3);buffer=read_from_mouse(); //set sample<br /> send_a_command(0x50);buffer=read_from_mouse(); //sample rate =80<br /> send_a_command(0xf2);buffer=read_from_mouse();buffer=read_from_mouse();//get ID<br /> send_a_command(0xf3);buffer=read_from_mouse(); //set sample rate<br /> send_a_command(100); buffer=read_from_mouse(); //sample rate =100<br /> send_a_command(0xe8);buffer=read_from_mouse(); //set resolution<br /> send_a_command(0x02);buffer=read_from_mouse(); //resolution = 4 counts/mm<br /> send_a_command(0xe6);buffer=read_from_mouse(); //set scaling 1:1<br /> send_a_command(0xf4);buffer=read_from_mouse(); //enable data reporting<br /> }<br />uchar SPI_command(unsigned char bitpointer) //发指令到CC2500<br />{uchar i,temp_SI,temp_SO,return_SO;<br /> i=temp_SI=temp_SO=return_SO=0;<br /> WDR();<br /> sclk_off;NOP();<br /> CSn_off;NOP(); //CSn low<br /> while(PIND&0x40); // wait until SO low<br /> for(i=0;i!=8;i++)<br /> {<br /> NOP();<br /> temp_SI=(bitpointer>>(7-i));<br /> PORTB|=temp_SI&0x01; PORTB&=temp_SI|0xfe;<br /> PORTD|=0x80;NOP();<br /> temp_SO=PIND&0x40;<br /> return_SO|=((temp_SO<<1)>>i);<br /> NOP();<br /> sclk_off;<br /> }<br /> if(!(bitpointer&0x40)) // bitpointer is a cmmd,set CSn & SCLK high<br /> {CSn_on;NOP();<br /> sclk_on;NOP();<br /> }<br /> WDR();<br /> return return_SO;<br />}<br />void SPI_host_send(unsigned char bitpointer) //写字节到CC2500,功能兼容SPI_command<br />{uchar i,temp_SI;<br /> i=temp_SI=0;<br /> WDR();<br /> sclk_off;NOP();<br /> CSn_off;NOP(); //CSn low<br /> while(PIND&0x40);NOP(); // wait until SO low<br /> for(i=0;i!=8;i++)<br /> {NOP();<br /> temp_SI=(bitpointer>>(7-i));<br /> PORTB|=temp_SI&0x01; PORTB&=temp_SI|0xfe;<br /> sclk_on; <br /> NOP();<br /> sclk_off;<br /> }<br /> WDR();<br />}<br />uchar SPI_host_read(void) //读字节从CC2500<br />{uchar i,temp_SO,return_SO;<br /> i=temp_SO=return_SO=0;<br /> WDR();<br /> for(i=0;i!=8;i++)<br /> {<br /> sclk_on;NOP();<br /> temp_SO=PIND&0x40;<br /> return_SO|=((temp_SO<<1)>>i);<br /> NOP();<br /> sclk_off;<br /> NOP();<br /> }<br /> WDR();<br /> return return_SO;<br />} <br />void cc2500_TX_initialization(void) //初始化cc2500<br />{uchar read;<br /> SPI_host_send(scal);delay(130);<br /> SPI_host_send(0x01);SPI_host_send(0x07);<br /> SPI_host_send(0x06);SPI_host_send(0x06); //fixed packet length =6<br /> SPI_host_send(0x08);SPI_host_send(0x0c);<br /> SPI_host_send(0x0b);SPI_host_send(0x09);<br /> SPI_host_send(0x0d+burst+write_reg);<br /> SPI_host_send(0x5d);<br /> SPI_host_send(0xb1);<br /> SPI_host_send(0x38);<br /> SPI_host_send(0x2d);<br /> SPI_host_send(0x3b);<br /> SPI_host_send(0x73);<br /> SPI_host_send(0xd2);<br /> SPI_host_send(0xf8);<br /> SPI_host_send(0x01);<br /> SPI_host_send(0x07);<br /> SPI_host_send(0x30);<br /> SPI_host_send(0x18);<br /> SPI_host_send(0x1d);<br /> SPI_host_send(0x1c);<br /> SPI_host_send(0xc7);<br /> SPI_host_send(0x00);<br /> SPI_host_send(0xb2);<br /> CSn_on;NOP();<br /> SPI_host_send(0x21);SPI_host_send(0xb6);<br /> SPI_host_send(0x23);SPI_host_send(0xca);<br /> SPI_host_send(0x26);SPI_host_send(0x11);<br /> SPI_command(sftx);<br /> SPI_host_send(scal);delay(85);<br /> SPI_host_send(0x25+read_reg);read=SPI_host_read();<br /> while(read==0x3f){SPI_host_send(0x25+read_reg);read=SPI_host_read();}<br /> SPI_command(spwd);<br /> }<br /><br /><br />void main(void)<br />{uchar readcc2500,i,j;<br /> OSCCAL=0x9f;<br /> PORTD=0xec;PORTB=0x7f;PORTC=0xff;<br /> DDRB=0x81;DDRD=0xb0;DDRC=0x00;<br /> CLI();<br /> MCUCR = 0x00;<br /> GICR = 0x00;<br /> TIMSK = 0x00;<br /> delay(25);frommouse[0]=0xbb;frommouse[1]=0xaa;<br /> timer0_init();//for(i=2;i!=6;i++)frommouse=0x00;<br /> <br /> cc2500_TX_initialization();<br /> sample_rate=100;resolution=0x03;<br /> sleeptime=0x00;gotosleep=0x00;<br /> for(i=0;i!=21;i++){delay(33000);}<br /> connectmouse_init();<br /> WDR();SEI();WDTCR = 0x0D; //开看门狗<br /> <br /> while(9)<br /> {startloop:<br /> m_clk_high;m_clk_read;NOP();NOP();<br /> if(!(PIND&0x08))<br /> { <br /> for(tt=2;tt!=6;tt++)<br /> {frommouse[tt]=read_from_mouse();} //从鼠标读字节<br /> if((!(frommouse[2]&0x08))||(frommouse[2]&0xc0))//check bit3,6,7 of 1st byte<br /> {while(9);}<br /> m_clk_ctrl;m_clk_low; //inhibit mouse transmit<br /> sleeptime=0;WDR(); <br /> <br /> SPI_host_send(0x7f); //burst write TXfifo<br /> for(tt=0;tt!=6;tt++)<br /> {SPI_host_send(frommouse[tt]);} //写字节到CC2500<br /> CSn_on;NOP(); //end burst write<br /> SPI_command(stx);delay(100); //go to TXmode<br /> SPI_host_send(0xf5);readcc2500=SPI_host_read();//check whether TX finished<br /> while(readcc2500!=0x01){SPI_host_send(0xf5);readcc2500=SPI_host_read();}<br /> SPI_command(spwd); //go into SLEEP mode,TXfifo lose value<br /> WDR();delay(300);<br /> m_clk_high;m_clk_read;NOP(); //release mouse tansmit<br /> }<br /> WDR();<br /> if((gotosleep)&&(sleeptime>=5000)) //掉电睡眠定时器满足,进入掉电睡眠<br /> {gotosleep=0;sleeptime=0;TCCR0 = 0x00;TCNT0 = 0x00;<br /> enable_int0;<br /> DDRD=0x10;DDRC=DDRB=0x00;PORTD=PORTB=PORTC=0xff;mouse_off;cc2500_off;<br /> enable_powerdown;CLI();wdt_off;SEI();SLEEP();<br /> }<br /> if(sleeptime>30)//1.96seconds //待机睡眠定时满足,进入待机睡眠<br /> {m_clk_high;m_clk_read;NOP();<br /> enable_int1;enable_idle;CLI();wdt_off;SEI();SLEEP();<br /> } <br /> }<br />}<br /><br /><br /> <br /> 相关链接:<a href='http://auction1.taobao.com/auction/item_detail-0db2-a87459b7ea2395a73e67d17c283b2e32.jhtml'>http://auction1.taobao.com/auction/item_detail-0db2-a87459b7ea2395a73e67d17c283b2e32.jhtml</a> |
|