4526|4

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于s3c2440的裸机i2c驱动问题 [复制链接]

最近小弟写了一个基于s3c2440的裸机i2c驱动可是怎么都不好使,调试时能写入但是不能读出为什么
编译环境keil uvion 4.01b
代码
这个是ii2.h

  1. #include "S3C2440.h"
  2. //引脚配置+电源配置+频率配置+iic配置
  3. //函数iic写一个数据 iic读一个数据 iic初始化 iic地址设置
  4. #include "def.h"
  5. #define Slave_receive_Mode 0
  6. #define Slave_transmit_Mode 1
  7. #define Master_receive_Mode 2
  8. #define Master_transmit_mode 3
  9. #define  E2PROM_ADRR  (0xA<<4)
  10. #define  Read  1
  11. #define  Write  0
  12. #define LED1_BV (1<<5)
  13. #define LED2_BV (1<<6)
  14. #define LED3_BV (1<<7)
  15. #define LED4_BV (1<<8)
  16. #define  I2C_SDA  (1<<15)
  17. #define  I2C_SCL  (1<<14)

  18. void I2C_Init(void);
  19. void I2C_Read_A_Bety(void);
  20. void I2C_Write_A_Bety(uint8 Data);
  21. void I2C_Write_n_Bety(uint8 *pData);
  22. void I2C_Set_Addr(void);
  23. void I2C_Start(void);
  24. void AT24C08_Write_A_Bety(uint8 Data,uint16 Adrr_10bit);
  25. uint8 AT24C08_Read_A_Bety(uint16 Adrr_10bit);
  26. void wait_ok(void);
  27. void I2C_Delay(void);
复制代码


这个是iic.c

  1. #include "i2c.h"
  2. void I2C_Init(void)
  3. {//uint8 temp;
  4.         GPECON=0x0;
  5.         GPEUP=0;
  6. GPECON|=0x5<<28;//引脚配置,漏极开路没有上拉的问题
  7. GPBCON=0;
  8. //GPBCON|=0x51400;
  9. GPBCON|=(0x55<<10);
  10. GPBUP=0;
  11. GPBDAT=~0;
  12. //配置时钟
  13. //时钟输入到i2c中
  14. GPEDAT|=I2C_SCL;
  15. I2C_Delay();
  16. GPEDAT|=I2C_SDA ;
  17. I2C_Delay();
  18. I2C_Delay();
  19. I2C_Delay();
  20. I2C_Delay();
  21. }
  22. void I2C_Start()
  23. {
  24.         GPEDAT|=I2C_SDA;        I2C_Delay();
  25.         GPEDAT|=I2C_SCL;        I2C_Delay();
  26.         GPEDAT&=~I2C_SDA;        I2C_Delay();
  27.         GPEDAT&=~I2C_SCL;        I2C_Delay();
  28. }
  29. void I2C_Write(unsigned char Data)
  30. {
  31.         unsigned char t = 8;

  32.         for(t=0;t<8;t++)
  33. {      if((Data<
  34.             {GPEDAT|=I2C_SDA;}
  35.             else
  36.             {GPEDAT&=~I2C_SDA;}
  37.                          I2C_Delay();
  38.         GPEDAT|=I2C_SCL;       
  39.         I2C_Delay();
  40.         GPEDAT&=~I2C_SCL;
  41.                 I2C_Delay();       
  42. }

  43. }
  44. unsigned char I2C_Read()
  45. {
  46.         unsigned char dat=0;
  47.         unsigned char t = 8;
  48.                 GPEDAT|=I2C_SDA;
  49.         //在读取数据之前,要把SDA拉高,使之处于输入状态
  50.         GPECON&= ~(0x3<<30);//作为输入使用

  51.         do
  52.         {
  53.                 GPEDAT|=I2C_SCL;
  54.                         I2C_Delay();
  55.                 dat <<= 1;
  56.                 if ( GPEDAT&I2C_SDA )
  57.                 dat++;
  58.         GPEDAT&=~I2C_SCL;
  59.                 I2C_Delay();
  60.         } while ( --t != 0 );

  61.                 GPECON|= (0x1<<30);
  62.         return dat;
  63. }
  64. uint8 I2C_GetAck()
  65. {          //这时候需要把线改为输入型
  66.         uint8 ack;
  67.         GPEDAT|=I2C_SDA;       
  68.         I2C_Delay();
  69.         GPEDAT|=I2C_SCL;               
  70.         I2C_Delay();
  71.         GPECON&= ~(0x3<<30);
  72.         ack = ((GPEDAT&I2C_SDA)>>15)&0x1;
  73.         GPEDAT&=~I2C_SCL;        I2C_Delay();
  74.                    GPECON|=(0x1<<30);

  75.         return (ack&0x1);
  76.        
  77. }
  78. void I2C_PutAck(uint8 ack)
  79. {if (ack&0x01)
  80. {GPEDAT|=I2C_SDA;       
  81. }
  82. else
  83. {GPEDAT&=~I2C_SDA;

  84. }
  85.         I2C_Delay();
  86. GPEDAT|=I2C_SCL;                I2C_Delay();
  87. GPEDAT&=~I2C_SCL;                I2C_Delay();
  88. }
  89. void I2C_Stop()
  90. {
  91. //        unsigned int t;
  92. GPEDAT&=~I2C_SDA;
  93.         I2C_Delay();
  94. GPEDAT|=I2C_SCL;       
  95.         I2C_Delay();
  96. GPEDAT|=I2C_SDA;       
  97.         I2C_Delay();
  98.         //对于某些器件来说,在下一次产生Start之前,额外增加一定的延时是必须的
  99. I2C_Delay();
  100. I2C_Delay();
  101. I2C_Delay();
  102. }
  103. void AT24C08_Write_A_Bety(uint8 Data,uint16 Adrr_10bit)
  104. {        //启动与停止只需要一次
  105.          int i=0;
  106.          uint8  I2Cdata1=0;
  107.          I2Cdata1=(uint8)(Adrr_10bit>>8);
  108.          I2Cdata1<<=1;
  109.          I2Cdata1&=0xf6;
  110.          I2Cdata1|=E2PROM_ADRR;
  111.          I2Cdata1|=Write;
  112.          I2C_Init()          ;
  113.                     I2C_Start();
  114.                        I2C_Write(I2Cdata1);
  115.         if ( I2C_GetAck() )
  116.         {
  117.                 I2C_Stop();
  118.                 //return 1;
  119.                     GPBDAT|= LED4_BV;
  120.                         while(1);
  121.         }


  122.          I2Cdata1=(uint8)(Adrr_10bit&0xFF);
  123.              I2C_Write(I2Cdata1);
  124.         if ( I2C_GetAck() )
  125.         {
  126.                 I2C_Stop();
  127.                 //return 1;
  128.                     GPBDAT|= LED4_BV;
  129.                         while(1);
  130.         }
  131.                  I2Cdata1=Data;
  132.                     I2C_Write(I2Cdata1);
  133.         if ( I2C_GetAck() )
  134.         {
  135.                 I2C_Stop();
  136.                 //return 1;
  137.                     GPBDAT|= LED4_BV;
  138.                         while(1);
  139.         }
  140.                    I2C_Stop();
  141.          for (i=0;i<65530;i++);
  142. }

  143. void wait_ok(void)
  144. {                 while(!(SRCPND&(1<<27)))
  145. {GPBDAT&= ~LED1_BV;
  146. }
  147.   IICCON&=~(1<<4);//写0回复数据传输
  148.   GPBDAT|= LED1_BV;
  149.   SRCPND|= (1<<27);
  150.   INTPND|= (1<<27);
  151. }
  152. void I2C_Delay()
  153. {
  154.         unsigned char t;
  155.         t = 1000;
  156.         while ( --t != 0 );                //延时2*t个机器周期
  157. }
  158. uint8 AT24C08_Read_A_Bety(uint16 Adrr_10bit)
  159. {int i=0;
  160. uint8 temp;
  161. uint8  I2Cdata1=0;
  162. uint8  I2Cdata2=0;
  163. I2Cdata1=(uint8)(Adrr_10bit>>8);
  164. I2Cdata1<<=1;
  165. I2Cdata1&=0xf6;
  166. I2Cdata1|=E2PROM_ADRR;
  167. I2Cdata1|=Write;
  168. I2C_Init()          ;
  169. I2C_Start();
  170. I2C_Write(I2Cdata1);
  171.         if ( I2C_GetAck() )
  172.         {
  173.                 I2C_Stop();
  174.                 //return 1;
  175.                     GPBDAT|= LED4_BV;
  176.                         while(1);
  177.         }
  178. I2Cdata2=(uint8)(Adrr_10bit&0xFF);
  179. I2C_Write(I2Cdata2);
  180.         if ( I2C_GetAck() )
  181.         {
  182.                 I2C_Stop();
  183.                 //return 1;
  184.                     GPBDAT|= LED4_BV;
  185.                         while(1);
  186.         }
  187. I2C_Start();
  188. I2Cdata1|=Read ;
  189. I2C_Write(I2Cdata1);
  190.         if ( I2C_GetAck() )
  191.         {
  192.                 I2C_Stop();
  193.                 //return 1;
  194.                     GPBDAT|= LED4_BV;
  195.                         while(1);
  196.         }
  197. temp=I2C_Read();
  198. I2C_PutAck(1);
  199.         I2C_Stop();
  200.         return temp;
  201. }

复制代码

这个是main.c

  1. #include
  2. #include "i2c.h"
  3. #include"IIC.h"
  4. #include "MY_IIC.h"
  5. //unsigned int PCLK;

  6. void dealy()
  7. {long i;
  8. uint16 temp=0x0;
  9.   for(i=0;i<500000;i++);
  10. }


  11. int main()
  12. {  uint8 temp=0;
  13. uint8 i=0;
  14.    GPBCON=0;
  15.    INTMSK=~0;
  16.      //GPBCON|=0x51400;
  17.             GPBCON|=(0x55<<10);
  18.          GPBUP=0;
  19.          //一下的寄存器只有[10:0],才11位
  20. GPEUP  |= 0xc000;
  21. GPECON |= 0xa00000;  


  22. GPBDAT=~0;
  23. GPBDAT=0;
  24. GPBDAT|= LED1_BV;
  25. dealy();
  26.   GPBDAT|= LED2_BV;
  27.   dealy();
  28.    GPBDAT|= LED3_BV;
  29.    dealy();
  30.     GPBDAT|= LED4_BV;
  31.         dealy();
  32. GPBDAT=~0;//全灭

  33. AT24C08_Write_A_Bety(5,5);
  34.     GPBDAT&=~ LED4_BV;
  35.         dealy();
  36.         GPBDAT=~0;//全灭
  37. temp=AT24C08_Read_A_Bety(5);


  38.         {  GPBDAT|= LED1_BV;
  39.                         dealy();

  40.                         dealy();
  41.                                 dealy();
  42.                                         dealy();
  43.          GPBDAT&=~LED1_BV;
  44.                  dealy();
  45.                                 dealy();
  46.                                         dealy();
  47.         }
  48.         GPBDAT=~0;//全灭

  49.         while(1)
  50. {                                GPBDAT=(temp&0xf)<<5;
  51.                                         dealy();
  52. GPBDAT=0;
  53. dealy();       
  54.   }
  55. return 0;

  56. }                          
  57. 希望大家能帮我看看

复制代码

希望大家能帮我看看

最新回复

好我试试  详情 回复 发表于 2010-5-31 13:43
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用软件模拟的I2C呀!那你要用示波器抓一下波形看看了,多数是你时序有问题所以器件不应答。
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
能写入,不能读出,楼主你确定你写入的数据,对方能收到吗?而且对方的应答也正常吗?这样才可以说写入的时序已经正确。假如有示波器,最好了。看看双方通信的时序,看问题出在哪里。你这样看代码是比较难发现问题的。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(中级)

4
 
用示波器抓一下波形,看时序对不对
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
好我试试
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表