DM6437 GPIO模拟I2C

原创 2015年07月06日 22:25:29

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" {
#endif



extern 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_HIGH
    SET_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_HIGH
    SET_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();
}

版权声明:本文为博主原创文章,想转你就转吧

gpio 模拟i2c总线

  • 2017年05月26日 15:30
  • 7KB
  • 下载

GPIO模拟I2C驱动和AT88SCXX源码

  • 2013年12月16日 17:23
  • 10KB
  • 下载

linux gpio模拟i2c的使用

 linux kernel 中的i2c-gpio使用 在linux中,我们可以自己来使用gpio来模拟i2c,但是万能的linux中其实也已经有了i2c的东东了。 现在看看i2c-gpio.c文件中到...

GPIO编程模拟I2C入门

  • 2010年05月06日 15:57
  • 15KB
  • 下载

gpio模拟I2C

  • 2014年10月15日 14:23
  • 8KB
  • 下载

用GPIO模拟I2C操作

通过GPIO模拟I2C操作

GPIO模拟类I2C总线基础函数实例

我们先了解一下I2C总线基础知识. I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广...

linux gpio模拟i2c的使用

http://blog.csdn.net/skywalkzf/article/details/6575773 linux kernel 中的i2c-gpio使用   在linux中,我们可以自己...

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

下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO实现I2C通信: #define SDA 254                         //定义SDA所对应的GPIO接口编...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DM6437 GPIO模拟I2C
举报原因:
原因补充:

(最多只允许输入30个字)