美文网首页
STM32F103封装I2C接口代码

STM32F103封装I2C接口代码

作者: 魔思科技 | 来源:发表于2020-04-19 14:46 被阅读0次

I2Cdev.h

#include "stm32f10x.h"
#include "common.h"

#define SCL_H         GPIOB->BSRR = GPIO_Pin_6
#define SCL_L         GPIOB->BRR  = GPIO_Pin_6 
   
#define SDA_H         GPIOB->BSRR = GPIO_Pin_7
#define SDA_L         GPIOB->BRR  = GPIO_Pin_7

#define SCL_read      GPIOB->IDR  & GPIO_Pin_6
#define SDA_read      GPIOB->IDR  & GPIO_Pin_7

void I2C_Ini(void);
bool I2C_Start(void);
void I2C_Stop(void);
void I2C_Ack(void);
void I2C_NoAck(void);
bool I2C_WaitAck(void);
void I2C_SendByte(u8 SendByte);
unsigned char I2C_RadeByte(void);

I2Cdev.c

#include "I2Cdev.h"

/* 初始化I2C */
void I2C_Ini(void)
{
    GPIO_InitTypeDef GPIO_Init_Structure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_Init_Structure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init_Structure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_Init_Structure);
}

/*******************************************************************************
* Function Name  : I2C_delay
* Description    : Simulation IIC Timing series delay
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_delay(void)
{
        
   u8 i=30; //这里可以优化速度  ,经测试最低到5还能写入
   while(i) 
   { 
     i--; 
   }  
}

/*******************************************************************************
* Function Name  : I2C_Start
* Description    : Master Start Simulation IIC Communication
* Input          : None
* Output         : None
* Return         : Wheather  Start
****************************************************************************** */
bool I2C_Start(void)
{
    SDA_H;
    SCL_H;
    I2C_delay();
    if(!SDA_read)return FALSE;  //SDA线为低电平则总线忙,退出
    SDA_L;
    I2C_delay();
    if(SDA_read) return FALSE;  //SDA线为高电平则总线出错,退出
    SDA_L;
    I2C_delay();
    return TRUE;
}
/*******************************************************************************
* Function Name  : I2C_Stop
* Description    : Master Stop Simulation IIC Communication
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Stop(void)
{
    SCL_L;
    I2C_delay();
    SDA_L;
    I2C_delay();
    SCL_H;
    I2C_delay();
    SDA_H;
    I2C_delay();
} 
/*******************************************************************************
* Function Name  : I2C_Ack
* Description    : Master Send Acknowledge Single
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_Ack(void)
{   
    SCL_L;
    I2C_delay();
    SDA_L;
    I2C_delay();
    SCL_H;
    I2C_delay();
    SCL_L;
    I2C_delay();
}   
/*******************************************************************************
* Function Name  : I2C_NoAck
* Description    : Master Send No Acknowledge Single
* Input          : None
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_NoAck(void)
{   
    SCL_L;
    I2C_delay();
    SDA_H;
    I2C_delay();
    SCL_H;
    I2C_delay();
    SCL_L;
    I2C_delay();
} 
/*******************************************************************************
* Function Name  : I2C_WaitAck
* Description    : Master Reserive Slave Acknowledge Single
* Input          : None
* Output         : None
* Return         : Wheather  Reserive Slave Acknowledge Single
****************************************************************************** */
bool I2C_WaitAck(void)   //返回为:=1有ACK,=0无ACK
{
    SCL_L;
    I2C_delay();
    SDA_H;          
    I2C_delay();
    SCL_H;
    I2C_delay();
    if(SDA_read)
    {
      SCL_L;
      I2C_delay();
      return FALSE;
    }
    SCL_L;
    I2C_delay();
    return TRUE;
}
/*******************************************************************************
* Function Name  : I2C_SendByte
* Description    : Master Send a Byte to Slave
* Input          : Will Send Date
* Output         : None
* Return         : None
****************************************************************************** */
void I2C_SendByte(u8 SendByte) //数据从高位到低位//
{
    u8 i=8;
    while(i--)
    {
        SCL_L;
        I2C_delay();
      if(SendByte&0x80)
        SDA_H;  
      else 
        SDA_L;   
        SendByte<<=1;
        I2C_delay();
        SCL_H;
        I2C_delay();
    }
    SCL_L;
}  
/*******************************************************************************
* Function Name  : I2C_RadeByte
* Description    : Master Reserive a Byte From Slave
* Input          : None
* Output         : None
* Return         : Date From Slave 
****************************************************************************** */
unsigned char I2C_RadeByte(void)  //数据从高位到低位//
{ 
    u8 i=8;
    u8 ReceiveByte=0;

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

相关文章

  • STM32F103封装I2C接口代码

    I2Cdev.h I2Cdev.c

  • Ginkgo USB-I2C适配器

    典型应用: - I2C总线设备,芯片控制、调试; - I2C接口传感器测试; - I2C存储器EEPROM数据读写...

  • 灵动微MM32F003硬件最小系统 --- GPIO模拟I2C读

    如果需要少量的存储数据,24C02是个可选的方案。24C02是I2C接口,由于I2C接口是个低速通讯接口,既可以采...

  • 02-Java基础-三大特性

    代码块、封装、Override与Overload、继承、多态、抽象类、接口、包(package) 代码块 概述:使...

  • Rxjava2+okhttp3+Retrofit2封装

    这里是Retrofit构造接口的方式,发现重复代码太多,我在网上找了个库,封装了一下,这是改造前部分接口,上次封装...

  • 简洁代码--边界

    代码整洁之道笔记 [TOC] 边界 即自己的代码和第三方的代码的接口适配 使用第三方代码 ①封装 接口提供者和使用...

  • C#中属性的封装

    封装的一般性 封装快捷键:Ctrl+R+E 封装的目的: 封装就是 隐藏对象的信息,但要流出访问的接口 封装代码示...

  • Android实践 | ListView简单封装,实现上拉加载

    简单封装,因此代码逻辑很简单,直接结合注释看代码: 下面是 OnLoadMoreListener 接口 使用也很简...

  • 2017-06-29

    #第9周|封装接口# 1. 封装接口是计算机编程原理中的一个基本小原理。它的本意是指封装一整个代码块,对外暴露一个...

  • Android Things 外部I/O接口协议

    目录 概述 GPIO: 简单0/1状态协议 PWM:方波信号接口 I2C:低速同步串行接口 UART:异步串行接口...

网友评论

      本文标题:STM32F103封装I2C接口代码

      本文链接:https://www.haomeiwen.com/subject/chtmbhtx.html