5249|2

40

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

ARM裸机IIC例程中的疑惑(各位看官进来看看) [复制链接]

关于ARM裸机IIC例程中的疑惑:
write数据函数中,为什么会有POLLACK模式?(此时所有数据已经发送完了,再来判断ACK)
望大神解惑!谢谢!!!


  1. /****************************************************************
  2. *                  ARMSYS S3C44B0X  IIc At24Cxx TEST                                                *  
  3. ****************************************************************

  4.   1.2005.5.13:ZXJ:  IIc AT24Cxx TEST

  5. ***************************************************************/

  6. #include <string.h>
  7. #include "..\Target\44b.h"
  8. #include "..\Target\44blib.h"
  9. #include "..\Target\def.h"
  10. #include "..\iictest\IIC.h"

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

  15. #define IICBUFSIZE 0x20

  16. U8 _iicData[IICBUFSIZE];
  17. volatile int _iicDataCount;
  18. volatile int _iicStatus;
  19. volatile int _iicMode; //I2C总线读写操作模式
  20. int _iicPt;

  21. void __irq IicInt(void);

  22. void Test_Iic(void)
  23. {
  24.     unsigned int i,j,save_F,save_PF;
  25.     static U8 data[256];

  26.     Uart_Printf("[IIC Test using AT24Cxx]\n");

  27.     rINTCON=0x5;
  28.     rINTMOD=0x0;
  29.     rINTMSK= BIT_GLOBAL;
  30.           //rINTMSK=~(BIT_EINT0 | BIT_GLOBAL);
  31.    
  32.     save_F=rPCONF;
  33.     save_PF=rPUPF;
  34.     rPCONF |=0xa;        //PF0:IICSCL, PF1:IICSDA
  35.     rPUPF |=0x3;        //pull-up disable

  36.     pISR_IIC=(unsigned)IicInt;
  37.     rINTMSK=~(BIT_GLOBAL|BIT_IIC);
  38.        
  39.     rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
  40.     //Enable interrupt, IICCLK=MCLK/16, Enable ACK
  41.     //40Mhz/16/(15+1) = 257Khz       
  42.     rIICADD=0x10;   // S3C44B0X slave address

  43.     rIICSTAT=0x10;

  44.     Uart_Printf("Write test data into AT24LCxx\n");

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

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

  52.     for(i=0;i<16;i++)
  53.     {
  54.                 for(j=0;j<16;j++)
  55.                     Uart_Printf("%2x ",data[i*16+j]);
  56.                 Uart_Printf("\n");
  57.     }
  58.    
  59.     rPCONF=save_F;
  60.     rPUPF=save_PF;
  61. }


  62. void Wr24LCxx(U32 slvAddr,U32 addr,U8 data)
  63. {
  64.     _iicMode=WRDATA;
  65.     _iicPt=0;
  66.     _iicData[0]=(U8)addr;
  67.     _iicData[1]=data;
  68.     _iicDataCount=2;
  69.    
  70.     rIICDS=slvAddr;//0xa0
  71.     rIICSTAT=0xf0; //MasTx,Start
  72.     //Clearing the pending bit isn't needed because the pending bit has been cleared.
  73.     while(_iicDataCount!=-1);        //等待数据发送完毕

  74.     _iicMode=POLLACK;

  75.     while(1)
  76.     {
  77.                 rIICDS=slvAddr;
  78.                 _iicStatus=0x100;
  79.                 rIICSTAT=0xf0; //MasTx,Start
  80.                 rIICCON=0xaf;  //resumes IIC operation.
  81.                 while(_iicStatus==0x100);
  82.                 if(!(_iicStatus&0x1))        //
  83.                     break; // when ACK is received
  84.     }
  85.     rIICSTAT=0xd0;  //stop MasTx condition
  86.     rIICCON=0xaf;   //resumes IIC operation.
  87.     Delay(1);            //wait until stop condtion is in effect.

  88.     //write is completed.
  89. }
  90.        

  91. void Rd24LCxx(U32 slvAddr,U32 addr,U8 *data)
  92. {
  93.     _iicMode=SETRDADDR;
  94.     _iicPt=0;
  95.     _iicData[0]=(U8)addr;
  96.     _iicDataCount=1;

  97.     rIICDS=slvAddr;
  98.     rIICSTAT=0xf0; //MasTx,Start  
  99.     //Clearing the pending bit isn't needed because the pending bit has been cleared.
  100.     while(_iicDataCount!=-1);

  101.     _iicMode=RDDATA;

  102.     _iicPt=0;
  103.     _iicDataCount=1;
  104.    
  105.     rIICDS=slvAddr;
  106.     rIICSTAT=0xb0; //MasRx,Start
  107.     rIICCON=0xaf;  //resumes IIC operation.   
  108.     while(_iicDataCount!=-1);

  109.     *data=_iicData[1];
  110. }



  111. void __irq IicInt(void)
  112. {
  113.     U32 iicSt,i;
  114.     rI_ISPC=BIT_IIC;

  115.     iicSt=rIICSTAT;
  116.     if(iicSt&0x8){} // when bus arbitration is failed.
  117.     if(iicSt&0x4){} // when a slave address is matched with IICADD
  118.     if(iicSt&0x2){} // when a slave address is 0000000b
  119.     if(iicSt&0x1){} // when ACK isn't received

  120.     switch(_iicMode)
  121.     {
  122.         case POLLACK:
  123.             _iicStatus=iicSt;
  124.             break;

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

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

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

  167.         default:
  168.             break;          
  169.     }
  170. }


复制代码

最新回复

现在还玩S3C44B0X?  详情 回复 发表于 2017-6-26 10:54
点赞 关注

回复
举报

1173

帖子

3

TA的资源

五彩晶圆(初级)

沙发
 
现在还玩S3C44B0X?

点评

没办法,学生  详情 回复 发表于 2017-6-26 11:06
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
ou513 发表于 2017-6-26 10:54
现在还玩S3C44B0X?

没办法,学生
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表