⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.lst

📁 用于Slave I2C得读写,此代码针对特定得芯片,但对其他得芯片也有借鉴作用.
💻 LST
📖 第 1 页 / 共 2 页
字号:
 228   2      
 229   2                      }
 230   1               else
 231   1               {
 232   2              Delay_0_5us(4);
 233   2              Delay_0_5us(4);
 234   2            }
 235   1      
 236   1           WritePinSCL();   //9 clock
 237   1      
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 5   

 238   1      //     ReadPinSDA(t)    //first read
 239   1      
 240   1               if(iHighMode)
 241   1                      Delay_0_5us(1);
 242   1               else
 243   1              Delay_0_5us(4);
 244   1      
 245   1      
 246   1           t=ReadPinSDA();     //second read
 247   1      
 248   1           if(t==1)
 249   1               ack=0;
 250   1           else
 251   1               ack=1;        /*判断是否接收到应答信号*/
 252   1      
 253   1      
 254   1               if(iHighMode)
 255   1                      Delay_0_5us(1);
 256   1               else
 257   1              Delay_0_5us(4);
 258   1           ClearPinSCL();             //钳住总线 9 clock end
 259   1      
 260   1      
 261   1      
 262   1               if(iHighMode)
 263   1                      Delay_0_5us(1);
 264   1               else
 265   1              Delay_0_5us(4);
 266   1              return ack;
 267   1      }
 268          
 269          
 270          /*******************************************************************
 271                           字节数据传送函数
 272          函数原型: BYTE  I2cRcvByte();
 273          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 274               发完后请用应答函数。
 275          ********************************************************************/
 276          static BYTE  I2cRcvByte()
 277          {
 278   1        BYTE retc;
 279   1        BYTE BitCnt;
 280   1        BOOL t;
 281   1      
 282   1          retc=0;
 283   1      
 284   1          WritePinSDA();             /*置数据线为输入方式*/
 285   1          setSDAin();
 286   1              for(BitCnt=0;BitCnt<8;BitCnt++)
 287   1            {
 288   2               ClearPinSCL();       /*置时钟线为低,准备接收数据位*/
 289   2               if(iHighMode)         /*保证时钟高电平周期大于4μs*/
 290   2                 Delay_0_5us(2);
 291   2                   else
 292   2                 Delay_0_5us(8);
 293   2      
 294   2      
 295   2               WritePinSCL();       /*置时钟线为高使数据线上数据有效*/
 296   2      
 297   2               if(iHighMode)
 298   2                 Delay_0_5us(2);
 299   2                   else
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 6   

 300   2                 Delay_0_5us(8);
 301   2      
 302   2               retc=retc<<1;
 303   2                   t=ReadPinSDA();
 304   2      
 305   2               if(t==1)
 306   2                           retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 307   2      
 308   2            }
 309   1        ClearPinSCL();
 310   1        Delay_0_5us(2);
 311   1        return(retc);
 312   1      }
 313          
 314          
 315          
 316          /********************************************************************
 317                               应答子函数
 318          原型:  void Ack_I2c(BOOL a);
 319          
 320          功能:主控器进行应答信号,(可以是应答或非应答信号)
 321          ********************************************************************/
 322          static void Ack_I2c(BOOL a)
 323          {
 324   1         setSDAout();
 325   1        if(a==0)
 326   1           ClearPinSDA();     /*在此发出应答或非应答信号 */
 327   1        else
 328   1           WritePinSDA();
 329   1        Delay_0_5us(3);
 330   1      
 331   1        WritePinSCL();
 332   1        Delay_0_5us(10);
 333   1                                       /*时钟低电平周期大于4μs*/
 334   1        ClearPinSCL();                /*清时钟线,钳住I2C总线以便继续接收*/
 335   1        Delay_0_5us(2);
 336   1      }
 337          
 338          
 339          
 340          /*******************************************************************
 341                              向有子地址器件发送多字节数据函数
 342          函数原型: BOOL  I2c_SendStr(BYTE sla,BYTE *s,WORD no);
 343          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 344                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 345                     如果返回1表示操作成功,否则操作有误。
 346          注意:    使用前必须已结束总线。
 347          ********************************************************************/
 348          BYTE I2c_SendStr(BYTE sla,BYTE *s,WORD no)
 349          {
 350   1         BYTE i;
 351   1         BOOL ack;
 352   1      
 353   1         #if COMENINT==1
                 vDisableIsrs();//add
                 #endif
 356   1         Start_I2c();               /*启动总线*/
 357   1         sla = sla;// << 1;
 358   1         ack = I2cSendByte(sla);            /*发送器件地址*/
 359   1         if(ack==0)
 360   1          {
 361   2                    Stop_I2c();
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 7   

 362   2                      #if COMENINT==1
                             vEnableIsrs();//add
                          #endif
 365   2                    return 0xff;    //slave ack not exist
 366   2           }
 367   1      
 368   1          for(i=0;i<no;i++)
 369   1          {
 370   2           ack=I2cSendByte(*s);               /*发送数据*/
 371   2        /*    if(ack==0)
 372   2           {
 373   2                  Stop_I2c();
 374   2                      #if COMENINT==1
 375   2                     vEnableIsrs();//add
 376   2                      #endif
 377   2                   return(i+1);    //error byte index
 378   2            }     */
 379   2           s++;
 380   2          }
 381   1       Stop_I2c();                 /*结束总线*/
 382   1       #if COMENINT==1
               vEnableIsrs();//add
               #endif
 385   1        return(0);
 386   1      }
 387          
 388          
 389          /*******************************************************************
 390                              向有子地址器件读取多字节数据函数
 391          函数原型: BOOL  I2c_RcvStr(BYTE sla,BYTE *s,WORD Len);
 392          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 393                    地址sla,子地址suba,读出的内容放入s指向的存储区,读Len个字节。
 394                     如果返回1表示操作成功,否则操作有误。
 395          注意:    使用前必须已结束总线。
 396          ********************************************************************/
 397          BYTE I2c_RcvStr(BYTE sla,BYTE *s,WORD Len)
 398          {
 399   1         WORD i;
 400   1         BOOL ack;
 401   1      
 402   1         #if COMENINT==1
                 vDisableIsrs();//add
                 #endif
 405   1         Start_I2c();               /*启动总线*/
 406   1         sla=sla+1;
 407   1         ack=I2cSendByte(sla);
 408   1         if(ack==0)                //slave ack not exist
 409   1         {
 410   2                   Stop_I2c();
 411   2                    #if COMENINT==1
                            vEnableIsrs();//add
                            #endif
 414   2                   return(0xff);
 415   2         }
 416   1      
 417   1      
 418   1         for(i=0;i<Len-1;i++)
 419   1         {
 420   2           *s=I2cRcvByte();            /*读取数据*/
 421   2            Ack_I2c(0);                /*发送就答位*/
 422   2            s++;
 423   2         }
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 8   

 424   1         *s=I2cRcvByte();
 425   1          Ack_I2c(1);                 /*发送非应位*/
 426   1          Stop_I2c();                    /*结束总线*/
 427   1      
 428   1      #if COMENINT==1
                 vEnableIsrs();//add
                  #endif
 431   1        return(0);
 432   1      }
 433          
 434          #elif (IIC_USED==0 )//!SW_IIC   both SW_IIC and HW_IIC are not needed, define dummy functions
              BYTE  BusSlvAdr=0x62;     //default I2c bus slave address for communiction
              void I2c_Init( )
              {
              }
              void I2c_Sel( BYTE  SlvAdr,BOOL isHigh)
              {
              }
              
              BYTE I2c_SendStr(BYTE sla,BYTE *s,WORD no)
              {
              }
              BYTE I2c_RcvStr(BYTE sla,BYTE *s,WORD no)
              {
              }
              #endif  //SW_IIC


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    586    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =      2      15
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -