对一款国产3D霍尔传感器的SPI封装

描述

嵌入式系统低速接口-SPI

嵌入式系统低速接口-SPI(完结)

对一款国产的3D霍尔传感器的SPI封装.上

这篇文章完成我们的封装,以及在STM32F4的板子上面测试。

一次费我这么多引脚,我吐了。看来得上IIC,然后就是板子的引脚选择注意在cubuMX里面和实际的板子丝印多次比对,一个中断脚改了两次,气死我了。

BUTT_OUT 管脚用于检测磁铁与芯片之间的按键功能,并且也可以配置为 Trigger 模式,触发单次测量。

INT:主机向芯片发送持续感应模式或单次测量命令,芯片完成一次对应测量项的测量后,INT 脚会置 1,并且在芯片发送读取命令,读回测量数据以前,都保持为 1。主机向芯片发送唤醒睡眠模式命令后,当芯片周围测量项的变化量超出寄存器中设定的变化阈值时,INT 脚会置 1,并且在芯片发送读取命令,读回测量数据以前,都保持为 1。

芯片开启唤醒睡眠模式后,当芯片周围的某一测量项强度发生变化,且当前强度与基准值的差值,超出阈值寄存器中设定值时,芯片 INT 脚会拉高。在主机通过测量数据回读帧(data Read Frame),一次性将测量数据读回后,INT 脚拉低,否则保持为高电平。芯片 INT 脚不会主动拉低,即某一时刻被测量项的强度与基准值差值,超出设定阈值,INT 脚拉高后,如果下一时刻,被测量项的强度减弱,此时差值低于设定阈值,但主机没有读回测量数据,INT 脚并不会主动拉低。

接口

除了重置芯片,其他命令发送完后芯片均会返回芯片运行状态(status)说明。

接口

重置

接口

接口

接口

定义registerName变量,用于保存寄存器地址。

定义一个comWR数组,用于保存写入命令的数据。

将要写入的寄存器地址Register,左移2位后赋值给registerName。这里的左移2位很可能是因为寄存器地址需要以字(Word)对齐。

组装写入命令数据:

comWR[0]写入命令字WRITE_REGISTER

comWR[1]写入要写入数据的高8位

comWR[2]写入要写入数据的低8位

comWR[3]写入目标寄存器地址registerName

这样就组装好了一个完整的寄存器写入命令。

所以这段代码的主要作用就是根据传入的寄存器地址Register和要写入的数据writeData,规范地组装成一个寄存器写命令,保存在comWR数组中。

接口

再来一段延时的代码

定义一个uint8_t类型的循环变量i。

for循环从0循环到4,共执行5次。

每次循环中调用__NOP()空操作。实际上是一个微秒级的延时函数

接口

事实上,在HAL库里面是有一个延时的函数的

获取当前的系统tick计数作为起始tick值。

将需要延时的ms数保存在wait变量中。

如果延时小于HAL_MAX_DELAY,添加一个系统tick频率uwTickFreq,这个操作是为了保证至少延时1个tick。

循环查询当前tick和起始tick之差,直到大于或等于需要延时的tick数wait。

这样就可以实现精确的ms级延时等待。

整体来说,这是一种常见且高效的延时实现方法,通过查询系统tick计数器来判断延时时间,避免了空轮询耗时。

但是自带的延时函数是ms的,我们需要ns的,所以上面就又写了一个。

主机向芯片发送唤醒睡眠模式命令(0x28)

接口

这个是设置的命令

芯片上电后,进行内部初始化,当电源稳定后读取OTP的值到对应的寄存器中,上电后4ms内完成OTP的读取,在上电后4ms内不允许进行通信,当初始化完成后芯片进入空闲状态,允许通信测量。

接口

这里就这样写就行

接口

这个就是一个中断的接口

数据OK了以后,就设置为了,这个是引脚中断。

接口

读取到这值以后

接口

这个就是

接口

定义counter变量,初始化为1,用于保存需读取的数据计数。

定义com变量,用于保存读取命令,其中包含了轴信息axis。

进入for循环,循环4次,对应4个轴(XYZ)。

每次循环:

根据axis的最低位值,如果为1则计数加2,如果为0则计数不变。

然后右移axis的位,判断下一位。

这样通过位运算判断axis的每一位,根据每个轴是否启用来累加计数。

最后counter保存总的需读取数据计数。

接口

接着把中断号码来还原,等着下次继续

用于解析传感器读取回来的数据,并计算出三轴xyz的数据。

主要逻辑是:

从DataReadFrame数组取出两两字节的数据,分别对应温度t和三轴xyz。

对xyz各轴数据,通过位运算(左移8位)和按位或运算来组合两个字节的数据。

例如x轴,高字节DataReadFrame[3]左移8位,低字节DataReadFrame[4]不变,最后进行按位或,就可以组合成16位有符号整数数据。

温度t也是同样的处理过程。

接口

开始选择SPI

接口

对着数据手册好好看

接口

CS引脚

接口

这个就是中断了

接口

TRIG

接口

记得打开中断开关

接口

为了好计算,时钟都是1Mhz

接口

接口

第一次通过

 

 error: call to undeclared library function 'printf' with type 'int (const char *, ...)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]

 

接口

这个是忘了加头文件,以及如果用microLIB就要加stdio

接口

接口

这个是因为,你在文件层面的添加是无用的,记得在这里添加

接口

OK

接口

确定无误

接口

上传成功

接口

这里就是调试,但是我没有磁铁不知道是不是没有感应到信号

接口

调试页面

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分