历史上的今天
今天是:2025年03月08日(星期六)
2020年03月08日 | STM32开发笔记84: SX1268驱动程序设计(SPI总线)
2020-03-08 来源:eefocus
单片机型号: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引脚,其具体的实现方法,我们在下一篇日志中介绍。
史海拾趣
|
你是不是公司里的“好好人”?如果一味地讨好他人,你便会失去他人的尊重 每个公司都会有好好人,他们对于所有人都笑眯眯,对于所有人的要求都不会说“NO”。如果你是新进入公司的员工,可能刚开始要得到其他同事的信任,需要讨好别人,当然这 ...… 查看全部问答> |
|
第二次世界大战中英国发明的空中探测雷达对于探测飞机、火箭等目标所作出的重大贡献早已家喻户晓。但是近二十年来将雷达用于探测地下目标的技术获得了长足的发展。要探测的地下目标很多,包括金属、文物、地下水,天然气,尸体以及地下任何有断层或 ...… 查看全部问答> |
|
1, Caution! All external camera interface IOs must not be combined with any other GPIO or bi-directional ports. 上面这句话,好像是所有camera 外部IO接口不能与其他GPIO及双向口“结合”的意思,此处 ...… 查看全部问答> |
|
MODEL MR821 D ( + IS = 5.989e-09 + RS = 0.00477 + CJO = 1.139e-10 + VJ = 0.7174 + TT = 3.25e-08 + M = 0.2698 + BV = 100 + N = 2 + EG = 1.11 + XTI = 3 + KF = 0 + AF = 1 + FC = 0.5 + IBV = 0.0001 + TNOM ...… 查看全部问答> |
|
新建工程文件 仿真的时候出现 错误 target voltage seems to be below operating range for this device family. Make sure the target is powered on and try again 试过好几次啦 都是这样 望高人指点啊 … 查看全部问答> |
|
最近遇到个问题,就是在ISE中新建dcm或pll 的architecture wizard时,一直新建不了,提示 ERROR:sim - Failed to generate \'dcm\'. Architecture Wizard process returned with an error. Wrote CGP file ...… 查看全部问答> |
|
rs485工作速率100Kbps以上,rs232工作速率1.2kbps以上。主要包含分频模块、数据提取模块、串行输出模块。如果可以的话可以帮忙再做一下时序仿真不?一周以内作出可以用的一定重谢。。。… 查看全部问答> |




