代码改变世界

"CC1101 无线自动组网成功"---amoBBS

2015-08-24 11:04  wilkinsun  阅读(1997)  评论(0编辑  收藏  举报

 基于RF CC1101 无线自动组网成功  +ATMEGA8
   暗爽:    因为程序是用的公司产品上的,所以暂时不好公开,所以只能暗爽了。
   因为介绍的比较多,但还是得慢慢介绍下,因为今天没带数码相机,实物图在随后的日子里贴出来
   Introduce:
            1、基于RF CC1101 868Mhz(因为产品主要出口到欧洲,所以用868M 当然在中国一般就用434M 或315M了)
            2、一个主站(向是一个无线路由器,当然它还要与上位机通讯,因为无线模块只是工具,我们还需要它来为我们的防盗系统传递数据)
               +30个从站(这里的30个从站只是现在刚开始使用,最多的话可以带255个从站)
            3、所有主站的的物理地址始终为 0x00 0x00 0x00 0x00 从站的物理地址不为主站的物理地址的所有4个字节的物理地址 
            4、所有的主站的地址始终为0x00, 从机的地址是有主机根据从机的物理地址来自由分配的,当然如果主机保持通电状态,如果某台从机在分
               配了一个ID号后,又断电, 然后在重启后,主机会在物理地址库中寻找这个从机的物理地址,如果找到,就给这台从机分配掉电前的ID
               如果为新的物理地址,也就是来了个陌生的物理地址,就给它分配一个新的ID号
            5、程序为主站和从站建立了一个128个字节的接收缓冲区,因为发送的话,需要等待发送完了在发送下一组数据,所以发送就没给它建立缓冲区
            6、通讯格式:上位机到 主站(232串口) 、主站到从站(RF CC1101) ,从站到系统的 所有传输数据格式为 
               开始字符 + 地址 +类型+RSVD(保留字节,为以后可能用到 而保留一个字节)+命令 +数据
            7、无线自动组网主要是依靠CC1101自带的 载波感应 来做的,当检测到外界有信号的时候就查询,最多查询500ms,如果500ms以内外界都有
               信号就发送失败,如果在500ms发现外界没有信号,就立马发送出去
            8、注意:主站在没次上电 的时候需要发送命令,让从站将自己的ID号清零,然后重新向主站请求一个ID号,这样做是ID号是随机分配的,
               如果从站不将自己的ID号清0,重新索要ID号,主站不去查询当前要分配的ID号是否在从站中已经存在,那么这里会有个数据冲突问题。
            9、从机是怎么得到自己的ID号:
                  从机在每次上电后,将自己的ID号清0,这样就可以接收到主站的所有命令,当然如果接收到数据后,从站是不会回复,除非从站接收到
               主站分配的ID号的命令,且分配ID号带的MAC 地址与自己匹配,这样才会回复数据。
                  当从机的ID号为0时,从机会自动   随机   延时(当然这里的延时不是只做延时,而是用定时器来做的延时),然后检测外界是否有信号
               如果外界没有信号,就发送自身的MAC(每台系统的MAC地址都是  唯一  ,这个MAC地址是需要产品出厂的时候我们来设置的,客户是不可
               以更改的)地址发送到主站,如果主站忙则忽略掉这台系统的请求,从机会在随机延时后再发送自己的MAC地址到主站。当主站闲的时候
               回响应这台系统的请求,在这里主站会告诉全网停止所有的发送请求,然后发送这台系统的MAC +主站分配的ID号给从机,当然所有从机都
               会收到此命令,因为用的是广播方式,但是除了MAC地址匹配者才对这条指令响应,然后回复成功,主站收到成功后,会将此从站系统的
               信息MAC+ID号,存储起来,主要用于当上位机要的时候发送到上位机,然后上位机根据MAC来起“别名”,根据ID号来发送数据,这样就
               比较人性化(傻瓜化),如果出现以外 主站在发送3次后都没有收到从站的回复,那么就丢失这台系统的请求,然后恢复全网可以继续发
               送 数 据 到主站。这样就可以搜索到下面所有的系统的 然后分配一个ID号, 
               从测试结果来看,因为超时用的是200ms 所以计算大概主站分配一个ID号 最快需要1S 左右,慢的话 要挂的从站的个数,个数越多的话,
               时间越长,大概需要挂满最快需要30s  慢的话基本在40S左右。
            10、当然从机的任务很重哦:
               1、要处理分配ID好的任务+处理与People Counter 模块的通讯+ 处理与主芯片的通讯 +还要处理自身的数据(时钟+间隔读取
                  People Counter Module 的数据(这里的People Counter Module 才用红外编码来记数,可以记 IN 和 OUT,带记带个通道,
                  最快 的速度为12.5hz,这个数据应该可以了,应该没有那个强人从一个门口1S钟 来回12次吧 ,呵呵),然后将数据存储在存储芯片
                  中去定时开关机+发送数据到我们主机系统(232 serial)+上位机通过232来设置MAC地址.... and so on),因为需要用带2个串口
                  所以从站选用ATMEGA162 ,不过有点危险 还才1点几个KB就写瞒了,如果继续增加功能的话,需要换ATMEGA64了,这也是个比较郁闷
                  的问题 
                
                这里有个比较有趣的事就是定时开关机的问题: 这里存在一个 如: 开始时间 08 00 关机时间为17:00  传输格式为 08 00 11 00 
                当然这个比较符合人的思想观念,但是 如果 为 11 00 08 00 呢 开始时间比关机时间大呢,所以这里存在一个正反向的问题
                当然还有问题,就是开机时间+关机时间+实际时间  这三者怎么比较,刚开始认为   实际时间比开机时间大  然后关机时间小 就开机
                结果好象没有那么顺利。折磨了差不多1个晚上终于搞定, 这是我写这个程序的一个小小乐趣,看似一个一看就明白的问题,翻译到
                程序中去就不是那么回事了.......   朋友,如果你有兴趣的话可以写个定时开关机的小程序哦,程序不多,只是逻辑有点小复杂,当然
                可能对你来说 这是个笑话, 个人能力有差距嘛  呵呵
             11 忘了还有什么比较重要的地方要说了,但是基本就上面这么多了,如果想起来了 会继续发贴,对于有可以相互交流的朋友可以在此贴后
                 跟贴讨论,对于有疑问的朋友可以加我QQ(492031062(加时著名“CC1101”),thanks)到我们主机系统(232 serial),), 讨论,
                我只能尽我的能力把这个问题说明白, 但是我不保证我的这种通讯的完美性,如果有后来者模仿,有问题者,本人不负任何法律责任。

 

备注:nRF24AP2芯片:2.4GHz频段,内置无线自组网协议芯片。