AT86RF212芯片的驱动程序初见

6LoWPAN(sicslowpan.c)的输出函数是MAC (sicslowmac.c)的输入函数。MAC层的输出函数是广播层 (radio.c)的输入函数,radioRime协议栈。

 

sicslowmac支持802.15.4的数据请求原语和数据指示原语。其中,数据请求原语建立一个完整的802.15.4帧;数据指示原语将接收的帧解析并传给上层6lowpan

驱动程序写在MCU里面,负责MCURF212芯片的驱动,使得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_CMD0x02, 0x1f, 0

    CMD_FORCE_TRX_OFF3,对应上面的0x03

0x02代表寄存器地址;0x1f代表前3位不可改变;0代表pos0,改变的数值为低位;3代表改变的数值。

 

读取RF212芯片过程

RF212芯片中寄存器TRX_STATUS(0x01)负责存储当前芯片的状态,该寄存器为只读寄存器。

 

 

发送过程

 

整个数据的发送过程:

1. MCU产生PHRPSDU

2. 通过SPI传输到RF212芯片缓冲区中。

3. 自动在RF212中加上同步头SHR

4. RF212芯片的状态调制发送状态(PLL_ON)

5. 通过控制SLP_TP管脚将帧发送出去。

 

驱动程序的组成:

MAC 层:sicslowmac.c,负责整个通信过程中MAC帧的产生

Radio层:radio.c,负责帧的发送

         hal.c,负责SPI协议的实现,将MAC帧由MCU传到RF212芯片的缓存器

         AT86RF212_registermap,对应相应寄存器地址和一些变量值

 

Sicslowmac

     Sicslowmac_datarequest:

1. 通过Params这个结构体记录该802.15.4帧的各种属性,包括帧类型、是否AES保密、采用短地址或长地址等。

2. 根据params结构体中记录的数据创建802.15.4帧,得到帧的数据和帧长

3. 设置最多三次的发送尝试,超过则自动退出,输出发送失败。

 

Radio:

     Radio_send_data:

     将得到的数据从MCU通过SPI传到RF212芯片的数据缓冲区中,通过SLP_TP管脚将数据发送出去。

     1. RF212芯片的状态调至TRX_OFF状态。

     2. RF212芯片的状态调至TX_ARET_ON

     3. 调用hal程序,通过SPI协议将MCU程序发送给RF212芯片。

4. SLP_TR管脚产生一个冲激,将数据发送出去。

hal.c:

     ATmega2561单片机SPI协议:

 

     单片机中有两个移位寄存器,分别在主从机上。另外单片机上有一个数据存储寄存器SPDR,一个SPI控制寄存器SPCR,一个SPI状态寄存器SPSR

SPDR寄存器:8位移位寄存器,完成和RF212中数据缓冲区的数据传输。

     SPCR寄存器:控制SPI传输过程。

 

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

1SS 配置为输入,但被拉低,则 MSTR 被清零,寄存器 SPSR SPIF 置位。用户必须重新设置 MSTR 进入主机模式。

Bit 3 CPOL: 时钟极性,CPOL为高表示空闲时SCK为高电平;否则,表示空闲时

SCK为低电平。

Bit 2 CPHA: 时钟相位,当完成一字节数据的传输时,SPSR寄存器最高位SPIF

位,然后SPCR寄存器上SPIE置位,产生中断。

  Bits 1, 0 SPR1, SPR0: SPI 时钟速率选择10从而来确定主机的 SCK 速率。 SPR1

SPR0 对从机没有影响。

 

     SPSR寄存器:SPI数据传输过程中的状态。

 

Bit 7 SPIF: SPI 中断标志,串行发送结束后,SPIF 置位。若此时寄存器 SPCR

SPIE 和全局中断使能位置位,SPI中断即产生。如果 SPI 为主机, SS 配置为输入,且被拉低,SPIF 也将置位。进入中断例程后 SPIF 自动清零。或者可以通过先读SPSR ,紧接着访问SPDR 来对 SPIF 清零。

Bit 6 WCOL: 写冲突标志,在发送当中对SPI 数据寄存器 SPDR 写数据将置位

WCOLWCOL 可以通过先读SPSR,紧接着访问 SPDR 来清零。

Bit 51 Res: 保留,保留位,读操作返回值为零。

Bit 0 SPI2X:SPI 倍速,置位后 SPI 的速度加倍。若为主机,则SCK 频率可达 CPU

频率的一半。若为从机,只能保证 fosc /4

 

hal_init: 初始化,设置ATmega2561单片中SSCLKMOSI管脚为输出,并且SPI运行在最大速度上。

     hal.c中有四种访问方式,除了对应RF212芯片中介绍的三种访问方式:

     hal_register_read, hal_register_write: 对应寄存器访问方式。

     hal_frame_read,hal_frame_write: 对应帧缓冲访问方式

     hal_sram_read,hal_sram_write 对应SRAM访问方式

还有一种改变寄存器中特定几位的访问方式:hal_subregister_readhal_subregister_write

     对于hal_register_read程序:

     address &= HAL_TRX_CMD_RADDRM;

     address |= HAL_TRX_CMD_RR;

     意思为将发送命令传至SPDR寄存器中,其中HAL_TRX_CMD_RADDRM0x7FHAL_TRX_CMD_RR0x80。对应寄存器读取方式命令前两个比特为10

     while ((SPSR & (1 << SPIF)) == 0) {;}表示当SPSR寄存器最高位SPIF置为时退出循环。

这个时候SPDR中得到的是刚进来的数据。

     数据传输完成后,将SS信号抬高,SPI传输结束。

 

接收过程

 

    帧接收由两个动作组成:收发器收听,接收且在帧缓冲区中解调帧,并向微控制器发送接收信号。在此过程之中及之后,微控制器可通过SPI接口读取帧缓冲中的可用帧数据。当处于RX_ON RX_AACK_ON 状态时,无线电收发器在所选信道搜索输入帧。假设已启用适当的中断时,中断IRQ_2(RX_START)指示找到IEEE802.15.4-2006合格帧。当帧接收完成时,发出中断IRQ_3(TRX_END)

 

RF212芯片开始接收帧时,芯片首先发送一个IRQ中断给MCU,中断为IRQ_2,对应程序中的rx_start_callback。当帧接收完成时,芯片将产生一个IRQ_3TRX_END)中断,提醒MCU接收已经完成。

 

radio_trx_end_event

程序中使用了rx_mode这个变量来记录当前RF212的状态是否是接收状态(RX_ONRX_AACK_ON)

若当前的状态是接收状态,那么rx_modetrue,否则为false

rx_modetrue时,首先将数据从RF212芯片中通过SPI协议传输到MCU中,然后再在MCU中对收到的帧进行解析。从收到的帧中依次得到Source AddressDestination AddressPAN ID等信息。最后将MAC_EVENT_RX事件写入事件队列event_queue中。

rx_modefalse时,首先将RF212芯片的状态置换到RX_AACK_ON的接收状态。而由于寄存器TRX_STATE(0x02)的前三位TRAC_STATUS是负责位指示RX_AACKTX_ARET程序的状态,从而通过hal_subregister_read访问寄存器0x02mask0xE0,得到前三位的值。如图:

 

 

     然后再将事件SUCCESS_DATA_PENDING和事件CHANNEL_ACCESS_FAILURE写入事件队列中去,最后将在进程中调用给进程。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值