php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 578|回复: 0

IIC驱动代码

[复制链接]

3138

主题

3148

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7946
贡献
0
注册时间
2021-4-14
最后登录
2024-11-21
在线时间
763 小时
QQ
发表于 2022-6-7 22:44:34 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]/****************************************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
***************************************************************************************/
[/mw_shl_code]

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-22 03:55 , Processed in 0.342277 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表