回答

收藏

[评测分享] 【正点原子 F103板卡试用】SPI

#板卡评测 #板卡评测 1461 人阅读 | 0 人回复 | 2022-05-27

这次教程目的很简单 使用SPI解算ICM20602数据并且送到oled上显示首先看看ICM20602数据手册




还是那句话都2022年了 换个新一点的芯片吧,,,,


SPI时序图 我们编写驱动就是按照这个来的
对于陀螺仪我们一般都推荐采用SPI通信 因为速度足够快!!

先定义一组数据和20602的寄存器
如图 名字都有了
  1. int16 icm_gyro_x,icm_gyro_y,icm_gyro_z;
  2. int16 icm_acc_x,icm_acc_y,icm_acc_z;
复制代码


  1. extern int16 icm_gyro_x,icm_gyro_y,icm_gyro_z;
  2. extern int16 icm_acc_x,icm_acc_y,icm_acc_z;

复制代码


这里我们使用模拟iic
  1. void icm20602_self1_check(void)
  2. {
  3.     uint8 dat=0;
  4.     while(0x12 != dat)   //读取ICM20602 ID
  5.     {
  6.         dat = simiic_read_reg(ICM20602_DEV_ADDR,ICM20602_WHO_AM_I,SIMIIC);
  7.         systick_delay_ms(STM0, 10);
  8.         //卡在这里原因有以下几点
  9.         //1 ICM20602坏了,如果是新的这样的概率极低
  10.         //2 接线错误或者没有接好
  11.         //3 可能你需要外接上拉电阻,上拉到3.3V
  12.                 //4 可能没有调用模拟IIC的初始化函数
  13.     }
  14. }

复制代码


首先是自检函数 用来检查是不是正常的

初始化函数
  1. void icm20602_init(void)
  2. {
  3.         simiic_init();
  4.     systick_delay_ms(STM0, 10);  //上电延时
  5.    
  6.     //检测
  7.     icm20602_self1_check();
  8.    
  9.     //复位
  10.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_1,0x80);               //复位设备
  11.     systick_delay_ms(STM0, 2);                                                        //延时
  12.     while(0x80 & simiic_read_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_1,SIMIIC));//等待复位完成
  13.    
  14.     //配置参数
  15.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_1,0x01);               //时钟设置
  16.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_PWR_MGMT_2,0x00);               //开启陀螺仪和加速度计
  17.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_CONFIG,0x01);                   //176HZ 1KHZ
  18.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_SMPLRT_DIV,0x07);               //采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV)
  19.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_GYRO_CONFIG,0x18);              //±2000 dps
  20.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_ACCEL_CONFIG,0x10);             //±8g
  21.     simiic_write_reg(ICM20602_DEV_ADDR,ICM20602_ACCEL_CONFIG_2,0x03);           //Average 4 samples   44.8HZ   //0x23 Average 16 samples
  22. }
复制代码
得到加速度计数据
  1. void get_icm20602_accdata(void)
  2. {
  3.     uint8 dat[6];
  4.    
  5.     simiic_read_regs(ICM20602_DEV_ADDR, ICM20602_ACCEL_XOUT_H, dat, 6, SIMIIC);  
  6.     icm_acc_x = (int16)(((uint16)dat[0]<<8 | dat[1]));
  7.     icm_acc_y = (int16)(((uint16)dat[2]<<8 | dat[3]));
  8.     icm_acc_z = (int16)(((uint16)dat[4]<<8 | dat[5]));
  9. }
复制代码
得到陀螺仪数据
  1. void get_icm20602_gyro(void)
  2. {
  3.     uint8 dat[6];

  4.     simiic_read_regs(ICM20602_DEV_ADDR, ICM20602_GYRO_XOUT_H, dat, 6, SIMIIC);  
  5.     icm_gyro_x = (int16)(((uint16)dat[0]<<8 | dat[1]));
  6.     icm_gyro_y = (int16)(((uint16)dat[2]<<8 | dat[3]));
  7.     icm_gyro_z = (int16)(((uint16)dat[4]<<8 | dat[5]));
  8. }
复制代码
陀螺仪驱动就做完了在主函数里分别初始化器件
直接调用函数就可以查看对应变量



因为帖子太长被限制了 寄存器数据我日后补发
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条