科技 网站 推荐,网站建设的盈利性和非盈利性,去招聘网站做顾问,什么公司需要建立网站目录 主控和外设之间的联系关键示例可能的bug 主控和外设之间的联系
在完成代码之前#xff0c;我们手里会有两份代码#xff0c;一份是nrf528xx的SDK#xff0c;一份是BMI160传感器的SDK#xff0c;怎么利用SDK完成我们的需求呢#xff1f;首先我们要搞明白#xff0c;… 目录 主控和外设之间的联系关键示例可能的bug 主控和外设之间的联系
在完成代码之前我们手里会有两份代码一份是nrf528xx的SDK一份是BMI160传感器的SDK怎么利用SDK完成我们的需求呢首先我们要搞明白主控和外设之间的联系是什么传感器给的SDK具体是什么内容。 我们这次的需求是通过SPI进行传输SPI通过6条线将传感器和主控芯片联系在一起如图
传感器是一个商用的物品已经没有第二次烧录的可能性他里面已经烧录了代码只要连接引脚通过引脚给他指令就可以工作可以理解成一个蓄势待发的玩具青蛙等待一个指令就可以不停的跳工作。引脚也可以理解成一个硬件级别的API接口哈哈 而传感器的SDK就相当于一个指令集比如一个蓝牙耳机你看说明书他会告诉你怎么按API接口可以播放音乐、暂停音乐。类似的一般的传感器会提供SPI或者是I2C的通信SDK会告诉你怎么通过函数API让他开始传输数据哈哈这里就比较复杂一点没法对6条线实物操作好像你只能把他掐断了但他也工作不了需要自己写代码去驱动。什么是驱动就是拿着他的SDK放在自己代码中。
那有人问了函数API怎么就能通过六条线进行指令啦这涉及到通信啦大家感兴趣的话可以了解一下SPI 通信、计算机网络但是对于我们代码来说其实属于最高级别的应用层直接黑盒子拿API来使用。如果问代码为啥可以变成 0/1进行通信那就得去学学计科计组和编译啦。
在与BMI160进行交互时通常我们会通过其寄存器来配置设备、读取数据以及执行其他操作。这些寄存器包括配置寄存器、数据寄存器、状态寄存器等。大家看到SDK里面有很多宏定义大部分都是寄存器的一些地址这也是需要硬件商家提供的让API的每一个对应函数功能都去找对应的寄存器存或者取数据。不用理会其中的为啥这个宏定义就i是1或者2这就是硬件商家规定好的就像你给一个物体打个标签区分他们一样你只要看他的变量名字就好了。
好我们了解了传感器SDK一般会给我们的东西仔细琢磨可以知道他是怎么运作想直接用的话你可以直接把他当成黑盒子直接调用他给出的API就好涉及的库直接记得依赖进来就好。
关键
我们刚才说通过SPI线进行驱动传感器才会工作那SPI的传输数据代码到底是属于谁的呢是主控的因为我们烧写的代码是在主控上进行的写的代码就要调用主控上的SPI端口。 好像传感器的SDK也有写到SPI但他实际上只是变量写了SPI相关字眼实际上函数参数导入主控上SPI对象告诉你应该从哪个寄存器存或者取然后根本还是要用主控上SPI去读取。 主控上一般都会给出I2C和SPI的示例代码只要进行调用对应的函数就好了。
// nrf_drv_spi_transfer 是nrf528xx的API, spi_read_transfer是自己命名的函数
int8_t spi_read_transfer(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{ret_code_t ret ;uint8_t read_temp[ length 1 ] ;reg_addr reg_addr | 0x80; ret nrf_drv_spi_transfer(spi, reg_addr, 1, read_temp, length 1 ) ; nrf_delay_ms(5); for( int i 1 ; i length 1 ; i )reg_data[i-1] read_temp[i] ;return (int8_t)ret;
}int8_t spi_write_transfer(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{ret_code_t ret;uint8_t write_temp[ length 1 ] ;reg_addr reg_addr 0x7F;write_temp[0] reg_addr ;for( int i 1 ; i length 1 ; i )write_temp[i] reg_data[i-1] ;ret nrf_drv_spi_transfer(spi, write_temp, length 1, no_use, 1 ) ;nrf_delay_ms(5) ;return (int8_t)ret;
}我们来看看bmi160的SDK dev-read底层用的是nrf52的SPI接口具体代码在bmi160的示例中
sensor.read spi_read_transfer;
sensor.write spi_write_transfer;他将sensor这个类的read句柄接入了spi_read_transfer而这个函数本质是nrf_drv_spi_transfer()
示例
整体流程是 1、实例化bmi160BMI160 SDK) 2、实例化SPInrf52 SDK) 3、将bmi160 设置的SPI句柄实例化 3、读取传感器数据BMI160 SDK) github 示例
可能的bug
如果数据一直是0的话看是否激活sensor进行工作比如bmi160就需要以下这句代码让他不断读取数据
// set configurationsensor_calibration.acc_cg.power BMI160_ACC_NORMAL_MODE; // power modesensor_calibration.gyro_cfg.power BMI160_GYRO_NORMAL_MODE; // power mode如果和蓝牙一起使用注意 spi和蓝牙的优先级
spi_config0.irq_priority 2;