对一款国产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
确定无误
上传成功
这里就是调试,但是我没有磁铁不知道是不是没有感应到信号
调试页面


华为提出“1+1+N”5.5G建网理念,持续深化数智社会转型
佳能G7XMarkII评测 主要看中它的易用性
华为新一代CloudLink视讯解决方案全面升级
洗衣机产品均价上涨 需从细分着手蜕变
石墨烯旗舰2016年年报,储能领域研究进展不仅仅是石墨烯电池!
对一款国产3D霍尔传感器的SPI封装
SIMPA 3D打印假肢,为两岁以下的幼儿打造
减压阀常见故障及排除
SD卡简介
为什么会出现开关分闸越级跳闸的现象
ATM信元传输和格式
波形发生与波形变换
吉时利高功率数字源表2657A的特点及应用分析
苹果为帮助Siri理解和使用新语言,正招牌新人
小米有品杀菌产品发起众筹,杀菌率达99.99%
新年刚到,微博之夜,这款红色OPPO R9s就成了明星标配
华为可折叠手机专利曝光:是一种移动终端的折叠机构,可直接展开成平板电脑
哪一款会议录播机可兼容NVR监控录像机功能
商汤上半年营收14.33亿 生成式AI相关收入大增近7倍 上半年亏损收窄至31亿
华为发布全球首款汽车行业5G通信硬件