STM32驱动ICM42688的核心配置

废话不多说,直接上图,stm32cubeMX配置(具体可以按照手册调整为更快的通信速度)

stm32HAL库底层驱动分享(下面测试通过的,放心使用),只分享了测试过的几个函数,其他的函数大家自己动手解决一下,不然要付费了,哈哈哈

/*******************************************************************************
* 名    称: icm42688_read_reg
* 功    能: 读取单个寄存器的值
* 入口参数: reg: 寄存器地址
* 出口参数: 当前寄存器地址的值
* 作  者: Baxiange
* 创建日期: 2022-07-25
* 修    改:
* 修改日期:
* 备    注: 使用SPI读取寄存器时要注意:最高位为读写位,详见datasheet page51.
*******************************************************************************/

uint8_t hal_Spi1_ReadWriteByte(uint8_t txdata)
{
    uint8_t rxdata = 0;
    HAL_SPI_TransmitReceive(&hspi2, &txdata, &rxdata, 1, 5); //超时5ms
    return rxdata;
}

/*******************************************************************************
* 名    称: Icm_Spi_ReadWriteNbytes
* 功    能: 使用SPI读写n个字节
* 入口参数: pBuffer: 写入的数组  len:写入数组的长度
* 出口参数: 无
* 作  者: Baxiange
* 创建日期: 2022-07-25
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
static void Icm_Spi_ReadWriteNbytes(uint8_t* pBuffer, uint8_t len)
{
    uint8_t i = 0;

#if defined(ICM_USE_HARD_SPI)
    for(i = 0; i < len; i ++)
    {
//        *pBuffer = hal_Spi2_ReadWriteByte(*pBuffer);
			  *pBuffer = hal_Spi1_ReadWriteByte(*pBuffer);
        pBuffer++;
    }
#endif

}


/*******************************************************************************
* 名    称: icm42688_read_reg
* 功    能: 读取单个寄存器的值
* 入口参数: reg: 寄存器地址
* 出口参数: 当前寄存器地址的值
* 作  者: Baxiange
* 创建日期: 2022-07-25
* 修    改:
* 修改日期:
* 备    注: 使用SPI读取寄存器时要注意:最高位为读写位,详见datasheet page51.
*******************************************************************************/
static uint8_t icm42688_read_reg(uint8_t reg)
{
    uint8_t regval = 0;

#if defined(ICM_USE_HARD_SPI)
    SPI_SCL3300_CS_LOW();
//		printf("ICM_SPI_CS_LOW\n");
    reg |= 0x80;
    /* 写入要读的寄存器地址 */
    Icm_Spi_ReadWriteNbytes(&reg, 1);
    /* 读取寄存器数据 */
    Icm_Spi_ReadWriteNbytes(&regval, 1);
    SPI_SCL3300_CS_HIGH();
//		printf("ICM_SPI_CS_HIGH\n");
#elif defined(ICM_USE_HARD_I2C)

#endif

    return regval;
}

/*******************************************************************************
* 名    称: icm42688_read_regs
* 功    能: 连续读取多个寄存器的值
* 入口参数: reg: 起始寄存器地址 *buf数据指针,uint16_t len长度
* 出口参数: 无
* 作  者: Baxiange
* 创建日期: 2022-07-25
* 修    改:
* 修改日期:
* 备    注: 使用SPI读取寄存器时要注意:最高位为读写位,详见datasheet page50.
*******************************************************************************/
static void icm42688_read_regs(uint8_t reg, uint8_t* buf, uint16_t len)
{
#if defined(ICM_USE_HARD_SPI)
    reg |= 0x80;
    SPI_SCL3300_CS_LOW();
    /* 写入要读的寄存器地址 */
    Icm_Spi_ReadWriteNbytes(&reg, 1);
    /* 读取寄存器数据 */
    Icm_Spi_ReadWriteNbytes(buf, len);
    SPI_SCL3300_CS_HIGH();
#elif defined(ICM_USE_HARD_I2C)
#endif
}


/*******************************************************************************
* 名    称: icm42688_write_reg
* 功    能: 向单个寄存器写数据
* 入口参数: reg: 寄存器地址 value:数据
* 出口参数: 0
* 作  者: Baxiange
* 创建日期: 2022-07-25
* 修    改:
* 修改日期:
* 备    注: 使用SPI读取寄存器时要注意:最高位为读写位,详见datasheet page50.
*******************************************************************************/
static uint8_t icm42688_write_reg(uint8_t reg, uint8_t value)
{
#if defined(ICM_USE_HARD_SPI)
    SPI_SCL3300_CS_LOW();
    /* 写入要读的寄存器地址 */
    Icm_Spi_ReadWriteNbytes(&reg, 1);
    /* 读取寄存器数据 */
    Icm_Spi_ReadWriteNbytes(&value, 1);
    SPI_SCL3300_CS_HIGH();
#elif defined(ICM_USE_HARD_I2C)
#endif
    return 0;
}

其他的我给大家发个地址,自己去粘贴吧,去吧皮卡丘

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值