6LoWPAN层(sicslowpan.c)的输出函数是MAC 层(sicslowmac.c)的输入函数。MAC层的输出函数是广播层 (radio.c)的输入函数,radio是Rime协议栈。
sicslowmac支持802.15.4的数据请求原语和数据指示原语。其中,数据请求原语建立一个完整的802.15.4帧;数据指示原语将接收的帧解析并传给上层6lowpan。
驱动程序写在MCU里面,负责MCU对RF212芯片的驱动,使得RF212芯片工作。
芯片状态间的切换
芯片各个状态间的转换通过控制RF212芯片中的寄存器0x02 TRX_STATE来进行各状态间的转换。
前3位只读,不能改变,后5位控制当前芯片的状态。
程序中通过hal_subregister_write来改变芯片的状态,例如radio_initial中,将芯片的状态切换到force_TRX_OFF中。
hal_subregister_write(SR_TRX_CMD, CMD_FORCE_TRX_OFF);
其中SR_TRX_CMD为0x02, 0x1f, 0;
0x02代表寄存器地址;0x1f代表前3位不可改变;0代表pos为0,改变的数值为低位;3代表改变的数值。
读取RF212芯片过程
RF212芯片中寄存器TRX_STATUS(0x01)负责存储当前芯片的状态,该寄存器为只读寄存器。
发送过程
整个数据的发送过程:
1. 在MCU产生PHR和PSDU
2. 通过SPI传输到RF212芯片缓冲区中。
3. 自动在RF212中加上同步头SHR。
4. 将RF212芯片的状态调制发送状态(PLL_ON)。
5. 通过控制SLP_TP管脚将帧发送出去。
驱动程序的组成:
MAC 层:sicslowmac.c,负责整个通信过程中MAC帧的产生
Radio层:radio.c,负责帧的发送
Sicslowmac:
1. 通过Params这个结构体记录该802.15.4帧的各种属性,包括帧类型、是否AES保密、采用短地址或长地址等。
2. 根据params结构体中记录的数据创建802.15.4帧,得到帧的数据和帧长
3. 设置最多三次的发送尝试,超过则自动退出,输出发送失败。
Radio:
4. 在SLP_TR管脚产生一个冲激,将数据发送出去。
hal.c:
SPDR寄存器:8位移位寄存器,完成和RF212中数据缓冲区的数据传输。
• Bit 7 – SPIE: SPI 中断使能
置位后,只要 SPSR 寄存器的 SPIF 和 SREG 寄存器的全局中断使能位置位,就会引发
SPI 中断。
• Bit 6 – SPE: SPI 使能SPE。置位将使能 SPI。
• Bit 5 – DORD: 数据次序。DORD 置位时数据的 LSB 首先发送;否则数据的MSB 首
先发送。
• Bit 4 – MSTR: 主 / 从选择 。MSTR 置位时选择主机模式,否则为从机。如果 MSTR
为 1,SS 配置为输入,但被拉低,则 MSTR 被清零,寄存器 SPSR 的 SPIF 置位。用户必须重新设置 MSTR 进入主机模式。
• Bit 3 – CPOL: 时钟极性,CPOL为高表示空闲时SCK为高电平;否则,表示空闲时
SCK为低电平。
• Bit 2 – CPHA: 时钟相位,当完成一字节数据的传输时,SPSR寄存器最高位SPIF置
位,然后SPCR寄存器上SPIE置位,产生中断。
•
和 SPR0 对从机没有影响。
• Bit 7 – SPIF: SPI 中断标志,串行发送结束后,SPIF 置位。若此时寄存器 SPCR 的
SPIE 和全局中断使能位置位,SPI中断即产生。如果 SPI 为主机, SS 配置为输入,且被拉低,SPIF 也将置位。进入中断例程后 SPIF 自动清零。或者可以通过先读SPSR ,紧接着访问SPDR 来对 SPIF 清零。
• Bit 6 – WCOL: 写冲突标志,在发送当中对SPI 数据寄存器 SPDR 写数据将置位
WCOL。WCOL 可以通过先读SPSR,紧接着访问 SPDR 来清零。
• Bit 5:1 – Res: 保留,保留位,读操作返回值为零。
• Bit 0 – SPI2X:SPI 倍速,置位后 SPI 的速度加倍。若为主机,则SCK 频率可达 CPU
频率的一半。若为从机,只能保证 fosc /4。
hal_init: 初始化,设置ATmega2561单片中SS,CLK和MOSI管脚为输出,并且SPI运行在最大速度上。
还有一种改变寄存器中特定几位的访问方式:hal_subregister_read,hal_subregister_write。
这个时候SPDR中得到的是刚进来的数据。
接收过程
当RF212芯片开始接收帧时,芯片首先发送一个IRQ中断给MCU,中断为IRQ_2,对应程序中的rx_start_callback。当帧接收完成时,芯片将产生一个IRQ_3(TRX_END)中断,提醒MCU接收已经完成。
radio_trx_end_event
程序中使用了rx_mode这个变量来记录当前RF212的状态是否是接收状态(RX_ON或RX_AACK_ON)。
若当前的状态是接收状态,那么rx_mode为true,否则为false。
rx_mode为true时,首先将数据从RF212芯片中通过SPI协议传输到MCU中,然后再在MCU中对收到的帧进行解析。从收到的帧中依次得到Source Address,Destination Address,PAN ID等信息。最后将MAC_EVENT_RX事件写入事件队列event_queue中。
rx_mode为false时,首先将RF212芯片的状态置换到RX_AACK_ON的接收状态。而由于寄存器TRX_STATE(0x02)的前三位TRAC_STATUS是负责位指示RX_AACK及TX_ARET程序的状态,从而通过hal_subregister_read访问寄存器0x02,mask为0xE0,得到前三位的值。如图: