在将ICM20948 IMU与ST的HAL_layer连接时遇到麻烦。我的主设备(ST)将数据正确发送到从设备(ICM),但从设备没有响应。我已经很好地检查了每个连接。我已经测试了多个ICM(3),并且还使用逻辑分析仪对其进行了调试(请参见下图),我非常感谢您能为我提供的任何帮助或指针。
我当前的设置是
代码非常简单,我只有两个简单的读/写例程
// --------------------------------------------------------------------------------------
/// \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, ®, 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, ®, 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
}
在主要功能中,我使用SPI_HandleTypeDef hspi2;
实例将IMU对象初始化为
imu.spi_bus = &hspi2;
imu.CS_GPIO_Port = GPIOB;
imu.CS_Pin = GPIO_PIN_4;
为了测试一切正常,我刚刚选择了BANK_0,并通过
询问WHOIAMICM_WriteOneByte(imu,USER_BANK_SEL, ICM_BANK_0); // USER_BANK_SEL (0x7F); USER_BANK_0:(0x00)
ICM_ReadOneByte(imu, 0x00, &whoami); //
在调用WHOIAM()之前,我还尝试了一些步骤,例如设置设备重置,设置内部时钟等,但是没有任何效果。这是我设置其他行的方式,以防万一:
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 Disable(因为只有一台设备)或Hardware(ST作为输出),但没有任何改变。
如您所见,主机正在将数据正确发送到从机,但从机在MISO线中始终为高电平。我已使用逻辑分析仪检查了频率,并且如数据手册所述
处于7MHz以下落下8 指甲8 fmin 3.846兆赫 最大频率4.167 MHz fmean 3.977 MHz
任何想法都非常受欢迎。 谢谢!
答案 0 :(得分:0)
从手册:
注:为了防止在使用SPI时切换到I2C模式,应通过将I2C_IF_DIS配置位置1来禁用I2C接口。在等待第6.3节“寄存器读/写的启动时间”指定的时间后,应立即执行设置此位的操作。