OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4609|回复: 4

求汇编写的IIC程序。

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-11-15
在线时间
7 小时
发表于 2016-11-30 01:44:57 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 xuande 于 2016-11-30 08:45 编辑

请问有人用汇编写过i2c吗?分享一下呗 自己写的调了一晚上不能用
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11461
金钱
11461
注册时间
2014-4-1
在线时间
1294 小时
发表于 2016-11-30 08:46:08 | 显示全部楼层

15年前都用汇编,
可惜找不到了。


回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-11-15
在线时间
7 小时
 楼主| 发表于 2016-11-30 09:45:44 来自手机 | 显示全部楼层
xuande 发表于 2016-11-30 08:46
15年前都用汇编,
可惜找不到了。

谢谢 感觉汇编调起来 比c难多了
回复 支持 反对

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11461
金钱
11461
注册时间
2014-4-1
在线时间
1294 小时
发表于 2016-11-30 11:31:11 | 显示全部楼层
本帖最后由 xuande 于 2016-11-30 11:32 编辑
超频CPU 发表于 2016-11-30 09:45
谢谢 感觉汇编调起来 比c难多了



当然啦

所以为什么要找汇编代码?
放着计算器不用,自己手工做四则运算?
现在没有哪个芯片不支持C语言。

回复 支持 反对

使用道具 举报

5

主题

8

帖子

0

精华

新手入门

积分
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   
/*******************************************************************************/
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 16:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表