Contiki学习笔记——SI1000射频驱动移植

标签:
contikisi1000无线传感网uipsi1020 |
分类: 技术资料 |
一、Si4432非操作系统程序调试及驱动编写准备
准。但是Si4432没有支持这个标准,所以在这点上或许Si1000跟其他片子兼容性上面还是有问题。
二、通信流程理解编写
http://s16/mw690/4a9bee5agd3c82345faff&690
unicast_send才是关键。 unicast_send(&uc,
&addr);函数输入信道属性和发射地址。函数内容如下:
packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER,
receiver);//设置目的地址
return
broadcast_send(&c->c);//继续交给broadcast层
2.MAC层:
这里一路的XXX_send,直到abc层的rime_output:
RIMESTATS_ADD(tx);//rime状态采集
if(chameleon_create(c)) {//数据包建立
packetbuf_compact();//判断packetbuf是否关联了外部数据
NETSTACK_MAC.send(packet_sent, c);
return 1;
}
return 0;
关于chameleon在Jelline的博客中说明的很详细,包括这里关于rime的所有细节都可以到他的博客里面找。这里向大神拜一下~http://www/uc/myshow/blog/misc/gif/E___7414ZH00SIGG.gif
所以中间的种种过程我就不多说了,不然写三天都写不完。咋们直接说RDC和物理层。
3.RDC和物理层:
为了调试方便,我直接使用nullrdc做rdc层。这样就简单了,send_packet进去就判断数据包是否建立成功,然后就直接用NETSTACK_RADIO.send发射了。
NETSTACK_RADIO就是Si4432的物理层驱动,物理层几个主要元素如下图:
所以自此驱动就这么写完了,说说简单但还是花了我不少功夫。这里有个小插曲:之前通信成功了,但是很奇怪的是之前小于5秒发包的时候,数据丢包严重。我以为是射频驱动问题,后来发现是rtimer驱动没写好。因为LBT要用到rtimer做监听时间,这里是0.5mS。结果发现rtimer在时间太短的情况下会出现随机定时的问题,原因还没发现。
这次博文说实话没写好,隔得太久了,很多关键点要写的实在想不起来了~下次注意吧~
http://s4/small/4a9bee5agd3cc524d6183&690
最后做个小小的广告:
这幅图是SIMAC10,就是我现在在移植的片子做的最小系统板,芯片用的是Si1000,64kflash加4kram。虽然还没有ping通板子但在无操作系统的情况下已经测试通过。通信距离可以到1km左右哦~(测试环境是马路)
int unicast_send(struct unicast_conn *c,
const rimeaddr_t *receiver)
{
}
int rime_output(struct channel *c)
{
}
http://s2/mw690/4a9bee5agd3cbc00a8071&690
init就是对Si4432的初始化;prepare是发射之前的准备,诸如数据包缓冲填充、芯片状态准备;transmit就是发射了;send是个API,包括了transmit和prepare;read是对接收到并保持在缓冲里的数据进行读取;channel_clear、receiving_packet、pending_packet都未用到,等用到再填吧;on和off是用于低功耗模式,表示射频的开与关。
http://s5/mw690/4a9bee5ag7b94671abc44&690
再来看si1000_rf_intr.c由于Si4432涉及到Listen before
talk(LBT)、数据包同步、应答等等,多个状态之间切换复杂。所以我这边学习cc2430的样子,采用事件形式处理中断,这样也是为了减少堆栈开销。
http://s12/small/4a9bee5agd3cc3bf35c2b&690
这幅图是我新做回来的板子是SIMAC20是以Si1020为核心做的,128k flash加4k
ram,还自带段式液晶驱动,射频部分跟SIMAC10一样。目的就是怕SIMAC10资源不够用所以搞的。现在测试能够下载,但其他几个功能还没测试。Si1020最让人头疼的是芯片不好焊接,所以必须得找好点的贴片厂家焊接才行。