当前位置: 首页 > news >正文

江科大IIC读取MPU6050hal库实现

hal库相关函数

初始化结构体 

typedef struct
{uint32_t ClockSpeed;       /*通讯速度*/uint32_t DutyCycle;        /*快速模式下的占空比*/uint32_t OwnAddress1;      /*设备地址1*/uint32_t AddressingMode;   /*设备地址模式*/uint32_t DualAddressMode;  /*双地址模式 */uint32_t OwnAddress2;      /*设备地址2*/uint32_t GeneralCallMode;  /*呼叫模式*/uint32_t NoStretchMode;    /*时钟延长模式*/} I2C_InitTypeDef;

句柄

#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
typedef struct __I2C_HandleTypeDef
#else
typedef struct
#endif  /* USE_HAL_I2C_REGISTER_CALLBACKS */
{I2C_TypeDef                *Instance;      /外设基地址*/I2C_InitTypeDef            Init;           /*初始化结构体*/uint8_t                    *pBuffPtr;      /*传输缓存区*/uint16_t                   XferSize;       /*传输数据大小             */__IO uint16_t              XferCount;      /*剩余传输数量     */__IO uint32_t              XferOptions;    /*传输选项*/__IO uint32_t              PreviousState;  /*通讯机上一个状态*/DMA_HandleTypeDef          *hdmatx;        /*IIC发送DMA句柄*/DMA_HandleTypeDef          *hdmarx;        /*IIC接收DMA句柄   */HAL_LockTypeDef            Lock;           /*状态锁存*/__IO HAL_I2C_StateTypeDef  State;          /*当前通讯状态*/__IO HAL_I2C_ModeTypeDef   Mode;           /*当前通讯模式*/__IO uint32_t              ErrorCode;      /*错误类型  */__IO uint32_t              Devaddress;     /*存储 I2C 目标设备的地址*/__IO uint32_t              Memaddress;     /*存放 I2C 目标设备内部的内存地址或寄存器地址*/__IO uint32_t              MemaddSize;     /*目标设备地址大小 */__IO uint32_t              EventCount;     /*记录 I2C 通信过程中发生的特定事件的次数 */#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);           /*!< I2C Master Tx Transfer completed callback */void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);           /*!< I2C Master Rx Transfer completed callback */void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*!< I2C Slave Tx Transfer completed callback  */void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*!< I2C Slave Rx Transfer completed callback  */void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c);             /*!< I2C Listen Complete callback              */void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Memory Tx Transfer completed callback */void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Memory Rx Transfer completed callback */void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c);                  /*!< I2C Error callback                        */void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Abort callback                        */void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);  /*!< I2C Slave Address Match callback */void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c);                /*!< I2C Msp Init callback                     */void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Msp DeInit callback                   */#endif  /* USE_HAL_I2C_REGISTER_CALLBACKS */
} I2C_HandleTypeDef;

 获取标志位

__HAL_I2C_GET_FLAG()

初始化函数

HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);

收发函数

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);

 主模式发送,接受,从模式发送接收,向存储器写入读取,校验设备状态

中断收发函数

HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);

HAL_I2C_Master_Seq_Transmit_IT:支持序列传输,可以分阶段发送数据,中间可插入重启条件(Re-START)或停止条件(STOP)。通过XferOptions参数控制传输阶段(如首次传输、中间传输、最后传输),适用于复杂的 I2C 通信协议(如多部分数据传输、寄存器寻址后的数据写入)。

HAL_I2C_Master_Transmit_IT:只能进行单次完整传输,发送数据后自动发送停止条件。适用于简单的一次性数据传输场景。

DMA收发函数

HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

hal库实现江科大

 我们按照江科大的I2C来配置

江科大的I2C1用到了OLED显示屏上面,所以我们要使用的是I2C2来进行通讯。

速度模式为快速模式。时钟为50KHz,占空比为2,从地址为七位,地址为0x00(这部分没啥用),全部默认值就可以了。

     IIC通讯的重点就是把标准库的函数转换成hal库的,软件模拟方式就是修改GPIO的输入输出,这个就不演示了,这里主要完成硬件IIC部分代码转换。

    首先看江科大的代码,主要就是由读写IIC两个核心代码为主,其他的代码都是在这个基础上完成的,所以我们只需要对读写IIC进行修改。

    /*** 函    数:MPU6050写寄存器* 参    数:RegAddress 寄存器地址,范围:参考MPU6050手册的寄存器描述* 参    数:Data 要写入寄存器的数据,范围:0x00~0xFF* 返 回 值:无*/
    void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
    {   uint8_t temp[2];temp[0] = RegAddress;temp[1] = Data;HAL_I2C_Master_Transmit(&hi2c2,MPU6050_ADDRESS,temp,2,500);
    //	I2C_GenerateSTART(I2C2, ENABLE);										//硬件I2C生成起始条件
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT);					//等待EV5
    //	
    //	I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter);	//硬件I2C发送从机地址,方向为发送
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);	//等待EV6
    //	
    //	I2C_SendData(I2C2, RegAddress);											//硬件I2C发送寄存器地址
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING);			//等待EV8
    //	
    //	I2C_SendData(I2C2, Data);												//硬件I2C发送数据
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED);				//等待EV8_2
    //	
    //	I2C_GenerateSTOP(I2C2, ENABLE);											//硬件I2C生成终止条件
    }/*** 函    数:MPU6050读寄存器* 参    数:RegAddress 寄存器地址,范围:参考MPU6050手册的寄存器描述* 返 回 值:读取寄存器的数据,范围:0x00~0xFF*/
    uint8_t MPU6050_ReadReg(uint8_t RegAddress)
    {uint8_t Data;uint8_t temp = RegAddress;HAL_I2C_Master_Transmit(&hi2c2,MPU6050_ADDRESS,&temp,1,500);//硬件I2C发送寄存器地址HAL_I2C_Master_Receive(&hi2c2,MPU6050_ADDRESS,&Data,1,500);
    //	I2C_GenerateSTART(I2C2, ENABLE);										//硬件I2C生成起始条件
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT);					//等待EV5
    //	
    //	I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Transmitter);	//硬件I2C发送从机地址,方向为发送
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);	//等待EV6
    //	
    //	I2C_SendData(I2C2, RegAddress);											//硬件I2C发送寄存器地址
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED);				//等待EV8_2
    //	
    //	I2C_GenerateSTART(I2C2, ENABLE);										//硬件I2C生成重复起始条件
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT);					//等待EV5
    //	
    //	I2C_Send7bitAddress(I2C2, MPU6050_ADDRESS, I2C_Direction_Receiver);		//硬件I2C发送从机地址,方向为接收
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);		//等待EV6
    //	
    //	I2C_AcknowledgeConfig(I2C2, DISABLE);									//在接收最后一个字节之前提前将应答失能
    //	I2C_GenerateSTOP(I2C2, ENABLE);											//在接收最后一个字节之前提前申请停止条件
    //	
    //	MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED);				//等待EV7
    //	Data = I2C_ReceiveData(I2C2);											//接收数据寄存器
    //	
    //	I2C_AcknowledgeConfig(I2C2, ENABLE);									//将应答恢复为使能,为了不影响后续可能产生的读取多字节操作return Data;
    }

    我们用hal库的IIC通讯方式修改标准库的通讯方式就行了,这么一看hal库的更为简单,只需要调用函数即可,而标准库得我们对事件进行等待,检测,hal库的函数功能更加齐全。

    void MPU6050_Init(void)
    {/*MPU6050寄存器初始化,需要对照MPU6050手册的寄存器描述配置,此处仅配置了部分重要的寄存器*/MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);				//电源管理寄存器1,取消睡眠模式,选择时钟源为X轴陀螺仪MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);				//电源管理寄存器2,保持默认值0,所有轴均不待机MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);				//采样率分频寄存器,配置采样率MPU6050_WriteReg(MPU6050_CONFIG, 0x06);					//配置寄存器,配置DLPFMPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);			//陀螺仪配置寄存器,选择满量程为±2000°/sMPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);			//加速度计配置寄存器,选择满量程为±16g
    }

     初始化函数里面的对MPU6050的校准这个也得加进去。

    http://www.xdnf.cn/news/742951.html

    相关文章:

  1. C++中 newdelete 与 mallocfree 的异同详解
  2. 【深度学习】14. DL在CV中的应用章:目标检测: R-CNN, Fast R-CNN, Faster R-CNN, MASK R-CNN
  3. 【Linux 学习计划】-- 进程地址空间
  4. 使用 Let‘s Encrypt 和 Certbot 为 Cloudflare 托管的域名申请 SSL 证书
  5. Reactor 和 Preactor
  6. LeetCode - 876. 链表的中间结点
  7. Mybatis Plus JSqlParser解析sql语句及JSqlParser安装步骤
  8. 第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型
  9. 【HW系列】—溯源与定位—Linux入侵排查
  10. day07
  11. c/c++的opencv车牌识别
  12. vscode不满足先决条件问题的解决——vscode的老版本安装与禁止更新(附安装包)
  13. 5.2 初识Spark Streaming
  14. 进程间通信IV System V 系列(linux)
  15. 机器学习与深度学习06-决策树02
  16. C++23 已弃用特性
  17. 前端面试准备-4
  18. 细说C语言将格式化输出打印至标准输出流的函数 printf、_printf_l、wprintf、_wprintf_l
  19. 第十五篇:MySQL 高级实战项目:构建高可用、可观测、性能优化一体化数据库平台
  20. AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月31日第94弹
  21. 流媒体基础解析:音视频封装格式与传输协议
  22. Kafka数据怎么保障不丢失
  23. 深拷贝和浅拷贝
  24. leetcode77.组合:回溯算法中for循环与状态回退的逻辑艺术
  25. tmux基本原理
  26. OpenLayers 图形交互编辑
  27. Redis最佳实践——安全与稳定性保障之访问控制详解
  28. VMware-workstation安装教程--超详细(附带安装包)附带安装CentOS系统教程
  29. 【Docker项目实战篇】Docker部署PDF查看器PdfDing
  30. Maestro CLI云端测试以及github cl,bitrise原生cl的测试流程