STM32 - NUCLEO F401RE 和使用 HAL_I2C_Mem_Read_DMA 进行多次读取

问题描述 投票:0回答:1

我正在做一个涉及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 文件的链接

callback stm32 sensors i2c dma
1个回答
0
投票
  1. 使用 DMA 读取一个字节没有任何意义
  2. 您需要从回调开始第二次和第三次传输。
© www.soinside.com 2019 - 2024. All rights reserved.