4123|6

76

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

谁能给我一个I2C的测试程序? [复制链接]

  谁能给我一个ARM2410的linux下的测试程序(对24c04或24c02的读写),要直接编译就能用的,最好注释一下。我的内核是2.6的谢谢!

最新回复

怎么解决的,能否给大家分享一下?  详情 回复 发表于 2009-4-30 16:20
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  哎,说真的,在IIC这个问题上纠缠都快2周六,开始是书上的实例读写操作有问题,问了一遍又一遍,帖子结; 又发发了又结就是想多给点分给帮助过我的朋友,结果还是没人知道,现在只好希望哪位高人能拿个现成能用的实例让我测试研究一下了。
  希望大家能帮帮忙,感激不尽!
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
  1. //====================================================================
  2. // File Name : 2410IIC.c
  3. // Function  : S3C2410 IIC-bus Master Tx/Rx mode Test Program
  4. //             (Interrupt / Non Interrupt (Polling))
  5. // Program   : Shin, On Pil (SOP)
  6. // Date      : May 21, 2002
  7. // Version   : 0.0
  8. // History
  9. //   0.0 : Programming start (March 11, 2002) -> SOP
  10. //====================================================================

  11. #include
  12. #include "2410addr.h"
  13. #include "2410lib.h"
  14. #include "def.h"
  15. #include "2410IIC.h"

  16. static U8 _iicData[IICBUFSIZE];
  17. static volatile int _iicDataCount;
  18. static volatile int _iicStatus;
  19. static volatile int _iicMode;
  20. static int _iicPt;

  21. //===================================================================
  22. //       SMDK2410 IIC configuration
  23. //  GPE15=IICSDA, GPE14=IICSCL
  24. //  "Interrupt mode" for IIC block
  25. //===================================================================

  26. //******************[ Test_Iic ]**************************************
  27. void Test_Iic(void)
  28. {
  29.     unsigned int i,j,save_E,save_PE;
  30.     static U8 data[256];

  31.     Uart_Printf("[ IIC Test(Interrupt) using KS24C080 ]\n");

  32.     save_E   = rGPECON;
  33.     save_PE  = rGPEUP;
  34.     rGPEUP  |= 0xc000;                  //Pull-up disable
  35.     rGPECON |= 0xa00000;                //GPE15:IICSDA , GPE14:IICSCL

  36.     pISR_IIC = (unsigned)IicInt;
  37.     rINTMSK &= ~(BIT_IIC);

  38.       //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
  39.       // If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz
  40.     rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);

  41.     rIICADD  = 0x10;                    //2410 slave address = [7:1]
  42.     rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)

  43.     Uart_Printf("Write test data into KS24C080\n");

  44.     for(i=0;i<256;i++)
  45.         Wr24C080(0xa0,(U8)i,i);
  46.            
  47.     for(i=0;i<256;i++)
  48.         data[i] = 0;

  49.     Uart_Printf("Read test data from KS24C080\n");
  50.    
  51.     for(i=0;i<256;i++)
  52.         Rd24C080(0xa0,(U8)i,&(data[i]));

  53.         //Line changed 0 ~ f
  54.     for(i=0;i<16;i++)
  55.     {
  56.         for(j=0;j<16;j++)
  57.             Uart_Printf("%2x ",data[i*16+j]);
  58.         Uart_Printf("\n");
  59.     }
  60.     rINTMSK |= BIT_IIC;   
  61.     rGPEUP  = save_PE;
  62.     rGPECON = save_E;
  63. }


  64. //*************************[ Wr24C080 ]****************************
  65. void Wr24C080(U32 slvAddr,U32 addr,U8 data)
  66. {
  67.     _iicMode      = WRDATA;
  68.     _iicPt        = 0;
  69.     _iicData[0]   = (U8)addr;
  70.     _iicData[1]   = data;
  71.     _iicDataCount = 2;
  72.    
  73.     rIICDS   = slvAddr;                 //0xa0
  74.     rIICSTAT = 0xf0;                    //MasTx,Start
  75.       //Clearing the pending bit isn't needed because the pending bit has been cleared.
  76.     while(_iicDataCount!=-1);

  77.     _iicMode = POLLACK;

  78.     while(1)
  79.     {
  80.         rIICDS     = slvAddr;
  81.         _iicStatus = 0x100;
  82.         rIICSTAT   = 0xf0;              //MasTx,Start
  83.         rIICCON    = 0xaf;              //Resumes IIC operation.
  84.            
  85.         while(_iicStatus==0x100);
  86.            
  87.         if(!(_iicStatus&0x1))
  88.             break;                      //When ACK is received
  89.     }
  90.     rIICSTAT = 0xd0;                    //Stop MasTx condition
  91.     rIICCON  = 0xaf;                    //Resumes IIC operation.
  92.     Delay(1);                           //Wait until stop condtion is in effect.
  93.        //Write is completed.
  94. }
  95.         
  96. //**********************[ Rd24C080 ] ***********************************
  97. void Rd24C080(U32 slvAddr,U32 addr,U8 *data)
  98. {
  99.     _iicMode      = SETRDADDR;
  100.     _iicPt        = 0;
  101.     _iicData[0]   = (U8)addr;
  102.     _iicDataCount = 1;

  103.     rIICDS   = slvAddr;
  104.     rIICSTAT = 0xf0;                    //MasTx,Start  
  105.       //Clearing the pending bit isn't needed because the pending bit has been cleared.
  106.     while(_iicDataCount!=-1);

  107.     _iicMode      = RDDATA;
  108.     _iicPt        = 0;
  109.     _iicDataCount = 1;
  110.    
  111.     rIICDS        = slvAddr;
  112.     rIICSTAT      = 0xb0;               //MasRx,Start
  113.     rIICCON       = 0xaf;               //Resumes IIC operation.   
  114.     while(_iicDataCount!=-1);

  115.     *data = _iicData[1];
  116. }


  117. //-------------------------------------------------------------------------
  118. void __irq IicInt(void)
  119. {
  120.     U32 iicSt,i;
  121.    
  122.     rSRCPND = BIT_IIC;          //Clear pending bit
  123.     rINTPND = BIT_IIC;
  124.     iicSt   = rIICSTAT;
  125.    
  126.     if(iicSt & 0x8){}           //When bus arbitration is failed.
  127.     if(iicSt & 0x4){}           //When a slave address is matched with IICADD
  128.     if(iicSt & 0x2){}           //When a slave address is 0000000b
  129.     if(iicSt & 0x1){}           //When ACK isn't received

  130.     switch(_iicMode)
  131.     {
  132.        case POLLACK:
  133.            _iicStatus = iicSt;
  134.            break;

  135.        case RDDATA:
  136.            if((_iicDataCount--)==0)
  137.            {
  138.                _iicData[_iicPt++] = rIICDS;
  139.             
  140.                rIICSTAT = 0x90;                 //Stop MasRx condition
  141.                rIICCON  = 0xaf;                 //Resumes IIC operation.
  142.                Delay(1);                        //Wait until stop condtion is in effect.
  143.                                                 //Too long time...
  144.                                                 //The pending bit will not be set after issuing stop condition.
  145.                break;   
  146.            }      
  147.            _iicData[_iicPt++] = rIICDS;         //The last data has to be read with no ack.

  148.            if((_iicDataCount)==0)
  149.                rIICCON = 0x2f;                  //Resumes IIC operation with NOACK.  
  150.            else
  151.                rIICCON = 0xaf;                  //Resumes IIC operation with ACK
  152.                break;

  153.         case WRDATA:
  154.             if((_iicDataCount--)==0)
  155.             {
  156.                 rIICSTAT = 0xd0;                //Stop MasTx condition
  157.                 rIICCON  = 0xaf;                //Resumes IIC operation.
  158.                 Delay(1);                       //Wait until stop condtion is in effect.
  159.                        //The pending bit will not be set after issuing stop condition.
  160.                 break;   
  161.             }
  162.             rIICDS = _iicData[_iicPt++];        //_iicData[0] has dummy.
  163.             for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL
  164.               
  165.             rIICCON = 0xaf;                     //resumes IIC operation.
  166.             break;

  167.         case SETRDADDR:
  168. //          Uart_Printf("[ S%d ]",_iicDataCount);
  169.             if((_iicDataCount--)==0)
  170.                 break;                          //IIC operation is stopped because of IICCON[4]   
  171.             rIICDS = _iicData[_iicPt++];
  172.             for(i=0;i<10;i++);                  //For setup time until rising edge of IICSCL
  173.             rIICCON = 0xaf;                     //Resumes IIC operation.
  174.             break;

  175.         default:
  176.             break;      
  177.     }
  178. }


  179. }
复制代码
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
  1. //===================================================================
  2. //       SMDK2410 IIC configuration
  3. //  GPE15=IICSDA, GPE14=IICSCL
  4. //  "Non-Interrupt" mode for IIC block
  5. //===================================================================

  6. //*********************[ Test_Iic2 ]*********************************
  7. void Test_Iic2(void)
  8. {
  9.     unsigned int i,j,save_E,save_PE;
  10.     static U8 data[256];
  11.    
  12.     Uart_Printf("[ IIC Test(Polling) using KS24C080 ]\n");

  13.     save_E   = rGPECON;
  14.     save_PE  = rGPEUP;

  15.     rGPEUP  |= 0xc000;                  //Pull-up disable
  16.     rGPECON |= 0xa00000;                //GPE15:IICSDA , GPE14:IICSCL   

  17.       //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
  18.     rIICCON  = (1<<7) | (0<<6) | (1<<5) | (0xf);

  19.     rIICADD  = 0x10;                    //2410 slave address = [7:1]
  20.     rIICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)

  21.     Uart_Printf("Write test data into KS24C080\n");

  22.     for(i=0;i<256;i++)
  23.         _Wr24C080(0xa0,(U8)i,255-i);
  24.     for(i=0;i<256;i++)
  25.         data[i] = 0;

  26.     Uart_Printf("Read test data from KS24C080\n");
  27.     for(i=0;i<256;i++)
  28.         _Rd24C080(0xa0,(U8)i,&(data[i]));

  29.     for(i=0;i<16;i++)
  30.     {
  31.         for(j=0;j<16;j++)
  32.             Uart_Printf("%2x ",data[i*16+j]);
  33.         Uart_Printf("\n");
  34.     }
  35.    
  36.     rGPEUP  = save_PE;
  37.     rGPECON = save_E;
  38. }

  39. //**************[ _Wr24C080 ]*****************************************
  40. void _Wr24C080(U32 slvAddr,U32 addr,U8 data)
  41. {
  42.     _iicMode      = WRDATA;
  43.     _iicPt        = 0;
  44.     _iicData[0]   = (U8)addr;
  45.     _iicData[1]   = data;
  46.     _iicDataCount = 2;
  47.    
  48.     rIICDS        = slvAddr;            //0xa0
  49.       //Master Tx mode, Start(Write), IIC-bus data output enable
  50.       //Bus arbitration sucessful, Address as slave status flag Cleared,
  51.       //Address zero status flag cleared, Last received bit is 0
  52.     rIICSTAT      = 0xf0;      
  53.       //Clearing the pending bit isn't needed because the pending bit has been cleared.
  54.     while(_iicDataCount!=-1)
  55.        Run_IicPoll();

  56.     _iicMode = POLLACK;

  57.     while(1)
  58.     {
  59.         rIICDS     = slvAddr;
  60.         _iicStatus = 0x100;             //To check if _iicStatus is changed
  61.         rIICSTAT   = 0xf0;              //Master Tx, Start, Output Enable, Sucessful, Cleared, Cleared, 0
  62.         rIICCON    = 0xaf;              //Resumes IIC operation.
  63.         while(_iicStatus==0x100)  
  64.             Run_IicPoll();
  65.               
  66.         if(!(_iicStatus & 0x1))
  67.             break;                      //When ACK is received
  68.     }
  69.     rIICSTAT = 0xd0;                    //Master Tx condition, Stop(Write), Output Enable
  70.     rIICCON  = 0xaf;                    //Resumes IIC operation.
  71.     Delay(1);                           //Wait until stop condtion is in effect.
  72.       //Write is completed.
  73. }
  74.         
  75. //************************[ _Rd24C080 ]********************************
  76. void _Rd24C080(U32 slvAddr,U32 addr,U8 *data)
  77. {
  78.     _iicMode      = SETRDADDR;
  79.     _iicPt        = 0;
  80.     _iicData[0]   = (U8)addr;
  81.     _iicDataCount = 1;

  82.     rIICDS   = slvAddr;
  83.     rIICSTAT = 0xf0;                    //MasTx,Start  
  84.       //Clearing the pending bit isn't needed because the pending bit has been cleared.
  85.     while(_iicDataCount!=-1)
  86.         Run_IicPoll();

  87.     _iicMode      = RDDATA;
  88.     _iicPt        = 0;
  89.     _iicDataCount = 1;
  90.    
  91.     rIICDS   = slvAddr;
  92.     rIICSTAT = 0xb0;                    //Master Rx,Start
  93.     rIICCON  = 0xaf;                    //Resumes IIC operation.   
  94.     while(_iicDataCount!=-1)
  95.         Run_IicPoll();

  96.     *data = _iicData[1];
  97. }

  98. //**********************[ Run_IicPoll ]*********************************
  99. void Run_IicPoll(void)
  100. {
  101.     if(rIICCON & 0x10)                  //Tx/Rx Interrupt Enable
  102.        IicPoll();
  103. }      
  104.    
  105. //**********************[IicPoll ]**************************************
  106. void IicPoll(void)
  107. {
  108.     U32 iicSt,i;
  109.    
  110.     iicSt = rIICSTAT;
  111.     if(iicSt & 0x8){}                   //When bus arbitration is failed.
  112.     if(iicSt & 0x4){}                   //When a slave address is matched with IICADD
  113.     if(iicSt & 0x2){}                   //When a slave address is 0000000b
  114.     if(iicSt & 0x1){}                   //When ACK isn't received

  115.     switch(_iicMode)
  116.     {
  117.         case POLLACK:
  118.             _iicStatus = iicSt;
  119.             break;

  120.         case RDDATA:
  121.             if((_iicDataCount--)==0)
  122.             {
  123.                 _iicData[_iicPt++] = rIICDS;
  124.             
  125.                 rIICSTAT = 0x90;                //Stop MasRx condition
  126.                 rIICCON  = 0xaf;                //Resumes IIC operation.
  127.                 Delay(1);                       //Wait until stop condtion is in effect.
  128.                                                 //Too long time...
  129.                                                 //The pending bit will not be set after issuing stop condition.
  130.                 break;   
  131.             }      
  132.             _iicData[_iicPt++] = rIICDS;
  133.                         //The last data has to be read with no ack.
  134.             if((_iicDataCount)==0)
  135.                 rIICCON = 0x2f;                 //Resumes IIC operation with NOACK.  
  136.             else
  137.                 rIICCON = 0xaf;                 //Resumes IIC operation with ACK
  138.             break;

  139.         case WRDATA:
  140.             if((_iicDataCount--)==0)
  141.             {
  142.                 rIICSTAT = 0xd0;                //stop MasTx condition
  143.                 rIICCON  = 0xaf;                //resumes IIC operation.
  144.                 Delay(1);                       //wait until stop condtion is in effect.
  145.                        //The pending bit will not be set after issuing stop condition.
  146.                 break;   
  147.             }
  148.             rIICDS = _iicData[_iicPt++];        //_iicData[0] has dummy.
  149.             for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL
  150.             rIICCON = 0xaf;                     //resumes IIC operation.
  151.             break;

  152.         case SETRDADDR:
  153. //          Uart_Printf("[S%d]",_iicDataCount);
  154.             if((_iicDataCount--)==0)
  155.             {
  156.                 break;                  //IIC operation is stopped because of IICCON[4]   
  157.             }
  158.             rIICDS = _iicData[_iicPt++];
  159.             for(i=0;i<10;i++);          //for setup time until rising edge of IICSCL
  160.             rIICCON = 0xaf;             //resumes IIC operation.
  161.             break;

  162.         default:
  163.             break;      
  164.     }

复制代码
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

5
 
这是头文件的
  1. //====================================================================
  2. // File Name : 2410IIC.h
  3. // Function  : S3C2410 IIC Test Program Head file
  4. // Program   : Shin, On Pil (SOP)
  5. // Date      : March 20, 2002
  6. // Version   : 0.0
  7. // History
  8. //   0.0 : Programming start (March 11, 2002) -> SOP
  9. //====================================================================

  10. #ifndef __2410IIC_H__
  11. #define __2410IIC_H__

  12. #define WRDATA      (1)
  13. #define POLLACK     (2)
  14. #define RDDATA      (3)
  15. #define SETRDADDR   (4)

  16. #define IICBUFSIZE 0x20

  17. void Test_Iic(void);
  18. void Test_Iic2(void);
  19. void Wr24C080(U32 slvAddr,U32 addr,U8 data);   
  20. void Rd24C080(U32 slvAddr,U32 addr,U8 *data);   
  21. void _Wr24C080(U32 slvAddr,U32 addr,U8 data);   
  22. void _Rd24C080(U32 slvAddr,U32 addr,U8 *data);  

  23. void __irq IicInt(void);
  24. void IicPoll(void);
  25. void Run_IicPoll(void);


  26. #endif    //__2410IIC_H__
复制代码
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
  非常感谢guetcw ,虽然我要的是直接调用write和read对寄存器进行读写,不过你的程序对我还是非常有参考价值,目前问题已经解决!谢谢!
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

7
 
怎么解决的,能否给大家分享一下?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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