首页 > 其他分享 >TI-MSPM0G3507外设使用,SPI串口连接ICM20602陀螺仪

TI-MSPM0G3507外设使用,SPI串口连接ICM20602陀螺仪

时间:2024-07-20 10:56:54浏览次数:15  
标签:SPI ICM ICM20602 MSPM0G3507 uint8 icm20602 串口 define

写在前面

备战2024电赛,使用到了TI开发板,型号MSPM0G3507,该开发板除文档外,网上资料稀少。
现在为大家提供spi连接icm20602陀螺仪的代码,以促共同进步。
该代码由逐飞seekfree仓库移植而来,如有侵权请私信联系我删除,谢谢。
代码亲测成功,如有bug欢迎评论区指正。

头文件

ICM20602.h

#ifndef ICM20602_H
#define ICM20602_H
#include "../COMMON.h"
#define ICM20602_DEV_ADDR           (0x69)
#define ICM20602_SPI_W              (0x00)
#define ICM20602_SPI_R              (0x80)

#define ICM20602_XG_OFFS_TC_H       (0x04)
#define ICM20602_XG_OFFS_TC_L       (0x05)
#define ICM20602_YG_OFFS_TC_H       (0x07)
#define ICM20602_YG_OFFS_TC_L       (0x08)
#define ICM20602_ZG_OFFS_TC_H       (0x0A)
#define ICM20602_ZG_OFFS_TC_L       (0x0B)
#define ICM20602_SELF_TEST_X_ACCEL  (0x0D)
#define ICM20602_SELF_TEST_Y_ACCEL  (0x0E)
#define ICM20602_SELF_TEST_Z_ACCEL  (0x0F)
#define ICM20602_XG_OFFS_USRH       (0x13)
#define ICM20602_XG_OFFS_USRL       (0x14)
#define ICM20602_YG_OFFS_USRH       (0x15)
#define ICM20602_YG_OFFS_USRL       (0x16)
#define ICM20602_ZG_OFFS_USRH       (0x17)
#define ICM20602_ZG_OFFS_USRL       (0x18)
#define ICM20602_SMPLRT_DIV         (0x19)
#define ICM20602_CONFIG             (0x1A)
#define ICM20602_GYRO_CONFIG        (0x1B)
#define ICM20602_ACCEL_CONFIG       (0x1C)
#define ICM20602_ACCEL_CONFIG_2     (0x1D)
#define ICM20602_LP_MODE_CFG        (0x1E)
#define ICM20602_ACCEL_WOM_X_THR    (0x20)
#define ICM20602_ACCEL_WOM_Y_THR    (0x21)
#define ICM20602_ACCEL_WOM_Z_THR    (0x22)
#define ICM20602_FIFO_EN            (0x23)
#define ICM20602_FSYNC_INT          (0x36)
#define ICM20602_INT_PIN_CFG        (0x37)
#define ICM20602_INT_ENABLE         (0x38)
#define ICM20602_FIFO_WM_INT_STATUS (0x39)
#define ICM20602_INT_STATUS         (0x3A)
#define ICM20602_ACCEL_XOUT_H       (0x3B)
#define ICM20602_ACCEL_XOUT_L       (0x3C)
#define ICM20602_ACCEL_YOUT_H       (0x3D)
#define ICM20602_ACCEL_YOUT_L       (0x3E)
#define ICM20602_ACCEL_ZOUT_H       (0x3F)
#define ICM20602_ACCEL_ZOUT_L       (0x40)
#define ICM20602_TEMP_OUT_H         (0x41)
#define ICM20602_TEMP_OUT_L         (0x42)
#define ICM20602_GYRO_XOUT_H        (0x43)
#define ICM20602_GYRO_XOUT_L        (0x44)
#define ICM20602_GYRO_YOUT_H        (0x45)
#define ICM20602_GYRO_YOUT_L        (0x46)
#define ICM20602_GYRO_ZOUT_H        (0x47)
#define ICM20602_GYRO_ZOUT_L        (0x48)
#define ICM20602_SELF_TEST_X_GYRO   (0x50)
#define ICM20602_SELF_TEST_Y_GYRO   (0x51)
#define ICM20602_SELF_TEST_Z_GYRO   (0x52)
#define ICM20602_FIFO_WM_TH1        (0x60)
#define ICM20602_FIFO_WM_TH2        (0x61)
#define ICM20602_SIGNAL_PATH_RESET  (0x68)
#define ICM20602_ACCEL_INTEL_CTRL   (0x69)
#define ICM20602_USER_CTRL          (0x6A)
#define ICM20602_PWR_MGMT_1         (0x6B)
#define ICM20602_PWR_MGMT_2         (0x6C)
#define ICM20602_I2C_IF             (0x70)
#define ICM20602_FIFO_COUNTH        (0x72)
#define ICM20602_FIFO_COUNTL        (0x73)
#define ICM20602_FIFO_R_W           (0x74)
#define ICM20602_WHO_AM_I           (0x75)
#define ICM20602_XA_OFFSET_H        (0x77)
#define ICM20602_XA_OFFSET_L        (0x78)
#define ICM20602_YA_OFFSET_H        (0x7A)
#define ICM20602_YA_OFFSET_L        (0x7B)
#define ICM20602_ZA_OFFSET_H        (0x7D)
#define ICM20602_ZA_OFFSET_L        (0x7E)

#define ICM20602_TIMEOUT_COUNT      (0x00FF)     

void    icm20602_get_acc            (void);                               
void    icm20602_get_gyro           (void);                    
uint8_t   icm20602_init               (void);       

extern int16_t icm20602_gyro_x, icm20602_gyro_y, icm20602_gyro_z; 
extern int16_t icm20602_acc_x,  icm20602_acc_y,  icm20602_acc_z;
extern float icm20602_transition_factor[2];         

#define icm20602_acc_transition(acc_value)      ((float)(acc_value) / icm20602_transition_factor[0])
#define icm20602_gyro_transition(gyro_value)    ((float)(gyro_value) / icm20602_transition_factor[1])

#endif

源文件

1.ICM20602.c

#include "ICM20602.h"
int16_t icm20602_gyro_x = 0, icm20602_gyro_y = 0, icm20602_gyro_z = 0;   
int16_t icm20602_acc_x = 0, icm20602_acc_y = 0, icm20602_acc_z = 0;   
float icm20602_transition_factor[2] = {4096, 16.4};   
#define ICM20602_CS(x)              ((x) ? (DL_GPIO_setPins(OTHER_PORT,OTHER_ICM_CS_PIN)) : (DL_GPIO_clearPins(OTHER_PORT,OTHER_ICM_CS_PIN)))

void spi_write_8bit_register(uint8_t reg, uint8_t data){
    DL_SPI_transmitData8(ICM_SPI_INST, reg); 
    while (DL_SPI_isBusy(ICM_SPI_INST));
    DL_SPI_transmitData8(ICM_SPI_INST, data); 
    while (DL_SPI_isBusy(ICM_SPI_INST));
}
void spi_read_8bit_registers(uint8_t reg, uint8_t *data, uint32_t len){
    DL_SPI_transmitData8(ICM_SPI_INST,reg);
    while (DL_SPI_isBusy(ICM_SPI_INST));
    for (int i = 0; i< len; i++) {
        DL_SPI_transmitData8(ICM_SPI_INST,0);
        while (DL_SPI_isBusy(ICM_SPI_INST));
        while (!DL_SPI_isRXFIFOEmpty(ICM_SPI_INST)) 
            data[i] = DL_SPI_receiveData8(ICM_SPI_INST);
    }
}
uint8_t spi_read_8bit_register(uint8_t reg){
    DL_SPI_transmitData8(ICM_SPI_INST,reg);
    while (DL_SPI_isBusy(ICM_SPI_INST));
    DL_SPI_transmitData8(ICM_SPI_INST,0);
    while (DL_SPI_isBusy(ICM_SPI_INST));
    uint8_t data = 0;
    while (!DL_SPI_isRXFIFOEmpty(ICM_SPI_INST)) 
        data = DL_SPI_receiveData8(ICM_SPI_INST);
    return data;
}
static void icm20602_write_register(uint8_t reg, uint8_t data)
{
    ICM20602_CS(0);
    spi_write_8bit_register(reg | ICM20602_SPI_W, data);
    ICM20602_CS(1);
}
static uint8_t icm20602_read_register(uint8_t reg)
{
    uint8_t data = 0;
    ICM20602_CS(0);
    data = spi_read_8bit_register(reg | ICM20602_SPI_R);
    ICM20602_CS(1);
    return data;
}
static void icm20602_read_registers(uint8_t reg, uint8_t *data, uint32_t len)
{
    ICM20602_CS(0);
    spi_read_8bit_registers(reg | ICM20602_SPI_R, data, len);
    ICM20602_CS(1);
}
uint8_t icm20602_self_check (void)
{
    uint8_t dat = 0, return_state = 0;
    uint16_t timeout_count = 0;

    while(0x12 != dat)                                                   
    {
        if(ICM20602_TIMEOUT_COUNT < timeout_count ++)
        {
            return_state =  1;
            break;
        }
        dat = icm20602_read_register(ICM20602_WHO_AM_I);
    }
    return return_state;
}

void icm20602_get_acc (void)
{
    uint8_t dat[6];

    icm20602_read_registers(ICM20602_ACCEL_XOUT_H, dat, 6);
    icm20602_acc_x = (int16_t)(((uint16_t)dat[0] << 8 | dat[1]));
    icm20602_acc_y = (int16_t)(((uint16_t)dat[2] << 8 | dat[3]));
    icm20602_acc_z = (int16_t)(((uint16_t)dat[4] << 8 | dat[5]));
}

void icm20602_get_gyro (void)
{
    uint8_t dat[6];

    icm20602_read_registers(ICM20602_GYRO_XOUT_H, dat, 6);
    icm20602_gyro_x = (int16_t)(((uint16_t)dat[0] << 8 | dat[1]));
    icm20602_gyro_y = (int16_t)(((uint16_t)dat[2] << 8 | dat[3]));
    icm20602_gyro_z = (int16_t)(((uint16_t)dat[4] << 8 | dat[5]));
}

uint8_t icm20602_init (void)
{
    uint8_t val = 0x0, return_state = 0;
    uint16_t timeout_count = 0;

    system_delay_ms(10);  

    do
    {
        if(icm20602_self_check())
        {
            return_state = 1;
            break;
        }
        icm20602_write_register(ICM20602_PWR_MGMT_1, 0x80);                     // 复位设备
        system_delay_ms(2);

        do
        {                                                                       // 等待复位成功
            val = icm20602_read_register(ICM20602_PWR_MGMT_1);
            if(ICM20602_TIMEOUT_COUNT < timeout_count ++)
            {
                return_state = 2;
                break;
            }
        }while(0x41 != val);
        if(2 == return_state)
        {
            break;
        }

        icm20602_write_register(ICM20602_PWR_MGMT_1,     0x01);             
        icm20602_write_register(ICM20602_PWR_MGMT_2,     0x00);        
        icm20602_write_register(ICM20602_CONFIG,         0x01);                 
        icm20602_write_register(ICM20602_SMPLRT_DIV,     0x07);      

        icm20602_write_register(ICM20602_ACCEL_CONFIG, 0x10);
        icm20602_transition_factor[0] = 4096;


        icm20602_write_register(ICM20602_GYRO_CONFIG, 0x18);
        icm20602_transition_factor[1] = 16.4;

        icm20602_write_register(ICM20602_ACCEL_CONFIG_2, 0x03); 
    }while(0);
    return return_state;
}

2.测试代码
通过自行查看icm20602_init()的返回值
以及icm20602_gyro_x,icm20602_acc_x等值的大小来观察测试结果

#include "Library/COMMON.h"
int main(void)
{
    SYSCFG_DL_init();
    icm20602_init();
    while (1) {
        icm20602_get_gyro();
        icm20602_get_acc();
        system_delay_ms(1);
    }
}

配置

一个SPI,命名为ICM_SPI
一个GPIO,端口命名为OTHER
一个PIN命名为ICM_CS,设置为Output,默认高电平

后话

还请大家鼓励支持
欢迎访问个人网址
项目开源地址

标签:SPI,ICM,ICM20602,MSPM0G3507,uint8,icm20602,串口,define
From: https://blog.csdn.net/2401_86231275/article/details/140567468

相关文章

  • 蓝桥杯单片学习总结(Day12 串口通讯实验)
    实验现象:        通过串口调试助手发送数字1~8,板子上面的对应指示灯亮。注意此处发送应选择文本模式发送。 实例代码:#include<STC15F2K60S2.H>#defineBUAD 9600//所需波特率、#defineSYSTEMCLOCK 11059200L//系统时钟频率,L表示该数据为长整型voiduart_......
  • AMD R2000 Bilby 单板 串口在Grub和Linux下的使用
    Ubuntu20启动时,自动加载了UART驱动,系统启动信息含有UART的相关信息。[2.418748]printk:console[ttyS4]disabled[2.418757]AMDI0020:00:ttyS4atMMIO0xfedc9000(irq=3,base_baud=3000000)isa16550A[2.418820]printk:console[ttyS4]enabled[......
  • C#调用C++库,进行串口通信
    1、添加C++接口实现,将dll放置在运行路径下。dll文件下载:https://files.cnblogs.com/files/ZM191018/SerialPortLib.7z?t=1721271982&download=true[DllImport("SerialPortLib.dll",CharSet=CharSet.Unicode,CallingConvention=CallingConvention.StdCall)]......
  • 【QT开发】串口通信管理QSerialPort类详解及实战应用
    QSerialPort是Qt提供的一个功能强大、简单易用的串口通信类。通过本文的学习,您应该对QSerialPort的基本使用、高级应用技巧及相关注意事项有了全面的理解。在实际项目中,QSerialPort可以帮助实现与外部设备的串口通信,确保数据的可靠传输和接收。希望本文能帮助您更好地......
  • 07:串口通信二
    串口编程1、与波特率之相关的寄存器2、PCON寄存器3、SCON寄存器4、配置的代码分析5、向PC发送一段字符串6、PC机向单片机发送字符控制LED1灯的亮灭1、与波特率之相关的寄存器如图,与串口通信相关的寄存器主要是SCON和PCON寄存器。2、PCON寄存器SMOD:为1时,通信方式1......
  • 串口、IIC、SPI的优缺点
    串口、IIC、SPI的优缺点串口(SerialPort)串口通信是一种基本的串行通信方式,它通过串行数据线(TX和RX)进行数据的发送和接收。串口通信通常用于微控制器与PC或其他设备之间的通信。特点:简单易用,硬件实现成本低。通信速率较低,适合长距离通信。可以实现全双工通信(同时发送和接收......
  • STMF4串口通信使用
    目录STMF4串口通信使用USART的使用流程注意STMF4串口通信使用前提回顾:串口通信概念介绍1STM32串口通信概念介绍2针对特定stm32F4板子的串口接线折叠文本USART指的是通用同步异步收发器,是STM32中的串行通信设备,STM32F407ZET6一共提供了6个串行接口供用户使用,其中4个为US......
  • USART串口协议 和va_list,va_start,va_end,vsprintf
    串口接口通信的目的:将一个设备的数据传送到另一个设备扩展硬件系统通讯协议:制定通信的规则,通信双方按照协议规则进行数据收发。注意:差分信号一般传输速度和距离都会非常高。多设备相当于老师在教师给所有同学讲课,点对点相当于老师找你到办公室谈话。串口是一种应用......
  • STM32串口通信概念介绍2
    STM32串口通信(1) 硬件接线说明采用4针的串口(TXD、RXD、GND、VCC),然后通过CH340芯片进行转换,就可以直接通过USB口转串口的方式达到和计算机通信的目的。如果采用有线方式与PC机进行通信,则需要用到CH340转换芯片,数据会通过USART1串口传输。(1) 串口通信参数串口通信属于全双......
  • 针对特种stm32F4板子的串口接线
    硬件接线说明直接采用4针的串口(TXD、RXD、GND、VCC),然后通过CH340芯片进行转换,就可以直接通过USB口转串口的方式达到和计算机通信的目的。如果采用有线方式与PC机进行通信,则需要用到CH340转换芯片,数据会通过USART1串口传输。如果采用无线方式与手机进行通信,则不需要用到CH......