I2C初始化

2023-05-16

一、管脚初始化
由于STM32的硬件初始化比较复杂,这里我们采用软件初始化,选用端口PB6,PB7,以匿名的I2C初始化程序为例

/***************I2C GPIO定义******************/
#define ANO_GPIO_I2C    GPIOB
#define I2C_Pin_SCL     GPIO_Pin_6
#define I2C_Pin_SDA     GPIO_Pin_7
#define ANO_RCC_I2C     RCC_APB2Periph_GPIOB
/*********************************************/

#define SCL_H         ANO_GPIO_I2C->BSRR = I2C_Pin_SCL
#define SCL_L         ANO_GPIO_I2C->BRR  = I2C_Pin_SCL
#define SDA_H         ANO_GPIO_I2C->BSRR = I2C_Pin_SDA
#define SDA_L         ANO_GPIO_I2C->BRR  = I2C_Pin_SDA
#define SCL_read      ANO_GPIO_I2C->IDR  & I2C_Pin_SCL
#define SDA_read      ANO_GPIO_I2C->IDR  & I2C_Pin_SDA
void I2c_Soft_delay()
{ 
    __NOP();
    __NOP();
    __NOP();
    __NOP();
}
void I2c_Soft_Init()
{
  GPIO_InitTypeDef  GPIO_InitStructure; 
  RCC_APB2PeriphClockCmd(ANO_RCC_I2C , ENABLE );
  GPIO_InitStructure.GPIO_Pin =  I2C_Pin_SCL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  GPIO_Init(ANO_GPIO_I2C, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin =  I2C_Pin_SDA;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_Init(ANO_GPIO_I2C, &GPIO_InitStructure);     
}
//以下是驱动MPU6050所需要的
int I2c_Soft_Start()
{
    SDA_H;
    SCL_H;
    I2c_Soft_delay();
    if(!SDA_read)return 0;  //SDA线为低电平则总线忙,退出
    SDA_L;
    I2c_Soft_delay();
    if(SDA_read) return 0;  //SDA线为高电平则总线出错,退出
    SDA_L;
    I2c_Soft_delay();
    return 1;   

}
void I2c_Soft_Stop()
{
    SCL_L;
    I2c_Soft_delay();
    SDA_L;
    I2c_Soft_delay();
    SCL_H;
    I2c_Soft_delay();
    SDA_H;
    I2c_Soft_delay();
}
void I2c_Soft_Ask()
{
    SCL_L;
    I2c_Soft_delay();
    SDA_L;
    I2c_Soft_delay();
    SCL_H;
    I2c_Soft_delay();
    SCL_L;
    I2c_Soft_delay();
}
void I2c_Soft_NoAsk()
{
    SCL_L;
    I2c_Soft_delay();
    SDA_H;
    I2c_Soft_delay();
    SCL_H;
    I2c_Soft_delay();
    SCL_L;
    I2c_Soft_delay();
}
int I2c_Soft_WaitAsk(void)   //返回为:=1有ASK,=0无ASK
{
  u8 ErrTime = 0;
    SCL_L;
    I2c_Soft_delay();
    SDA_H;          
    I2c_Soft_delay();
    SCL_H;
    I2c_Soft_delay();
    if(SDA_read)
    {
        ErrTime++;
        if(ErrTime>200)
        {
            I2c_Soft_Stop();
            return 1;
        }
    }
    SCL_L;
    I2c_Soft_delay();
    return 0;
}
void I2c_Soft_SendByte(u8 SendByte) //数据从高位到低位//
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2c_Soft_delay();
      if(SendByte&0x80)
        SDA_H;  
      else 
        SDA_L;   
        SendByte<<=1;
        I2c_Soft_delay();
                SCL_H;
                I2c_Soft_delay();
    }
    SCL_L;
} 
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 I2c_Soft_ReadByte(u8 ask)  //数据从高位到低位//
{ 
    u8 i=8;
    u8 ReceiveByte=0;

    SDA_H;              
    while(i--)
    {
      ReceiveByte<<=1;      
      SCL_L;
      I2c_Soft_delay();
            SCL_H;
      I2c_Soft_delay(); 
      if(SDA_read)
      {
        ReceiveByte|=0x01;
      }
    }
    SCL_L;

    if (ask)
        I2c_Soft_Ask();
    else
        I2c_Soft_NoAsk();  
    return ReceiveByte;
} 
// IIC写一个字节数据
u8 IIC_Write_1Byte(u8 SlaveAddress,u8 REG_Address,u8 REG_data)
{
    I2c_Soft_Start();
    I2c_Soft_SendByte(SlaveAddress<<1);   
    if(I2c_Soft_WaitAsk())
    {
        I2c_Soft_Stop();
        return 1;
    }
    I2c_Soft_SendByte(REG_Address);       
    I2c_Soft_WaitAsk(); 
    I2c_Soft_SendByte(REG_data);
    I2c_Soft_WaitAsk();   
    I2c_Soft_Stop(); 
    return 0;
}
// IIC读1字节数据
u8 IIC_Read_1Byte(u8 SlaveAddress,u8 REG_Address,u8 *REG_data)
{           
    I2c_Soft_Start();
    I2c_Soft_SendByte(SlaveAddress<<1); 
    if(I2c_Soft_WaitAsk())
    {
        I2c_Soft_Stop();
        return 1;
    }
    I2c_Soft_SendByte(REG_Address);     
    I2c_Soft_WaitAsk();
    I2c_Soft_Start();
    I2c_Soft_SendByte(SlaveAddress<<1 | 0x01);
    I2c_Soft_WaitAsk();
    *REG_data= I2c_Soft_ReadByte(0);
    I2c_Soft_Stop();
    return 0;
}   
// IIC写n字节数据
u8 IIC_Write_nByte(u8 SlaveAddress, u8 REG_Address, u8 len, u8 *buf)
{   
    I2c_Soft_Start();
    I2c_Soft_SendByte(SlaveAddress<<1); 
    if(I2c_Soft_WaitAsk())
    {
        I2c_Soft_Stop();
        return 1;
    }
    I2c_Soft_SendByte(REG_Address); 
    I2c_Soft_WaitAsk();
    while(len--) 
    {
        I2c_Soft_SendByte(*buf++); 
        I2c_Soft_WaitAsk();
    }
    I2c_Soft_Stop();
    return 0;
}
u8 mpu_test;
// IIC读n字节数据
u8 IIC_Read_nByte(u8 SlaveAddress, u8 REG_Address, u8 len, u8 *buf)
{   
    mpu_test = I2c_Soft_Start();
    I2c_Soft_SendByte(SlaveAddress<<1); 
    if(I2c_Soft_WaitAsk())
    {
        I2c_Soft_Stop();
        return 1;
    }
    I2c_Soft_SendByte(REG_Address); 
    I2c_Soft_WaitAsk();

    I2c_Soft_Start();
    I2c_Soft_SendByte(SlaveAddress<<1 | 0x01); 
    I2c_Soft_WaitAsk();
    while(len) 
    {
        if(len == 1)
        {
            *buf = I2c_Soft_ReadByte(0);
        }
        else
        {
            *buf = I2c_Soft_ReadByte(1);
        }
        buf++;
        len--;
    }
    I2c_Soft_Stop();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

I2C初始化 的相关文章

  • KPI异常检测【一】- 时间序列分解算法

    目录 1 相关概念 2 常见的时间序列 3 时间序列分解 3 1 方法介绍 3 2 经典方法 3 3 Holt Winter 指数平滑 3 4 STL分解 4 异常准则 5 异常检测算法 1 相关概念 1 1 异常 时序异常检测通常形式化为
  • KPI异常检测【三】- 机器学习算法

    目录 1 相关概念 1 1 异常类型 1 2 检测方法 2 点异常检测算法 2 1 基于统计 2 2 基于相似度 2 2 1 基于距离 2 2 2 基于密度 2 2 3 基于聚类 2 2 4 基于树 2 3 基于谱 spectral 3 上
  • 手把手教你如何安装ROS+Gazebo+PX4开发环境(ubuntu18.04 + Melodic)

    参考PX4官网 xff0c 做如下总结 xff1a 1 安装 Ubuntu 43 ROS 步骤省略 xff0c 提前配置好梯子 xff0c 很多安装问题都是网络原因引起的 2 下载并安装PX4源码 git clone https githu
  • ROS+Gazebo+PX4仿真步骤

    本文参考链接 xff1a 入门教程 PX4 Gazebo仿真 知乎 zhihu com 1 参照上一个帖子 手把手教你如何安装ROS 43 Gazebo 43 PX4开发环境 xff08 ubuntu18 04 43 Melodic xff
  • ROS+Gazabo+PX4仿真学习常用网站记录

    1 PX4官网 xff1a PX4 User Guide 中文网站 xff1a https docs px4 io master zh ros mavros custom messages html 2 ROS Wiki xff1a cn
  • 如何订阅(Subscribe)现有功能包节点的话题,介绍实现思路

    我们从github或其他途径获取到的ROS功能包 xff0c 如何快速的加入到自己的工程里边 xff0c 下边介绍一下我实现的思路 1 首先运行功能包 xff0c 利用 rqt graph 命令查看 节点图 xff0c 对功能包的节点和话题
  • PX4仿真时,如何在Gazebo下添加物理环境

    1 安装Gazebo xff0c 步骤略 2 下载安装Gazebo需要的世界模型 xff0c 否则自动安装速度很慢 3 在Ubuntu终端里输入 gazebo xff0c 打开一个空的 Gazebo 界面 4 点击左上方的 insert x
  • 树莓派如何使用串口,树莓派连接pixhawk

    参考链接 xff1a xff08 写的非常详细 xff0c 下述方法亲测有效 xff09 pi 3 How do I make serial work on the Raspberry Pi3 PiZeroW Pi4 or later mo
  • 树莓派备份系统

    使用 rpi backup 脚本进行备份 首先下载该脚本 xff1a git clone https github com nanhantianyi rpi backup git cd rpi backup 用法 xff1a sudo ba
  • Linux和Windows可执行文件的区分

    一些后缀区分 现在PC平台流行的可执行文件格式 xff08 Executable xff09 xff0c 主要有以下两种格式 xff08 COFF xff08 Common file format xff09 格式的变种 xff09 xff
  • 树莓派+ubuntu18.04+ROS-melodic+MAVROS+librealsense+vio+realsense_ros

    目录 一 树莓派安装ubuntu18 04 1 下载ubuntu系统文件 2 将系统文件烧入SD卡 3 强制修改HDMI输出分辨率 xff08 此步骤可忽略 xff09 4 设置wifi xff08 此步骤也可忽略 xff0c 后续连接网线
  • APM+Gazebo 垂起固定翼VTOL软件在环仿真

    APM 43 Gazebo 垂起固定翼VTOL软件在环仿真 1 APM软件环境下载并安装APM固件加入环境变量 2 运行APM仿真3 Gazebo环境安装4 增加VTOL模型5 多机仿真6 使用mavros 1 APM软件环境 参考官网链接
  • 进程间通信的五种方式

    进程间通信的意思就是在不同进程之间传递信息 它是一组编程接口 xff0c 让程序员协调不同进程 xff0c 使能够相互传递消息 IPC目的 1 xff09 数据传输 xff1a 一个进程需要将它的数据发送给另一个进程 xff0c 发送的数据
  • Arduino采集Microzone遥控器信号(ROSMicrozoneBridge)

    关注微信公众号 混沌无形 xff0c 后台回复 xff1a 13462F6 免费获取完整工程源码 xff01 本文采用Arduino mega2560的6个外部中断来采集Microzone接收机的6个通道的PPM信号 xff0c 主要是测量
  • 路径规划之基于优化的规划算法

    关注同名微信公众号 混沌无形 xff0c 阅读更多有趣好文 xff01 原文链接 xff1a 机器人曲线插值拟合算法研究现状简述 xff08 包含原文PDF百度云下载链接 xff09 第三类算法是主要是将多目标多变量多约束耦合的规划模型转化
  • 常见移动机器人多角度对比分析

    混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规划 控制 xff1b 软件 机械 硬件等 xff09 43篇原创内容 公众号 文末提供原
  • 麦克纳姆轮运动特性分析

    混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规划 控制 xff1b 软件 机械 硬件等 xff09 43篇原创内容 公众号 文末提供原
  • 全向轮运动特性分析

    文末提供原文PDF免费下载 期刊论文版式 混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规划 控制 xff1b 软件 机械 硬件等 xf
  • matlab稳态和时变卡尔曼滤波器Kalman filter的设计和仿真植物动力学模型案例研究

    最近我们被客户要求撰写关于卡尔曼滤波器的研究报告 xff0c 包括一些图形和统计输出 本案例研究说明了卡尔曼滤波器的设计和仿真 考虑稳态和时变卡尔曼滤波器 植物动力学 考虑一个在输入u n 上有加性高斯噪声w n 此外 xff0c 让 yv
  • 正点原子-操作系统

    正点原子另一个学习网站 http www openedv com docs book videos zdyzshipin 4free zdyz freertos book html

随机推荐