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相关推荐

  1. GPIO模拟I2C程序实现

    GPIO模拟I2C程序实现. I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA).I2C是总线结构,1个 ...

  2. Linux I2C子系统分析之(一) ----- 用GPIO模拟I2C总线

    在drivers/i2c/busses下包含各种I2C总线驱动,如S3C2440的I2C总线驱动i2c-s3c2410.c,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gp ...

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

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

  4. 外设驱动库开发笔记8:GPIO模拟I2C驱动

    I2C总线简单方便,是我们经常使用的一种总线.但有时候我们的MCU没有足够多的I2C控制器来实现我们的应用,所幸我可以使用普通的GPIO引脚来模拟低速的I2C总线通信.这一节我们就来实现使用软件通过普 ...

  5. linux源码gpio模拟i2c,linux内核gpio模拟i2c实例.doc

    linux内核gpio模拟i2c实例.doc linux内核GPIO模拟I2C实例2010-10-11作者:cvip302814来源:cvip302814的blog前言:在许多情况下,我们并没有足够的 ...

  6. STM32 通用GPIO模拟I2C实现

    STM32 通用GPIO模拟I2C实现 通用GPIO模拟I2C通信实现样例 1 GPIO初始化 #ifdef HW_I2C1 //硬件I2C初始化//PA8-I2C1_SCLGPIO_StructIn ...

  7. i2c 驱动五:gpio模拟i2c

    有关linux的i2c相关文章有一下几篇,他们互相关联,应该一同看: - i2c 驱动一:简介 - i2c 驱动二:devfs文件系统 - i2c 驱动三:自己实现设备和驱动分离 - i2c 驱动四: ...

  8. MTK6592 GPIO模拟I2C

    虽然Linux内核支持该功能,但是MTK并不支持I2C-GPIO功能,官方说法是硬件I2C接口已经够多,不需要软件模拟,并且用GPIO模拟I2C会影响系统性能... 所以,要做的,就是将被MTK阉割的 ...

  9. GPIO模拟I2C通信协议(二)

    GPIO模拟2C读写E2PROM 1 E2PROM简介 2 AT24C28的读写逻辑 2.1 单字节写入 (BYTE WRITE) 2.2 页写入 (PAGE WRITE) 2.3 读取当前地址 (C ...

  10. 使用GPIO模拟I2C总线进行通信

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

最新文章

  1. Java中getMessage()和printStackTrace方法
  2. 使用while循环输入 1 2 3 4 5 6 8 9 10
  3. 【PHP】文件写入和读取详解
  4. SpringCloud Ribbon(二)之自定义负载均衡策略IRule
  5. java中string范围_java中long parseLong(String s)方法中string(十进制数字)的范围?
  6. 阅文集团、微软小冰赋生了100部网文主角,可养成...
  7. 22.Silverlight使用WebService调用C++,Delphi编写的DLL文件
  8. tensorflow2.1学习--tf.keras学习之tf.keras.models.Sequential
  9. Unit Tests Tool - What is “Mock You” The introduction to moq #Reprinted#
  10. (已更新)外卖侠3.10.27版本外卖+售卖影票+任务功能微擎版本程序源码下载
  11. 基于bootstrap 的AceAdmin 1.4版本(iframe修改)
  12. 禅道、码云、coding、redmine、jira、teambition几大敏捷开发项目管理系统试用对比体验
  13. Linux的时间戳换算
  14. 微信小程序自定义屏幕调试
  15. (CentOS7)IP地址的配置与主机名和hosts映射
  16. 激光清洗铝合金氧化层的优势
  17. CSS backdrop-filter 和filter两种高斯模糊的区别
  18. [关于决策单调性DP]
  19. Linux系统/etc/resolv.conf文件为只读模式,且无法更改权限
  20. Spark中如何使用矩阵运算间接实现i2i

热门文章

  1. c语言经纬度转高斯坐标系,经纬度坐标与高斯坐标的转换代码
  2. vue项目结构目录简介
  3. 【小程序开发模板】微信小程序开发模板平台
  4. html在线生成字体,手写字体在线生成
  5. 数据恢复原来是可以免费的!
  6. plm系统 服务器不存在,PLM服务器和客户端使用方式
  7. ffmpeg 将视频转换成图片 截取视频的一段
  8. 双目测距 SGBM算法 Python版
  9. 心海软件学生测试系统,心海软件
  10. 通用软件产品的漏洞数量排名