打印

谁有做过GPIO模拟I2C通信.给个指点.

[复制链接]
1638|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sdcaine|  楼主 | 2012-12-14 16:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
现在要编写一个程序.在DOS下面测试I2C接口.

I2C的2个信号线是连接在 GPIO38,39.

GPIO是挂在南桥下面.

在板子上面有有个 I2C bus 的扩展槽.可以外接设备测试.  我这边用外接了 一个简单治具. 用的IC 是LM75.

我的思路是: 我设置GPIO的高低电平给I2C的SDA跟SCL信号.

程序我写了一下.但是还是没有办法完全的控制好.调试一直出现问题.有谁能给个测试的建议. 菜鸟在此谢谢了.



相关帖子

沙发
jlass| | 2012-12-14 16:48 | 只看该作者
本帖最后由 jlass 于 2012-12-14 16:49 编辑

这么简单的应用,最好自己慢慢调试,能成长很多,下次遇到同类的问题就变强了,别人告诉你的话,下次又不会了
可仔细参考IIC的波形图

使用特权

评论回复
板凳
sdcaine|  楼主 | 2012-12-21 09:52 | 只看该作者
jlass 发表于 2012-12-14 16:48
这么简单的应用,最好自己慢慢调试,能成长很多,下次遇到同类的问题就变强了,别人告诉你的话,下次又不会 ...

好吧  大神  我搞了几天还是不行....

使用特权

评论回复
地板
sdcaine|  楼主 | 2012-12-21 09:56 | 只看该作者
这个是代码  不知道哪边有问题.求指点.
void write_add(uchar slave,uchar reg,uchar date)
{
          Start();
          write_byte(slave&0xFE);
          ACK();
                write_byte(reg);
                ACK();
                write_byte(date);                       
                ACK();
          Stop();
}
uchar read_add(uchar slave,uchar reg)
{
                uchar date;
                Start();
                write_byte(slave&0xFE);               
                ACK();
                write_byte(reg);       
                ACK();
                Start();
                write_byte(slave | 0x01);
                EACK();
                date=read_byte();
                Stop();
                return date;
}
void Start(void)
{
                SDA_H();
                delay(5);
                SCL_H();
                delay(5);
                SCL_L();
}
void Stop(void)
{
                SDA_L();
                delay(5);
                SCL_H();
                delay(5);
                SDA_H();

}
void init(void)
{
                SDA_H();
                delay(5);
                SCL_H();
                delay(5);
}

void SDA_H(void)
{
         unsigned long int temp;
   temp = inpd(GPIO_Add + GP_LVL2 );
   outpd(GPIO_Add + GP_LVL2, temp | 0x40);
}
void SDA_L(void)
{
         unsigned long int temp;
   temp = inpd(GPIO_Add + GP_LVL2 );
   outpd(GPIO_Add + GP_LVL2, temp &(~0x40));       

}
void SCL_H(void)
{
         unsigned long int temp;
   temp = inpd(GPIO_Add + GP_LVL2 );
   outpd(GPIO_Add + GP_LVL2, temp | 0x80);
}
void SCL_L(void)
{
         unsigned long int temp;
   temp = inpd(GPIO_Add + GP_LVL2 );
   outpd(GPIO_Add + GP_LVL2, temp &(~0x80));
}
uchar SDA_S(void)
{
         unsigned long int temp;
   temp = inpd(GPIO_Add + GP_LVL2 );
   if( (temp & 0x40) == 0x40 )
   {
                        return 1;
   }
   else
      return 0;
}
uchar SCL_S(void)
{
         unsigned long int temp;
   temp = inpd(GPIO_Add + GP_LVL2 );
   if( (temp & 0x80) == 0x80 )
   {
                        return 1;
   }
   else
      return 0;
}
void ACK(void)
{
          SDA_H();
          delay(5);
          SCL_H();
          delay(5);
          SDA_L();
}

void EACK(void)
{
          SDA_L();
          delay(5);                    
          SCL_H();
          delay(5);
          SCL_L();
          delay(5);
}
void write_byte(uchar date)
{
        uchar i;
        for(i=0;i<8;i++)
        {

                                SCL_H();
                                delay(5);
                                if(date &0x80)
                                        SDA_H();
                                else
                                        SDA_L();
                                delay(5);
                                date<<=1;
                                SCL_L();                                              
        }
        delay(5);
       
}
uchar read_byte(void)
{
        uchar i,k=0;

        for(i=0;i<8;i++)
        {
                SCL_L();
                delay(5);
                SCL_H();
                delay(5);        
                k<<=1;
                if(SDA_S() == 1)
                  k+=1;  
                delay(5);
                SCL_L();
                delay(5);                                      
        }
        return k;
}

使用特权

评论回复
5
zf_015820| | 2012-12-21 10:10 | 只看该作者
建议:在关键处或者不明白处加上printf函数,输出程序运行的相关信息,从而实现逐步调试;当程序 运行输出的信息,不是你想要的结果,就说明那里有问题,修正,就OK了

使用特权

评论回复
6
似水无痕| | 2012-12-21 12:26 | 只看该作者
用示波器抓输出波形,然后跟正确的时序图做比较

使用特权

评论回复
7
jlass| | 2012-12-21 12:47 | 只看该作者
别帖代码,那玩样儿没用。
用示波器抓输出波形图帖出来,然后把datasheet的时序图也贴出了。
我估计那个时候你已经搞定了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝