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

[复制链接]
2563|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 | 显示全部楼层
这个是代码  不知道哪边有问题.求指点.
  1. void write_add(uchar slave,uchar reg,uchar date)
  2. {
  3.           Start();
  4.           write_byte(slave&0xFE);
  5.           ACK();
  6.                 write_byte(reg);
  7.                 ACK();
  8.                 write_byte(date);                       
  9.                 ACK();
  10.           Stop();
  11. }
  12. uchar read_add(uchar slave,uchar reg)
  13. {
  14.                 uchar date;
  15.                 Start();
  16.                 write_byte(slave&0xFE);               
  17.                 ACK();
  18.                 write_byte(reg);       
  19.                 ACK();
  20.                 Start();
  21.                 write_byte(slave | 0x01);
  22.                 EACK();
  23.                 date=read_byte();
  24.                 Stop();
  25.                 return date;
  26. }
  27. void Start(void)
  28. {
  29.                 SDA_H();
  30.                 delay(5);
  31.                 SCL_H();
  32.                 delay(5);
  33.                 SCL_L();
  34. }
  35. void Stop(void)
  36. {
  37.                 SDA_L();
  38.                 delay(5);
  39.                 SCL_H();
  40.                 delay(5);
  41.                 SDA_H();

  42. }
  43. void init(void)
  44. {
  45.                 SDA_H();
  46.                 delay(5);
  47.                 SCL_H();
  48.                 delay(5);
  49. }

  50. void SDA_H(void)
  51. {
  52.          unsigned long int temp;
  53.    temp = inpd(GPIO_Add + GP_LVL2 );
  54.    outpd(GPIO_Add + GP_LVL2, temp | 0x40);
  55. }
  56. void SDA_L(void)
  57. {
  58.          unsigned long int temp;
  59.    temp = inpd(GPIO_Add + GP_LVL2 );
  60.    outpd(GPIO_Add + GP_LVL2, temp &(~0x40));       

  61. }
  62. void SCL_H(void)
  63. {
  64.          unsigned long int temp;
  65.    temp = inpd(GPIO_Add + GP_LVL2 );
  66.    outpd(GPIO_Add + GP_LVL2, temp | 0x80);
  67. }
  68. void SCL_L(void)
  69. {
  70.          unsigned long int temp;
  71.    temp = inpd(GPIO_Add + GP_LVL2 );
  72.    outpd(GPIO_Add + GP_LVL2, temp &(~0x80));
  73. }
  74. uchar SDA_S(void)
  75. {
  76.          unsigned long int temp;
  77.    temp = inpd(GPIO_Add + GP_LVL2 );
  78.    if( (temp & 0x40) == 0x40 )
  79.    {
  80.                         return 1;
  81.    }
  82.    else
  83.       return 0;
  84. }
  85. uchar SCL_S(void)
  86. {
  87.          unsigned long int temp;
  88.    temp = inpd(GPIO_Add + GP_LVL2 );
  89.    if( (temp & 0x80) == 0x80 )
  90.    {
  91.                         return 1;
  92.    }
  93.    else
  94.       return 0;
  95. }
  96. void ACK(void)
  97. {
  98.           SDA_H();
  99.           delay(5);
  100.           SCL_H();
  101.           delay(5);
  102.           SDA_L();
  103. }

  104. void EACK(void)
  105. {
  106.           SDA_L();
  107.           delay(5);                    
  108.           SCL_H();
  109.           delay(5);
  110.           SCL_L();
  111.           delay(5);
  112. }
  113. void write_byte(uchar date)
  114. {
  115.         uchar i;
  116.         for(i=0;i<8;i++)
  117.         {

  118.                                 SCL_H();
  119.                                 delay(5);
  120.                                 if(date &0x80)
  121.                                         SDA_H();
  122.                                 else
  123.                                         SDA_L();
  124.                                 delay(5);
  125.                                 date<<=1;
  126.                                 SCL_L();                                              
  127.         }
  128.         delay(5);
  129.        
  130. }
  131. uchar read_byte(void)
  132. {
  133.         uchar i,k=0;

  134.         for(i=0;i<8;i++)
  135.         {
  136.                 SCL_L();
  137.                 delay(5);
  138.                 SCL_H();
  139.                 delay(5);        
  140.                 k<<=1;
  141.                 if(SDA_S() == 1)
  142.                   k+=1;  
  143.                 delay(5);
  144.                 SCL_L();
  145.                 delay(5);                                      
  146.         }
  147.         return k;
  148. }
zf_015820 发表于 2012-12-21 10:10 | 显示全部楼层
建议:在关键处或者不明白处加上printf函数,输出程序运行的相关信息,从而实现逐步调试;当程序 运行输出的信息,不是你想要的结果,就说明那里有问题,修正,就OK了
似水无痕 发表于 2012-12-21 12:26 | 显示全部楼层
用示波器抓输出波形,然后跟正确的时序图做比较
jlass 发表于 2012-12-21 12:47 | 显示全部楼层
别帖代码,那玩样儿没用。
用示波器抓输出波形图帖出来,然后把datasheet的时序图也贴出了。
我估计那个时候你已经搞定了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部