废话不多说,直接上图,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(®, 1);
/* 读取寄存器数据 */
Icm_Spi_ReadWriteNbytes(®val, 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(®, 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(®, 1);
/* 读取寄存器数据 */
Icm_Spi_ReadWriteNbytes(&value, 1);
SPI_SCL3300_CS_HIGH();
#elif defined(ICM_USE_HARD_I2C)
#endif
return 0;
}
其他的我给大家发个地址,自己去粘贴吧,去吧皮卡丘