查看: 972|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-12 19:35
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2022-5-27 17:17:46 | 显示全部楼层 |阅读模式
    分享到:
    这次教程目的很简单 使用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. }
    复制代码
    陀螺仪驱动就做完了在主函数里分别初始化器件
    直接调用函数就可以查看对应变量
    download.png


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

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 05:00 , Processed in 0.121692 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.