DM6437 GPIO模拟I2C
DM6437只有一个I2C总线,由于挂在总线上的摄像头的影响,导致不能正常读取ADS1000芯片,具体原因未能查明。现在只能用GPIO去模拟I2C总线。
下面是ADS1000中的I2C的介绍关键的说明:
之前由于没有注意到在SCL为高的时候不能更改状态,导致连续读取字节的时候只是正常读取了一个或两个字节(最后输出的高低有影响)。
下面是具体的程序代码:
#define SET_SCL_HIGH EVMDM6437_GPIO_setOutput(SCL,1);
#define SET_SCL_LOW EVMDM6437_GPIO_setOutput(SCL,0);#define SET_SDA_HIGH {\EVMDM6437_GPIO_setOutput(SDA,1);\}
#define SET_SDA_LOW {\EVMDM6437_GPIO_setOutput(SDA,0);\}//typedef EVMDM6437_GPIO_setDir(SDA,GPIO_IN);EVMDM6437_GPIO_getInput(SDA); SET_SDA_HIGH
//typedef EVMDM6437_GPIO_setDir(SDA,GPIO_OUT);EVMDM6437_GPIO_setOutput(SDA,0); SET_SDA_LOW#ifdef __cplusplus
extern "C" {
#endifextern void i2c_read(unsigned char addr, unsigned char *buf, int len);extern void i2c_write(unsigned char addr, unsigned char *buf, int len);#ifdef __cplusplus
}
#endif#endif
inline int i2c_start()
{EVMDM6437_GPIO_setDir(SCL,GPIO_OUT);EVMDM6437_GPIO_setDir(SDA,GPIO_OUT);SET_SDA_HIGHSET_SCL_HIGH_waitusec(20);SET_SDA_LOW_waitusec(20);//SET_SCL_LOW
}inline void i2c_stop(void)
{//SET_SCL_LOW// SET_SDA_LOW//_waitusec(10);EVMDM6437_GPIO_setDir(SDA,GPIO_OUT);SET_SCL_HIGHSET_SDA_LOW_waitusec(10); SET_SDA_HIGH//_waitusec(10);
}inline unsigned char i2c_read_ack(void)
{unsigned char r;EVMDM6437_GPIO_setDir(SDA,GPIO_IN);_waitusec(10);SET_SCL_LOW_waitusec(10);r = EVMDM6437_GPIO_getInput(SDA); SET_SCL_HIGH_waitusec(10);if(r){//printf("wrong!\n");}return r;
}inline int i2c_send_ack(void)
{SET_SCL_LOW EVMDM6437_GPIO_setDir(SDA,GPIO_OUT);SET_SDA_LOW//_waitusec(10);SET_SCL_HIGH_waitusec(5);
}void i2c_write_byte(unsigned char b)
{int i;EVMDM6437_GPIO_setDir(SDA,GPIO_OUT);for(i = 7; i >= 0; i--){SET_SCL_LOW_waitusec(5);if( b & (1 << i)){SET_SDA_HIGH}else{SET_SDA_LOW}_waitusec(5);SET_SCL_HIGH _waitusec(10);}i2c_read_ack();
}unsigned char i2c_read_byte(void)
{int i;unsigned char r = 0;EVMDM6437_GPIO_setDir(SDA,GPIO_IN);for(i = 7; i >= 0; i--){SET_SCL_LOW_waitusec(5);r = (r << 1) | EVMDM6437_GPIO_getInput(SDA);SET_SCL_HIGH_waitusec(5);}i2c_send_ack();return r;
}void i2c_read(unsigned char addr, unsigned char *buf, int len)
{int i;unsigned char t;i2c_start();t = (addr << 1) | 1;i2c_write_byte(t);for(i = 0; i < len; i++){buf[i] = i2c_read_byte();}i2c_stop();
} void i2c_write(unsigned char addr, unsigned char *buf, int len)
{int i;unsigned char t;i2c_start();t = (addr << 1) | 0;i2c_write_byte(t);for(i = 0; i < len; i ++){i2c_write_byte(buf[i]);}i2c_stop();
}
DM6437 GPIO模拟I2C相关推荐
- GPIO模拟I2C程序实现
GPIO模拟I2C程序实现. I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA).I2C是总线结构,1个 ...
- Linux I2C子系统分析之(一) ----- 用GPIO模拟I2C总线
在drivers/i2c/busses下包含各种I2C总线驱动,如S3C2440的I2C总线驱动i2c-s3c2410.c,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gp ...
- S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动
目录:一. 说明 二. 驱动程序说明及问题 三. 案例一 四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...
- 外设驱动库开发笔记8:GPIO模拟I2C驱动
I2C总线简单方便,是我们经常使用的一种总线.但有时候我们的MCU没有足够多的I2C控制器来实现我们的应用,所幸我可以使用普通的GPIO引脚来模拟低速的I2C总线通信.这一节我们就来实现使用软件通过普 ...
- linux源码gpio模拟i2c,linux内核gpio模拟i2c实例.doc
linux内核gpio模拟i2c实例.doc linux内核GPIO模拟I2C实例2010-10-11作者:cvip302814来源:cvip302814的blog前言:在许多情况下,我们并没有足够的 ...
- STM32 通用GPIO模拟I2C实现
STM32 通用GPIO模拟I2C实现 通用GPIO模拟I2C通信实现样例 1 GPIO初始化 #ifdef HW_I2C1 //硬件I2C初始化//PA8-I2C1_SCLGPIO_StructIn ...
- i2c 驱动五:gpio模拟i2c
有关linux的i2c相关文章有一下几篇,他们互相关联,应该一同看: - i2c 驱动一:简介 - i2c 驱动二:devfs文件系统 - i2c 驱动三:自己实现设备和驱动分离 - i2c 驱动四: ...
- MTK6592 GPIO模拟I2C
虽然Linux内核支持该功能,但是MTK并不支持I2C-GPIO功能,官方说法是硬件I2C接口已经够多,不需要软件模拟,并且用GPIO模拟I2C会影响系统性能... 所以,要做的,就是将被MTK阉割的 ...
- GPIO模拟I2C通信协议(二)
GPIO模拟2C读写E2PROM 1 E2PROM简介 2 AT24C28的读写逻辑 2.1 单字节写入 (BYTE WRITE) 2.2 页写入 (PAGE WRITE) 2.3 读取当前地址 (C ...
- 使用GPIO模拟I2C总线进行通信
I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主 ...
最新文章
- Java中getMessage()和printStackTrace方法
- 使用while循环输入 1 2 3 4 5 6 8 9 10
- 【PHP】文件写入和读取详解
- SpringCloud Ribbon(二)之自定义负载均衡策略IRule
- java中string范围_java中long parseLong(String s)方法中string(十进制数字)的范围?
- 阅文集团、微软小冰赋生了100部网文主角,可养成...
- 22.Silverlight使用WebService调用C++,Delphi编写的DLL文件
- tensorflow2.1学习--tf.keras学习之tf.keras.models.Sequential
- Unit Tests Tool - What is “Mock You” The introduction to moq #Reprinted#
- (已更新)外卖侠3.10.27版本外卖+售卖影票+任务功能微擎版本程序源码下载
- 基于bootstrap 的AceAdmin 1.4版本(iframe修改)
- 禅道、码云、coding、redmine、jira、teambition几大敏捷开发项目管理系统试用对比体验
- Linux的时间戳换算
- 微信小程序自定义屏幕调试
- (CentOS7)IP地址的配置与主机名和hosts映射
- 激光清洗铝合金氧化层的优势
- CSS backdrop-filter 和filter两种高斯模糊的区别
- [关于决策单调性DP]
- Linux系统/etc/resolv.conf文件为只读模式,且无法更改权限
- Spark中如何使用矩阵运算间接实现i2i