单片机学习小组
直播中

李佳

7年用户 194经验值
私信 关注

请问有人用汇编写过i2c吗?

请问有人用汇编写过i2c吗?分享一下呗 自己写的调了一晚上不能用

回帖(6)

潘福乔

2019-8-26 08:30:53
15年前都用汇编,
可惜找不到了。
举报

徐伟

2019-8-26 08:38:35
谢谢 感觉汇编调起来 比c难多了
举报

张波

2019-8-26 08:46:54
当然啦
所以为什么要找汇编代码?
放着计算器不用,自己手工做四则运算?
现在没有哪个芯片不支持C语言。
举报

周振夜

2019-8-26 08:55:42
/*******************************************************************************
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   
/*******************************************************************************/
举报

更多回帖

发帖
×
20
完善资料,
赚取积分