admin 发表于 2022-6-7 22:44:34

IIC驱动代码

/****************************************Copyright (c)**********************************
========================================================================================
                  文件描述
   
========================================================================================
编写:
日期:
***************************************************************************************/
#include "includes.h"
#include "bsp.h"


static GPIO_InitTypeDef GPIO_InitStructure_i2c;

/***************************************************************************************
函数名称: void i2c_sda_in(void)
函数功能: 设置i2c的数据线为输入
输入参数:
返 回 值:
***************************************************************************************/
void i2c_initial(void)
{
    GPIO_InitStructure_i2c.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure_i2c.GPIO_Pin = (GPIO_Pin_TypeDef)(GPIO_Pin_5 | GPIO_Pin_6);
    GPIO_Init(GPIOC,&GPIO_InitStructure_i2c);

    _io_i2c_scl_on();
    _io_i2c_sda_on();
}
/***************************************************************************************
函数名称: void i2c_sda_in(void)
函数功能: 设置i2c的数据线为输入
输入参数:
返 回 值:
***************************************************************************************/
void i2c_delay(void)
{
    unsigned int i = 100;
   
    while (i--);
   // Delay_ms(1);
   
}

/***************************************************************************************
函数名称: void i2c_sda_in(void)
函数功能: 设置i2c的数据线为输入
输入参数:
返 回 值:
***************************************************************************************/
void i2c_sda_in(void)
{
    GPIO_InitStructure_i2c.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure_i2c.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC, &GPIO_InitStructure_i2c);
   
}
/***************************************************************************************
函数名称: void i2c_sda_out(void)
函数功能: 设置i2c的数据线为输出
输入参数:
返 回 值:
***************************************************************************************/
void i2c_sda_out(void)
{
    GPIO_InitStructure_i2c.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure_i2c.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure_i2c);
}
/***************************************************************************************
函数名称: void i2c_start(void)
函数功能: 开始信号后,scl和sda为低状态
输入参数:
返 回 值:
***************************************************************************************/
void i2c_start(void)
{
    _io_i2c_scl_on();
    _io_i2c_sda_on();
    i2c_delay();
   
    _io_i2c_sda_off();
    i2c_delay();
    _io_i2c_scl_off();
    i2c_delay();
   
}
/***************************************************************************************
函数名称: void i2c_stop(void)
函数功能: 停止信号后,scl和sda都为高状态
输入参数:
返 回 值:
***************************************************************************************/
void i2c_send_byte(unsigned char data)
{
    unsigned char i;
   
    for (i=0; i<8; i++)
    {
      if (data & (0x80>>i))
            _io_i2c_sda_on();
      else
            _io_i2c_sda_off();
      i2c_delay();
      _io_i2c_scl_on();
      i2c_delay();
      _io_i2c_scl_off();
      i2c_delay();
    }
}
/***************************************************************************************
函数名称: void i2c_stop(void)
函数功能: 停止信号后,scl和sda都为高状态
输入参数:
返 回 值:
***************************************************************************************/
unsigned char i2c_read_byte(void)
{
    unsigned char i;
    unsigned char data = 0;
   
    i2c_sda_in();
   
    for (i=0; i<8; i++)
    {
      _io_i2c_scl_on();
      i2c_delay();
      
      data <<= 1;
      if (_io_i2c_sda())
            data |= 1;
      
      _io_i2c_scl_off();
      i2c_delay();
    }
   
    i2c_sda_out();
   
    return data;
}
/***************************************************************************************
函数名称: void i2c_stop(void)
函数功能: 停止信号后,scl和sda都为高状态
输入参数:
返 回 值:
***************************************************************************************/
void i2c_send_ack(unsigned char ack)
{
    if (ack == 0)
      _io_i2c_sda_on();
    else
      _io_i2c_sda_off();
   
    _io_i2c_scl_on();
    i2c_delay();

    _io_i2c_scl_off();
    i2c_delay();
}
/***************************************************************************************
函数名称: void i2c_stop(void)
函数功能: 停止信号后,scl和sda都为高状态
输入参数:
返 回 值:1 -- 有ack
         0 -- 无ack
***************************************************************************************/
unsigned char i2c_wait_ack(void)
{
    unsigned char err = 0;
    i2c_sda_in();
   
    i2c_delay();
    _io_i2c_scl_on();
    i2c_delay();

    if (_io_i2c_sda() == 0)
      err = 1;
   
    _io_i2c_scl_off();
    i2c_delay();
   
    i2c_sda_out();
   
    return err;
}
/***************************************************************************************
函数名称: void i2c_stop(void)
函数功能: 停止信号后,scl和sda都为高状态
输入参数:
返 回 值:
***************************************************************************************/
void i2c_stop(void)
{
    _io_i2c_scl_off();
    _io_i2c_sda_off();
    i2c_delay();
   
    _io_i2c_scl_on();
    i2c_delay();
    _io_i2c_sda_on();
    i2c_delay();
   
}
/***************************************************************************************
    end of file
***************************************************************************************/
页: [1]
查看完整版本: IIC驱动代码