新手入门 
 
	- 积分
 - 19
 
        - 金钱
 - 19 
 
       - 注册时间
 - 2016-8-16
 
      - 在线时间
 - 4 小时
 
 
 
 | 
 
 
发表于 2016-12-13 17:39:30
|
显示全部楼层
 
 
 
/******************************************************************************* 
24c02写,三级堆栈深度 ,I2cData equ  30h;  I2cr1 equ  31h ;I2c_mode_zhi equ  32h; 
SCLpb,0  SDA   pb,1 
*******************************************************************************/   
At24c02Write:                  
             call  I2CStart 
             movia a0h 
             movar I2c_mode_zhi        
             call  I2cSendByte//写器件地址 
             call  IIC_Wait_Ack //等待应答  
              
             movia 00h 
             movar I2c_mode_zhi        
             call  I2cSendByte //写内存地址 
             call  IIC_Wait_Ack //等待应答  
              
             movia 50h 
             movar I2c_mode_zhi                
             call  I2cSendByte//写数据地址 
             call  IIC_Wait_Ack //等待应答  
              
             call  I2CStop  
             return             
/******************************************************************************* 
24c02读,三极堆栈深度  
*******************************************************************************/                      
At24c02Read:  
              
             call  I2CStart                            
             movia a0h 
             movar I2c_mode_zhi  
             call  I2cSendByte//写器件地址 
             call  IIC_Wait_Ack //等待应答  
              
             movia 00h 
             movar I2c_mode_zhi       
             call  I2cSendByte //写内存地址 
             call  IIC_Wait_Ack //等待应答  
              
             call  I2CStart       
             movia a1h 
             movar I2c_mode_zhi               
             call  I2cSendByte //写内存地址 
             call  IIC_Wait_Ack //等待应答  
              
             clrr  I2c_mode_zhi //先清除数据   
             call  I2cReadByte //不产生应答,产生应答为连续读,NaCK  
              
             call  I2CStop 
             return 
/******************************************************************************* 
I2c读取信号,?詈螅琒CL=0,SDA=1 
*******************************************************************************/                
I2cReadByte:   
 
              movia 00000010B   //已经初始化化的io口状态 
              xoria 00000000B 
              iost  pb                     
               
              clrr  I2cr1        //清楚计数器 
               
RECEVEBloop:  BCR   SCL 
              CALL  NOPsix 
              BSR   SCL                                   
              call  NOPsix                              
              RLR   I2c_mode_zhi,1 
              BTRSS sda 
              GOTO  BCRDataB_RECEVER      
              BSR   I2c_mode_zhi,0        
              GOTO  RECEVEBloop3 
RECEVEBloop3:  
              INCR  I2cr1,1                        
              CALL  NOPsix  
              XORARc 08H,I2cr1,RECEVEBloop 
              CALL  IIC_NAck    //默认情况不发送应答,只有连续接受的时候发生应答 
              RETURN        //接收结束 
                                                                                                                     
BCRDataB_RECEVER:                            
              bcr   I2c_mode_zhi,0 
              goto  RECEVEBloop3             
/******************************************************************************* 
I2c发送信号,高电平期间信号保持稳定,发送完成一个字节再发送一位,最后,SCL=0,SDA=1 
*******************************************************************************/                           
I2cSendByte:  
              movr  I2c_mode_zhi,0 //要被写入的数据        
              movar I2cData  //要被发送出去的数据 
              clrr  I2cr1    //位记数据器 
               
              movia 00000000B   //已经初始化化的io口状态 
              xoria 00000000B  
              iost  pb 
               
SendBloop:    BTRSS I2cData,7    //判断最高位是1还是0 
              GOTO  BCRDataB           
              bsr   sda 
              goto  SendBloop3  
SendBloop3:   RLR   I2cData,1    
              INCR  I2cr1,1        
              CALL  NOPsix          
              BSR   SCL        
              CALL  NOPsix 
              BCR   SCL  
              CALL  NOPsix 
              XORARc 08H,I2cr1,SendBloop  
              RETURN                            
BCRDataB:     bcr   SDA                           
              goto  SendBloop3       
/******************************************************************************* 
I2c开始信号,开始信号结束后SCL和sda都为0,设置scl和sda都为输出 
*******************************************************************************/   
I2CStart:                                    
              movia 00000000B   //已经初始化化的io口状态 
              xoria 00000000B  
              iost  pb                                                        
              movia 00000000B                         
              movar phcon      //全部设置为上拉            
               
              BSR   SDA // 
              call  NOPsix //6us保持时间  
              BSR   SCL //     
              call  NOPsix //6us保持时间                   
              BCR   SDA    // 
              call  NOPsix //6us保持时间 
              bcr   SCL     //把scl拉低因为电平只有在低电平能变化 
              return 
/******************************************************************************* 
I2c结束信号,开始信号结束后SCL和sda都为1,表示总线空闲 
*******************************************************************************/                   
I2CStop: 
              movia 00000000B   //已经初始化化的io口状态 
              xoria 00000000B  
              iost  pb                                                        
              movia 00000000B                         
              movar phcon      //全部设置为上拉     
 
              BCR   sda 
              nop 
              BSR   SCL 
              nop  
              BSR   SDA      
              call  NOPsix //6us,SDA 在高电平跳变 
              RETURN 
/******************************************************************************* 
I2c wait_ACK,SDA被拉低表示接收成功           
*******************************************************************************/                   
IIC_Wait_Ack: 
              movia 00000010B   //已经初始化化的io口状态 
              xoria 00000000B  
              iost  pb 
              bsr   sda 
              call  NOPsix         
              bsr   scl 
IIC_Wait_fail:call  NOPsix 
              incr  I2cr1,1 
              xorars ffh,I2c_mode_zhi,I2CStop //超过时间结束,设置为ff 
              btrsc sda 
              goto  IIC_Wait_fail 
              nop 
              nop 
              nop 
              bcr   scl //拉低时钟 
              RETURN   
/******************************************************************************* 
I2c_ACK,产生应答 
*******************************************************************************/                   
IIC_Ack: 
              movia 00000000B   //已经初始化化的io口状态 
              xoria 00000000B  
              iost  pb                                                        
               
              BCR   scl 
              nop 
              bcr   sda 
              nop 
              nop   
              nop  
              nop 
              bsr   scl 
              nop 
              nop   
              nop  
              nop 
              Bcr   scl      
              RETURN  
/******************************************************************************* 
I2c_nACK,不产生应答 
*******************************************************************************/                   
IIC_NAck: 
              movia 00000000B   //已经初始化化的io口状态 
              xoria 00000000B  
              iost  pb                                                        
               
              BCR   scl 
              nop 
              bsr   sda 
              nop 
              nop   
              nop  
              nop 
              bsr   scl 
              nop 
              nop   
              nop  
              nop   
              Bcr   scl           
              RETURN      
/******************************************************************************* 
I2c信号保持时间,6*1us=6us 
*******************************************************************************/  
NOPsix:       nop                    
              nop 
              nop 
              nop 
              nop 
              nop     
              return    
/*******************************************************************************/  |   
 
 
 
 |