STM32开发笔记84: SX1268驱动程序设计(SPI总线)

发布者:不见南师久最新更新时间:2020-03-08 来源: eefocus关键字:STM32  SX1268  SPI总线 手机看文章 扫描二维码
随时随地手机看文章

单片机型号:STM32L053R8T6


本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍SPI总线驱动程序。


一、数据手册

1、关键点:


全双工SPI

CPOL=0,CPHA=0

从器件

写操作:地址字节+数据字节

读操作:直接发送地址字节,就可返回一个数据字节

NSS在整个帧传输过程保持低电平

MISO在NSS为高时为高阻态

SCK最大时钟16M

2、几个时序图,t10是指从睡眠状态唤醒,NSS下降沿到SCK上升沿的时间,数据手册表明最短时间为100us。

3、芯片离开sleep模式的方法

可以通过NSS的下降沿使得芯片从sleep模式唤醒。下降沿发生后,芯片内部的稳压器都将打开。芯片开始初始化,然后具备接收第1个SPI命令的能力。这意味着NSS下降沿到SCK上升沿之间的延时,需考虑唤醒序列和芯片的初始化。在睡眠模式和初始化阶段,BUSY引脚为高电平,以表明芯片不能够接收1个新的命令。一旦芯片进入了STDBY_RC模式,BUSY引脚将变低,此时主机可以发送命令。整个过程同样适用于上电启动和硬复位。


4、BUSY时序图


此情况,可立即发送命令,命令发送后,经Tsw时间,BUSY为高,再为低时,表示处理完毕。Tsw时间数据手册里标明为600ns,程序一般情况可忽略。

此情况,需等BUSY为低后,发送命令,后续处理和上图一样。

二、程序

1、定义SX1268类,使其从SPI继承而来。


class CSX1268:public CSpi

{

public:

CSX1268(void);

};

2、初始化CSX1268时,传递CPOL和CPHA为0。


CSX1268::CSX1268(void):CSpi(0, 0) {}

3、给出SPI写命令函数,共传递3个参数,第1个为命令类型,第2个为写入的buffer,第3个为buffer的大小。程序开始时,等待芯片准备好,然后将NSS置低,然后写入命令号,再写入后续buffer的内容,追后将NSS置高。整个命令发送完毕后,判断命令是否为设置为睡眠模式,如果不是,则等待BUSY引脚变为高电平。


void CSX1268::SX126xWriteCommand(RadioCommands_t command, uint8_t *buffer, uint16_t size)

{

SX126xCheckDeviceReady( );

 

this->Select();

this->WriteByte((uint8_t)command);

for(uint16_t i = 0; i < size; i++)

{

this->WriteByte(buffer[i]);

}

this->Deselect();

if( command != RADIO_SET_SLEEP )

{

SX126xWaitOnBusy( );

}

}


4、给出SPI读命令函数,同样传递3个参数,第1个为命令类型,第2个为写入的buffer,第3个为buffer的大小,其与写命令结构基本相同,关键在于发送完命令类型后,空读了一下,这与SX1268的命令读命令的序列有关,可参看下图,SX1268所有的读命令,命令类型后,都是status字节,有效数据从第2个起始。

void CSX1268::SX126xReadCommand(RadioCommands_t command, uint8_t *buffer, uint16_t size)

{

SX126xCheckDeviceReady( );

 

this->Select();

this->WriteByte((uint8_t)command);

this->ReadByte();

for(uint16_t i = 0; i < size; i++)

{

buffer[i] = this->ReadByte();

}

this->Deselect();

 

SX126xWaitOnBusy( );

}

5、SX126xWaitOnBusy函数比较简单,只是判断BUSY引脚变为低电平后,命令处理结束。在这里需要注意的是,NSS调高后,须经Tsw的时间,BUSY才为高,但Tsw的时间为600ns极短,所以我们可以直接调用SX126xWaitOnBusy函数。


void CSX1268::SX126xWaitOnBusy(void)

{

while (this->Busy.Check() == high);

}

 


到此,还有SX126xCheckDeviceReady函数没有完成,处理时,不仅要考虑BUSY引脚,还需考虑模式转换,本文前面已经提到可以使用NSS引脚唤醒SX1268,所以SX126xCheckDeviceReady函数不能仅处理BUSY引脚,其具体的实现方法,我们在下一篇日志中介绍。

关键字:STM32  SX1268  SPI总线 引用地址:STM32开发笔记84: SX1268驱动程序设计(SPI总线)

上一篇:STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)
下一篇:STM32开发笔记83: SX1268驱动程序设计(芯片复位)

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved