首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ICM20948与STM32F446RE硬件抽象层的接口

ICM20948与STM32F446RE硬件抽象层的接口
EN

Stack Overflow用户
提问于 2020-05-16 22:55:27
回答 1查看 173关注 0票数 0

我在连接ICM20948 IMU和ST的HAL_layer时遇到了问题。我的主设备(ST)正确地将数据发送到从设备(ICM),但从设备没有响应。我已经很好地检查了每一个连接。我已经测试了几个ICM(3),我也已经用我的逻辑分析仪对它进行了调试(见下图),我真的很感谢你能提供给我的任何帮助或指针。

我当前的设置是

代码非常简单,我只有两个简单的读/写循环

代码语言:javascript
复制
// --------------------------------------------------------------------------------------
/// \brief
///
/// \param *imu[in,out]: (IMU_def) IMU object with their respective ports
/// \param reg[in]: (uint8_t) register address
/// \param *pData[out]: (uint8_t) Data buffer
/// \return void
// --------------------------------------------------------------------------------------
void                    ICM_ReadOneByte                             (IMU_def *imu, uint8_t reg, uint8_t *pData)
{
    reg = reg | 0x80;                                                   // Make the MSB active to tell is a read see p31
    HAL_GPIO_WritePin(imu->CS_GPIO_Port, imu->CS_Pin, GPIO_PIN_RESET);  // Start transmission
    HAL_Delay(1);
    HAL_SPI_Transmit(imu->spi_bus, &reg, 1,1000);
    while (HAL_SPI_GetState(imu->spi_bus) != HAL_SPI_STATE_READY)           // TODO: Possible inf loop if slave don't answer. Counter?
        ;
    HAL_SPI_Receive(imu->spi_bus, pData, 1,1000);
    while (HAL_SPI_GetState(imu->spi_bus) != HAL_SPI_STATE_READY)           // TODO: Possible inf loop if slave don't answer. Counter?
        ;
    HAL_GPIO_WritePin(imu->CS_GPIO_Port, imu->CS_Pin, GPIO_PIN_SET);    // End transmission
}

// --------------------------------------------------------------------------------------
/// \brief
///
/// \param *imu[in,out]: (IMU_def) IMU object with their respective ports
/// \param reg[in]: (uint8_t) register address
/// \param Data[in]: (uint8_t) Data to write
/// \return void
// --------------------------------------------------------------------------------------
void                    ICM_WriteOneByte                            (IMU_def *imu, uint8_t reg, uint8_t Data)
{
    reg = reg & 0x7F;                                                   // Make the MSB disable to tell is a write see p31
    HAL_GPIO_WritePin(imu->CS_GPIO_Port, imu->CS_Pin, GPIO_PIN_RESET);  // Start transmission
    HAL_Delay(5);
    HAL_SPI_Transmit(imu->spi_bus, &reg, 1,1000);
    HAL_SPI_Transmit(imu->spi_bus, &Data, 1,1000);
    HAL_GPIO_WritePin(imu->CS_GPIO_Port, imu->CS_Pin, GPIO_PIN_SET);    // End transmission
}

在main函数中,我使用SPI_HandleTypeDef hspi2;实例将IMU对象初始化为

代码语言:javascript
复制
    imu.spi_bus      = &hspi2;
    imu.CS_GPIO_Port = GPIOB;
    imu.CS_Pin       = GPIO_PIN_4;

只是为了测试一切正常,我只是选择了BANK_0,并询问WHOIAM by

代码语言:javascript
复制
ICM_WriteOneByte(imu,USER_BANK_SEL, ICM_BANK_0); // USER_BANK_SEL (0x7F); USER_BANK_0:(0x00)
ICM_ReadOneByte(imu, 0x00, &whoami); // 

在调用WHOIAM()之前,我还尝试了几个步骤,比如设置重置设备、设置内部时钟等,但都不起作用。下面是我设置其他行的方法,以防万一:

代码语言:javascript
复制
ICM_WriteOneByte(imu,PWR_MGMNT_1, PWR_MGMNT_1_DEV_RESET); //PWR_MGMNT_1 (0x06);PWR_MGMNT_1_DEV_RESET:(0x80)
ICM_WriteOneByte(imu,PWR_MGMNT_1,PWR_MGMNT_1_CLOCK_SEL_AUTO);//(0x01)

此外,我还尝试了NSS禁用(因为只有一个设备)或硬件(ST作为输出),但没有任何变化。

这是我的逻辑分析器的图片

正如您所看到的,Master正在正确地将数据发送到slave,但是slave在MISO线路中始终是高电平。我用我的逻辑分析仪检查了频率,根据数据集的说明,频率低于7 7MHz。

N下降8 n上升8 fmin 3.846 MHz fmax 4.167 MHz平均3.977 MHz

任何想法都非常受欢迎。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-10-14 18:05:45

从手册中:

注意:为防止在使用I2C时切换到I2C模式,应通过设置I2C_IF_DIS配置位来禁用I2C_IF_DIS接口。在等待第6.3节中的“寄存器读/写启动时间”指定的时间后,应立即设置此位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61838739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档