/*****************************************************************************
 *
 * Filename:
 * ---------
 *   soft_i2c.c
 *
 *
 * Description:
 * ------------
 *   Use GPIO simulate I2C interface.
 *
 * Author:
 * -------
 *   jimmy.li
 ****************************************************************************/
#define uint32
#define uint16
#define uint8
#define int32
#define int16
#define int8  

/* GPIO setting */
#define SDA_GPIO
#define SCL_GPIO 

/* set GPIO function as general output/input */
#define SET_SDA_FN_0
#define SET_SCL_FN_0  

#define SET_SDA_OUTPUT
#define SET_SDA_INPUT
#define SET_SCL_OUTPUT  

/* read SDA status */
#define GET_SDA_VALUE  

/* pull SDA/SCL high or low */
#define SEND_SDA_VALUE(x)
#define PULL_SDA_LOW
#define PULL_SDA_HIGH
#define PULL_SCL_LOW
#define PULL_SCL_HIGH  

/* delay */
#define I2C_DUMMY_DELAY  \
do{\
   uint16  i2c_dummy_cnt; \
   ; i2c_dummy_cnt!=; i2c_dummy_cnt--); \
})

/*************************************************************************
* FUNCTION
* I2C_Init
*
* DESCRIPTION
* Prepare to control I2C bus, set SCL, SDA normal GPIO mode.
*
* PARAMETERS
* None.
*
* RETURNS
* None
*
*************************************************************************/
void I2C_Init(void)
{
     /* set SCL, SDA normal GPIO mode */
     SET_SDA_FN_0;
     SET_SCL_FN_0;
}

/*************************************************************************
* FUNCTION
*     I2C_Release
*
* DESCRIPTION
*     Release I2C bus.
*
* PARAMETERS
*     None.
*
* RETURNS
*     None
*
*************************************************************************/
void I2C_Release(void)
{
     /* set SCL, SDA high */
     PULL_SCL_HIGH;
     PULL_SDA_HIGH;
}

/*************************************************************************
* FUNCTION
*     I2C_Start
*
* DESCRIPTION
*     Initiate a START condition.
*     A High to Low transition on the SDA line while SCL is High defines a START condition.
*
* SCL --- ---
*            |___
* SDA ---
*        |___ ___
*
* PARAMETERS
*     None.
*
* RETURNS
*     None
*
*************************************************************************/
void I2C_Start(void)
{
     SET_SCL_OUTPUT;
     SET_SDA_OUTPUT;

     PULL_SCL_HIGH;
     PULL_SDA_HIGH;
     I2C_DUMMY_DELAY;

     PULL_SDA_LOW;
     I2C_DUMMY_DELAY;

     PULL_SCL_LOW;
     I2C_DUMMY_DELAY;
}

/*************************************************************************
* FUNCTION
*     I2C_Stop
*
* DESCRIPTION
*     Generate a Stop condition.
*     A Low to High transition on the SDA line while SCL is High defines a START condition.
*
* SCL     --- ---
*     ___|
* SDA         ---
*     ___ ___|
*
* PARAMETERS
*     None.
*
* RETURNS
*     None
*
*************************************************************************/
void I2C_Stop(void)
{
     SET_SCL_OUTPUT;
     SET_SDA_OUTPUT;

     PULL_SCL_LOW;
     PULL_SDA_LOW;
     I2C_DUMMY_DELAY;

     PULL_SCL_HIGH;
     I2C_DUMMY_DELAY;

     PULL_SDA_HIGH;
     I2C_DUMMY_DELAY;
}

/*************************************************************************
* FUNCTION
*     I2C_TxByte
*
* DESCRIPTION
*     Send a byte to I2C bus.
*
* PARAMETERS
*     @uint8 data  data to be send.
*
* RETURNS
*     ack received from I2C slave device.
*
*************************************************************************/
uint8 I2C_TxByte(uint8 data)
{
     int8 i, ack;
     SET_SCL_OUTPUT;
     SET_SDA_OUTPUT;

     // send 8bits data, MSB first
     ; --i>=; ){
          if((data>>i)& 0x01)
               PULL_SDA_HIGH;
          else
               PULL_SDA_LOW;
          I2C_DUMMY_DELAY;
          PULL_SCL_HIGH;
          I2C_DUMMY_DELAY;
          PULL_SCL_LOW;
          I2C_DUMMY_DELAY;
    }

     // receive ack
     SET_SDA_INPUT;

     PULL_SCL_HIGH;
     I2C_DUMMY_DELAY;
     ack = GET_SDA_VALUE; // read ack when HIGH period of the SCL
     PULL_SCL_LOW;

     SET_SDA_OUTPUT;
     return ack;
}

/*************************************************************************
* FUNCTION
*     I2C_RxByte
*
* DESCRIPTION
*     Receive a byte from I2C bus.
*
* PARAMETERS
*     @uint8 *data  store received data.
*     @uint8 ack  ack send to I2C slave device after receive a byte.
*                        ACK -- 0
*                        NACK -- 1
* RETURNS
*     None.
*
*************************************************************************/
void I2C_RxByte(uint8 *data, uint8 ack)
{
     int16 i;
    uint32 dataCache;
    dataCache = ;

    SET_SDA_INPUT;

    // receive 8bits data
    ; --i>=; ){
        dataCache <<= ;
        PULL_SCL_HIGH;
        I2C_DUMMY_DELAY;
        dataCache |= GET_SDA_VALUE;
        PULL_SCL_LOW;
       I2C_DUMMY_DELAY;
    }

     SET_SDA_OUTPUT;
    // send ack
    if(ack)
         PULL_SDA_HIGH;
    else
         PULL_SDA_LOW;
    I2C_DUMMY_DELAY;
    PULL_SCL_HIGH;
    I2C_DUMMY_DELAY;
    PULL_SCL_LOW;

    *data = (uint8)dataCache;
}

I2C总线协议标准版本是v2.1,于2000年推出。I2C的主要特性如下:

1、只需两根线:串行数据线(SDA), 串行时钟线(SCL)。
2、SDA 和SCL 都是双向线路都通过一个电流源或上拉电阻连接到正的电源电压, 当总线空闲时这两条线路都是高电平,连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能。
3、每一个连接到I2C总线上的设备都要求是可被软件寻址的,也就是在I2C总线上每一个设备都必须有一个独一无二的地址(7bits)。同一时刻,总线上只能存在一个主/从(Master/Slave)关系,而且只有主设备(Master)才能发起Read和Write。
4、I2C总线是面向8位的串行双向传输总线,其标准模式(Standard-mode)下,速率可达100kbit/s,在其快速模式(Fast-mode)下,速率可达400kbit/s,而在高速模式(High-speed mode)下,速率可高达3.4Mbit/s。

Transmitter
     I2C总线上发送数据的设备
Receiver
     I2C总线上接收数据的设备
Master
     发起传输、产生时钟信号,并且终止传输的设备
Slave
     被master寻址的设备

I2C数据的有效性:
         SDA线上的数据在时钟High阶段必须稳定,只有在时钟Low时SDA数据线上的数据才能发生高/低电平变化。

START
       当SCL在高电平时,SDA由高转变为低电平。(SCL=High, SDA : High ->Low)

STOP

当SCL在高电平时,SDA由低转变为高电平。    (SCL=High, SDA: Low -> High)

I2C总线上的数据传输
    SDA线上传输的每一个字节都必须是8-bits长,但每一次所传输的字节数不限,每传输完一个字节,必须跟随一个ack位(ack 方向与数据传输方向相反 ),I2C上传输的数据都是高位优先传输(MSB)的。

I2C 的应答信号
1, ACK (应答)        ---    是一个低电平信号
2, NACK(应答非)    ---  是一个高电平信号

GPIO软件模拟I2C的更多相关文章

  1. 软件模拟I2C通讯

    I2C协议概述,有相当详细的名词解释: 通信数量受限于地址空间和400Pf总线电容. 所有的数据传输过程中,SDA线的电平变化必须在SCL为低电平时进行,SDA线的电平在SCL线为高电平时要保持稳定. ...

  2. GPIO软件模拟IIC时序

    一.MPU6050中的IIC时序 1.1 START和STOP SDA和SCL在高电平时,SDA拉低表示START.SCL拉低,表示可以传输数据. SDA和SCL在低电平时,SDA拉高表示STOP. ...

  3. 软件模拟I2C时输入与输出切换

    一 为达到类似C51的操作需要添加以下位带操作:#include "stm32f10x_gpio.h"#include "stm32f10x_conf.h" / ...

  4. gpio模拟i2c驱动

    前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama ...

  5. STM32F10x_模拟I2C读写EEPROM

    Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...

  6. STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数

    1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...

  7. I2C总线协议的软件模拟实现方法

    I2C总线协议的软件模拟实现方法 在上一篇博客中已经讲过I2C总线通信协议,本文讲述I2C总线协议的软件模拟实现方法. 1. 简述 所谓的I2C总线协议的软件模拟实现方法,就是用软件控制GPIO的输入 ...

  8. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  9. 【转载】GPIO模拟i2c通信

    I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主 ...

随机推荐

  1. strace使用详解(转) 分类: shell ubuntu 2014-11-27 17:48 134人阅读 评论(0) 收藏

    (一) strace 命令    用途:打印 STREAMS 跟踪消息. 语法:strace [ mid sid level ] ... 描述:没有参数的 strace 命令将所有的驱动程序和模块中的 ...

  2. String是java中的基本数据类型吗

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. Ja ...

  3. [转] Creating a Simple RESTful Web App with Node.js, Express, and MongoDB

    You can find/fork the sample project on GitHub Hey! This and all my other tutorials will soon be mov ...

  4. ASP.NET-FineUI开发实践-16(一)

    还是基础的东西,grid全选没有事件,给加个事件,除了需要会复制粘贴外还要点推荐那!   第一步:原理  事件被触发,方法被实现. 对于全选事件,被触发有两种方式可写,一个是通过原生extjs方式触发 ...

  5. 论前端css初始化的重要性

    新手,求喷,刚刚知道每个浏览器都有对 标签的初始化,就造成我们网站开发者开发的web程序,会在不同的网站上有不同的样式风格,这给用户带来了很不好的体验,这也是浏览器本身的原因造成的,这时候,我们不可能 ...

  6. fiddler了解

    常常听到有人会所抓包什么的,自己电脑上有一段fiddler软件,但是一直没有使用,因为不了解.今天终于看视频,看博客,大致了解了fiddler这个软件,看着是非常强大啊.那么fiddler到底是什么, ...

  7. JAVAWEB 生成excel文字在一格显示两位不变成#号

    在用java生成excel的时候会发现这种问题, 如果是人家给的模板还好,如果不是模板,而是通过代码生成的话, 就需要进行处理了, 一个小单元格,如果是一位的话,如1-9显示没有问题,一旦是两位的话, ...

  8. jsp-文件的上传(转).

    该程序的主要代码,我引用网友的,并做了一些改进.上这个帖子的原因之一,是为了修正之前自己的一些误解. 概述: 一些网友,包括我,也曾经试图通过 input type 为 file的控件,获取其文件的完 ...

  9. ORA-01653:表空间扩展失败的问题

    以下内容来源于ORA-01653:表空间扩展失败的问题   今天发现,原来设备的数据表空间只有5M,已经满了,上网去找发现要进行扩展空间. 一.脚本修改方式: ----查询表空间使用情况---使用DB ...

  10. C# Base64编码/解码

    一.编码规则      Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据分成4 ...