wireless.rar

  • PUDN用户
    了解作者
  • C/C++
    开发工具
  • 20KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 26
    下载次数
  • 2008-09-04 12:57
    上传日期
基于TI公司的CC1020芯片的无线通讯程序,程序的MCU是TI公司的MSP430系列。
wireless.rar
  • send
  • interrupt.c
    3.7KB
  • msp430x14x.h
    52.5KB
  • bbbch.c
    10.7KB
  • mainsend.c
    4.5KB
  • msp430_ctrl.c
    1.4KB
  • global.h
    795B
  • cc1020_ctrl.c
    7.4KB
  • cc1020.h
    17.5KB
  • www.pudn.com.txt
    218B
内容介绍
#include "bch.h" #include "msp430x14x.h" #define HEADLEN 3 char recd[31], data[21], bb[11]; const char p[6]={1,0,1,0,0,1}; /* irreducible polynomial */ const signed char alpha_to[32]={ 1,2,4,8,16,5,10,20, 13,26,17,7,14,28,29,31, 27,19,3,6,12,24,21,15,30,25,23,11,22,9,18,0 }; const signed char index_of[32]={ -1,0 ,1 ,18,2 ,5 ,19,11,3 ,29,6 ,27,20,8 ,12,23, 4 ,10,30,17,7 ,22,28,26,21,25,9 ,16,13,14,24,15 }; const signed char g[11]={ 1,0,0,1, 0,1,1,0, 1,1,1 }; char CRCHighByte=0; char CRCLowByte=0; char CRCResult=0; char rerr=0; void encode_bch() { register signed char i, j; signed char feedback; for (i = 0; i < 10; i++) bb[i] = 0; for (i = 20; i >= 0; i--) { feedback = data[i] ^ bb[9]; if (feedback != 0) { for (j = 9; j > 0; j--) if (g[j] != 0) bb[j] = bb[j - 1] ^ feedback; else bb[j] = bb[j - 1]; bb[0] = feedback; } else { for (j = 9; j > 0; j--) bb[j] = bb[j - 1]; bb[0] = 0; } } } void decode_bch() { register signed char ii, jj; signed char elp[3], s[5], s3, q; signed char count = 0, syn_error = 0; signed char loc[3], reg[3]; signed char aux; for (ii = 1; ii <= 4; ii++) { s[ii] = 0; for (jj = 0; jj < 31; jj++) if (recd[jj] != 0) s[ii] ^= alpha_to[(ii * jj) % 31]; if (s[ii] != 0) syn_error = 1; /* set flag if non-zero syndrome */ s[ii] = index_of[s[ii]]; }; if (syn_error) { /* If there are errors, try to correct them */ if (s[1] != -1) { s3 = (s[1] * 3) % 31; if ( s[3] == s3 ) /* Was it a single error ? */ { recd[s[1]] ^= 1; /* Yes: Correct it */ } else { /* Assume two errors occurred and solve * for the coefficients of sigma(x), the * error locator polynomail */ if (s[3] != -1) aux = alpha_to[s3] ^ alpha_to[s[3]]; else aux = alpha_to[s3]; elp[0] = 0; elp[1] = (s[2] - index_of[aux] ) % 31; elp[2] = (s[1] - index_of[aux] ) % 31; /* find roots of the error location polynomial */ for (ii = 1; ii <= 2; ii++) reg[ii] = elp[ii]; count = 0; for (ii = 1; ii <= 31; ii++) { /* Chien search */ q = 1; for (jj = 1; jj <= 2; jj++) if (reg[jj] != -1) { reg[jj] = (reg[jj] + jj) % 31; q ^= alpha_to[reg[jj]]; } if (!q) { /* store error location number indices */ loc[count] = ii % 31; count++; } } if (count == 2) /* no. roots = degree of elp hence 2 errors */ { for (ii = 0; ii < 2; ii++) recd[loc[ii]] ^= 1; rerr &= ~0x02; } else /* Cannot solve: Error detection */ rerr|=0x02; //----------------------------------- } } else if (s[2] != -1) /* Error detection */ rerr|=0x02; } } char bch_to_send(char *ptrIn,char leng,char *ptrans)//。。。leng=len+1,可将len+1部分去除,这样可以适用于50,20等情况 { //ptrin是去除了第一个字节firstbyte的指针, char ti,tj,tk=0,ri=0,rk=0; char *pdata; char temp,full=0,r31=0; char much; //实际需要发送的字节数 char many=0; //是否需要添加额外的字节 char i,rkcnt ; //int len; //------------------------------------------------------- //len=(int)*ptrIn; //len=(int)(*(ptrIn+6))+6+2; //**6 is FF, 2 is CRC,如果是50格式的,6和2去掉//----------------------------- if( (leng*8)%21==0) { much=leng; many=0; } else { much =21-((leng)*8)%21; //rk=((len+1)*8 ) /21 +1 many=1; if (much%8==0) much=much/8+leng; //rk=((len+1)*8 ) /21 +1 else much=much/8+1+leng; } rkcnt=((char)((leng)*8) ) /21 +many-1; ///注意,可能会溢出,所以后期要把len的数据类型改进 for(ti=0;ti<much;ti++) { //len+1是发送的字节数,最多补3个字节 if(rk==rkcnt) { if (ti>=leng) //notice... temp=0; else temp=*(pdata+ti); } else { temp=*(pdata+ti); } for(tj=0; tj<8; tj++) { //横变竖 // temp=*(pdata+ti); if(rk==rkcnt) { if (ti>=leng) temp=0; else temp=*(pdata+ti); } else temp=*(pdata+ti); temp=temp << tj; //notice if(temp<128) // 1 or 0 data[tk]=0; else data[tk]=1; //save to data[] tk++; if(tk==21) { full=1; tk=0; } //encode data// if(full==1) { full=0; encode_bch(); /* encode data */ for (i = 0; i < 10; i++) recd[i] = bb[i]; /* first (length-k) bits are redundancy */ for (i = 0; i < 21; i++) recd[i + 10] = data[i]; /* last k bits are data */ for(ri=0;ri<31;ri++) recd[ri]=recd[ri]&1; // r31=0; // // for(ri=0;ri<31;ri++) // r31 ^=recd[ri]; //偶校验 *(ptrans+4*rk)=recd[0]*128+recd[1]*64+recd[2]*32+recd[3]*16+recd[4]*8+recd[5]*4+recd[6]*2+recd[7]; *(ptrans+4*rk+1)=recd[8]*128+recd[9]*64+recd[10]*32+recd[11]*16+recd[12]*8+recd[13]*4+recd[14]*2+recd[15]; *(ptrans+4*rk+2)=recd[16]*128+recd[17]*64+recd[18]*32+recd[19]*16+recd[20]*8+recd[21]*4+recd[22]*2+recd[23]; *(ptrans+4*rk+3)=recd[24]*128+recd[25]*64+recd[26]*32+recd[27]*16+recd[28]*8+recd[29]*4+recd[30]*2+r31; rk++; } } //循环完一个字节 } return 4*rk; } /*****************fuction of recv of bch ********************** ** prev: 输入的开始地址 lenin:输入的长度******************* ** pout: 输出的开始指针 ******************************** **返回值lenout: 解码的所有字节,包括后面添加0的字节数 *** **所以有用的字节长度要自己通过解码后的字节里面的数据推算, **** **不能用 lenout来推算; more 0,1,2,3 bytes********************* ************************************************************8***/ //接收 char testbit(char temp,char n) // this is : (temp>> n) & 1 { char temp2=temp >> n; return(temp2 & 1); } char recv_of_bch(char *precv,char lenin,char *pout) { char ti,tj,tk=0,ri=0,rtemp=1; char *pdata,* pdt; char temp,r31=0; char z; char lenout=0; pdata=precv; //precv是接收到的流,pdata用于变动的指针 pdt=pout; //pout是要用于输出的流,pdt是变动的指针 // *pdt=0; // for(ti=0;ti<lenin/4;ti++) //每一次做一个rk, that is, handle 4 bytes. { // for(tj=0;tj<31;tj++) // { //横变竖 // temp=*pdata+tj/8; // recd[tj]=testbit(temp,7-tj+ 8*((char)(tj/8)) ); // } for(tj=0;tj<8;tj++) //bit 0~8 { //横变竖 temp=*pdata; recd[tj]=(temp>>(7-tj)) & 1; //testbit should be rewrited to a equation. } for(tj=8;tj<16;tj++) { //横变竖 temp=*(pdata+1); recd[tj]=(temp>>(7-tj+8)) & 1; } for(tj=16;tj<24;tj++) { //横变竖 temp=*(pdata+2); recd[tj]=(temp>>(7-tj+16)) & 1; } for(tj=24;tj<31;tj++) //bit 0~31 { //横变竖 temp=*(pdata+3); recd[tj]=(temp>>(7-tj+24)) & 1; } //没有recd[31],因而丢弃最后一位bit0; pdata+=4; decode_bch(); //得到了dati[i]; 竖变横 tk=0; //for whar? for(z=0;z<21;z++) data[z]=recd[10+z]; for (;;) { temp=*pdt; rtemp=1; for(z=0;z<7-ri;z++) rtemp*=2; if(data[tk]==1) { *pdt+=rtemp; } if (ri=
评论
    相关推荐
    • CC1020.rar
      cc1020中文资料,很好的讲解,用于无线传输数据方面
    • ZigBee开发程序.rar
      ZigBee技术是一种近距离、低复杂度、低功耗、低速率、低成本的双向无线通讯技术。
    • CC校友录小程序代码
      CC校友录小程序 是一个采用微信小程序和腾讯云开发技术构建的高效校友录解决方案。使用腾讯云开发技术,免费资源配额,无需域名和服务器即可搭建 小程序在微信里打开,无须下载app,也无须再访问传统的PC站点,...
    • 通讯录程序开发
      用visual c++开发的一个小的通讯录程序
    • 用线程开发ping程序
      在unix下怎样用线程开发一个ping程序,并介绍线程下延迟函数的使用,并附有文档说明.
    • cc2530收发程序
      TI公司,CC2530的收发程序 void main (void) { uint8 appMode; uint8 i=0; appState = IDLE; appStarted = FALSE; // Config basicRF basicRfConfig.panId = PAN_ID; basicRfConfig.ackRequest = FALSE; ...
    • 轻松入门开发ARM 程序
      本手册以IAR公司的EWARM开发环境和ST公司的 STR710-EVAL评估板为基础,介绍如何编写STR710(ARM7内核)的C语言应用程序
    • 轻松入门开发ARM 程序
      万利电子有限公司编写的《轻松入门开发ARM 程序》,为初学者写的入门手册
    • CC2500开发包资料
      本资源包括了射频模块CC2500的数据手册,示例程序,包括C程序和单片机程序
    • CC2420完整开发程序
      包括点对点通信程序和Zigbee组网程序,采用的是AVR单片机,一份完整的开发程序。。