完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
|
|
谢谢 感觉汇编调起来 比c难多了
|
|
|
|
|
|
|
|
/*******************************************************************************
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 /*******************************************************************************/ |
|
|
|
你用的是什么芯片?
|
|
|
|
网上有例程的
|
|
|
|
只有小组成员才能发言,加入小组>>
3320 浏览 9 评论
2998 浏览 16 评论
3496 浏览 1 评论
9066 浏览 16 评论
4089 浏览 18 评论
1186浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
602浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 13:29 , Processed in 1.502809 second(s), Total 88, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号