STM32 软件模拟 IIC 代码,标准库、HAL库可用

发布者:RadiantBeauty最新更新时间:2025-02-19 来源: cnblogs关键字:STM32  软件模拟  IIC  标准库  HAL库 手机看文章 扫描二维码
随时随地手机看文章

 1 #ifndef _IIC_H

 2 #define _IIC_H

 3 

 4 #include 'stdio.h'    

 5 #include 'stm32f1xx_hal.h'

 6 

 7 

 8 /* 定义控制 SDA SCL 的宏 标准库版

 9 #define I2C_SDA_UP        GPIO_SetBits  (GPIOC,GPIO_PIN_8)    //SDA高电平

10 #define I2C_SDA_LOW        GPIO_ResetBits(GPIOC,GPIO_PIN_8)    //SDA低电平

11 #define I2C_SCL_UP        GPIO_SetBits  (GPIOC,GPIO_PIN_9)    //SCL高电平

12 #define I2C_SCL_LOW        GPIO_ResetBits(GPIOC,GPIO_PIN_9)    //SCL低电平

13 */

14 

15 

16 /* 定义控制 SDA SCL 的宏 HAL库版    */

17 

18 #define I2C_SDA_UP        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET)                //SDA高电平

19 #define I2C_SDA_LOW        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET)            //SDA低电平

20 #define I2C_SCL_UP        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET)              //SCL高电平

21 #define I2C_SCL_LOW        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET)            //SCL低电平

22 

23 

24 

25 /* 获取 SDA SCL 引脚状态,标准库版也是用相同逻辑    */

26 

27 #define I2C_SDA        HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_8)        //获取SDA引脚状态

28 #define I2C_SCL        HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_9)        //获取SCL引脚状态

29 

30 

31 void         iic_stare(void);                    //*    开始信号    

32 void         i2c_ack(void);                        //*    应答信号    

33 void         I2C_No_ack(void);                    //*    非应答信号    

34 void         i2c_stop(void);                        //*    停止信号    

35 char         i2c_wit_ack(void);                //*    等待应答

36 void         i2c_send(uint8_t dat);        //* 发送数据

37 uint8_t i2c_read(void);                        //* 接收数据

38 

39 void SDA_OUT(void);                //*    SDA 设置为输出    

40 void SDA_IN(void);                //*    SDA 设置为输入    

41 

42 void delay_us(uint32_t i);        //*延时    

43 

44 #endif


/*****************************************************************************

*                                                                                                                                                         *

*                        File:    软件模拟IIC, HAL库版本,标准库也                                                     *

*                                    可用,只需要做一些相对应修改即可                                                     *

*                                                                                                                                                         *

*****************************************************************************/


#include 'iic.h'



/*******************************************************************************

* 函 数 名         : i2c_stare

* 函数功能         : iic开始信号,SCL高电平时,SDA出现一个下跳沿表示启动信号 

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void i2c_stare(void)

{

    SDA_OUT();  

    I2C_SDA_UP;

    I2C_SCL_UP;

    delay_us(4);

     I2C_SDA_LOW;        //启动开始信号

    delay_us(4);

    I2C_SCL_LOW;      //钳住I2C总线,准备发送或接收数据

}



/*******************************************************************************

* 函 数 名         : i2c_stop

* 函数功能         : iic停止信号,SCL高电平时,SDA出现一个上跳沿表示停止信号

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void i2c_stop(void)

{

    SDA_OUT();            //sda线输出

    I2C_SDA_LOW;         //发送结束条件的数据信号

    I2C_SCL_UP;

    delay_us(4);         //结束条件建立时间大于4μ

    I2C_SDA_UP;         //发送I2C总线结束信号

    delay_us(4);

    I2C_SCL_LOW; 

}



/*******************************************************************************

* 函 数 名         : i2c_send

* 函数功能         : iic发送数据

* 输    入         : uint8_t dat,要发送的数据

* 输    出         : 无

*******************************************************************************/

void i2c_send(uint8_t dat)

{


     unsigned char temp;

     SDA_OUT();

   for(temp=0x80;temp!=0;temp>>=1)

   {

       if((temp & dat)== 0)

       {

          I2C_SDA_LOW;

       }

       else

       {

          I2C_SDA_UP;

       }

       delay_us(1);

       I2C_SCL_UP;

       delay_us(4);

       I2C_SCL_LOW;

   }

}



/*******************************************************************************

* 函 数 名         : i2c_read

* 函数功能         : iic接收数据

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

uint8_t i2c_read(void)

{

   unsigned char temp;

   unsigned char dat;

   I2C_SDA_UP;                     //释放总线准备接收

     SDA_IN();

   for(temp=0x80;temp!=0;temp>>=1)

   {

      delay_us(1);

      I2C_SCL_UP;

      if(I2C_SDA==1)

      {

         dat|=temp;

      }

      else

      {

         dat&=~temp;

      }

      I2C_SCL_LOW;

   }

   return dat;

}



/*******************************************************************************

* 函 数 名         : i2c_wit_ack

* 函数功能         : iic等待应答

* 输    入         : 无

* 输    出         : 0/1,返回1表示无应答信号,返回0表示应答

*******************************************************************************/

char i2c_wit_ack(void)

{

    

    uint8_t con=0;

    

  I2C_SDA_UP;       //释放数据线,准备接收应答

  delay_us(1);

    I2C_SCL_UP;                //CPU驱动SCL = 1, 此时器件会返回ACK应答

    SDA_IN(); 

    delay_us(1);

    

  while( I2C_SDA )    //CPU读取SDA口线状态

  {

        con++;

        if(con>255)

        {

            i2c_stop();

      return 1;     //无应答信号

        }

  }


  I2C_SCL_LOW; 

  delay_us(1);

  return 0;             //有应答

}


/*******************************************************************************

* 函 数 名         : i2c_ack

* 函数功能         : iic应答信号

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

[1] [2]
关键字:STM32  软件模拟  IIC  标准库  HAL库 引用地址:STM32 软件模拟 IIC 代码,标准库、HAL库可用

上一篇:STM32 GPIO重映射
下一篇:STM32 抢占优先级和响应优先级

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved