GPIO软件模拟I2C
/*****************************************************************************
*
* 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的更多相关文章
- 软件模拟I2C通讯
I2C协议概述,有相当详细的名词解释: 通信数量受限于地址空间和400Pf总线电容. 所有的数据传输过程中,SDA线的电平变化必须在SCL为低电平时进行,SDA线的电平在SCL线为高电平时要保持稳定. ...
- GPIO软件模拟IIC时序
一.MPU6050中的IIC时序 1.1 START和STOP SDA和SCL在高电平时,SDA拉低表示START.SCL拉低,表示可以传输数据. SDA和SCL在低电平时,SDA拉高表示STOP. ...
- 软件模拟I2C时输入与输出切换
一 为达到类似C51的操作需要添加以下位带操作:#include "stm32f10x_gpio.h"#include "stm32f10x_conf.h" / ...
- gpio模拟i2c驱动
前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama ...
- STM32F10x_模拟I2C读写EEPROM
Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...
- STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数
1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...
- I2C总线协议的软件模拟实现方法
I2C总线协议的软件模拟实现方法 在上一篇博客中已经讲过I2C总线通信协议,本文讲述I2C总线协议的软件模拟实现方法. 1. 简述 所谓的I2C总线协议的软件模拟实现方法,就是用软件控制GPIO的输入 ...
- S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动
目录:一. 说明 二. 驱动程序说明及问题 三. 案例一 四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...
- 【转载】GPIO模拟i2c通信
I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主 ...
随机推荐
- SICP 习题 (1.8) 解题总结
SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的 ...
- sql语句实现随机取n条数据(转)
我想把数组打乱随机取些值,于是用PHP的shuffl()打乱数组,当然,array_rand()也是可以随机取数组的,但是我想到另一个更高效的办法,是不是能用sql直接随机数据?当然可以! mysql ...
- android 18 Bundle类
Bundle类:竖屏的activity换到横屏的activity的时候,会把竖屏的activity杀掉横屏的activity创建,竖屏的activity会有一些计算结果,可以用数据存起来,存到内存里面 ...
- Java基础知识强化之集合框架笔记32:集合之可变参数的概述和使用
1. 可变参数的概述和使用: (1)可变参数:定义方法的时候不知道该定义多少个参数(2)格式: 修饰符 返回值类型 方法名(数据类型… 变量名){ } 注意: 这里的变量其实是一个数 ...
- mxnet运行时遇到问题及解决方法
1.训练好模型之后,进行预测时出现这种错误: mxnet.::] src/ndarray/ndarray.cc:: Check failed: ,) to.shape=(,) 这种问题的解决方法,在全 ...
- poj1742 Coins(多重背包+单调队列优化)
/* 这题卡常数.... 二进制优化或者单调队列会被卡 必须+上个特判才能过QAQ 单调队列维护之前的钱数有几个能拼出来的 循环的时候以钱数为步长 如果队列超过c[i]就说明队头的不能再用了 拿出来 ...
- Date和TimeZone的关系
java2平台为我们提供了丰富的日期时间API.如java.util.Date;java.util.calendar;java.text.DateFormat等.那么它们之间有什么关系呢? 首先,ja ...
- C#重载重写
overload:重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字.override:过载也称重写是指子类对父类中虚函数或抽象函数的“覆盖 ...
- 【转】 CoreGraphics QuartzCore CGContextTranslateCTM 用法
原文:http://blog.csdn.net/sqc3375177/article/details/25708447 CoreGraphics.h 一些常用旋转常量 #define M_E 2.71 ...
- objective-c相关知识点
1,objective-c中实现线程同步: Mutexlock (互斥锁).NSCondition lock (条件锁)消息传送 2,UDP和TCP: TCP :传输控制协议,可以提供面向连接的.可靠 ...