我正在做一个涉及STM32和加速度传感器(LIS2DE)的项目 我必须每秒从传感器读取寄存器并通过 UART 将其发送到 arduino IDE,但是,不知道为什么,其他两个 HAL_I2C_Mem_Read_DMA 不起作用
我尝试删除第一个 Mem_Read,但只有第二个可以工作,所以我检查了第二个调用的返回值,它给了我 HAL_BUSY。 使用 HAL_I2C_Master_Transmit_DMA 和 HAL_I2C_Master_Receive_DMA 工作正常,但我想尝试这种方式,因为教授建议我们使用这个函数来自动执行发送+接收。 您认为单独使用“发送”和“接收”更好还是这一个更好?为什么?
另外,有没有一个函数可以获取所有3轴值?我检查了数据表,看到了自动增量功能,但我没有找到任何示例
我会留下我的代码,显然我设置了一个1秒的定时器,并为UART_TX、I2C_TX和I2C_RX设置了DMA,启用了来自UART、TIM和I2C事件的中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim){
HAL_I2C_Mem_Read_DMA(&hi2c1, ACCEL_ADD, OUT_X_ADD, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&acc[0], 1);
HAL_I2C_Mem_Read_DMA(&hi2c1, ACCEL_ADD, OUT_Y_ADD, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&acc[1], 1);
HAL_I2C_Mem_Read_DMA(&hi2c1, ACCEL_ADD, OUT_Z_ADD, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&acc[2], 1);
}
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef* hi2c){
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
if(count==2){ //because I'll receive a single interrupt for each Mem_Read, so after the third MemRxCpltCallback will transmit thanks UART values
count = 0;
len = snprintf(string, sizeof(string), "X: %+.3fg Y: %+.3fg Z: %+.3fg\n",
acc[0] / 256.0 * 4.0,
acc[1] / 256.0 * 4.0,
acc[2] / 256.0 * 4.0);
HAL_UART_Transmit_DMA(&huart2, (unsigned char*)string, len);
}
else
count++;
}
感谢您的帮助,如果您需要更多信息或者问题中有什么不好的地方,请告诉我,我会更新问题。如果有人需要的话,我也可以发布我的代码的 zip 文件的链接