嵌入式系统低速接口-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
确定无误
上传成功
这里就是调试,但是我没有磁铁不知道是不是没有感应到信号
调试页面
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !