共2条
1/1 1 跳转至页
EMC,IIC,EEPROM 高手帮我看一下EMC单片机模拟IIC读写EEPROM
问
各位大侠帮我看一下,下面这个程序, 模拟IIC读写EEPROM 。我严格按照时序写的啊,可总检测不到应答位啊。
高手帮帮忙看一下啊!
/*存储器定义*/
SCL == 6
SDA == 7
COUNT == 0X22 ;发送的位数
DBUF == 0X23 ;发送接收数据缓冲
;----------------------------
/*宏定义*/
/*设置P76(SCL) P77(SDA)为输出口,P76内部上拉*/
SET_I2COUT MACRO
BC 0X03,5 ;选IOC PAGE0
MOV A,@0X00 ;P76 P77为输出口? IOW 0X07
BS 0X03,5 ;选IOC PAGE1
MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
ENDM
/*------------------------------------------*/
/*设置P76(SCL) 为输出口 P77(SDA)为输入口,P76内部上拉*/
SET_I2CIN MACRO
BC 0X03,5 ;选IOC PAGE0
MOV A,@0X80 ;P76 为输出 P77为输 IOW 0X07
BS 0X03,5 ;选IOC PAGE1
MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
ENDM
/*------------------------------------------*/
MAIN:
MOV A,@0B01011000 ;设定工作时钟 3.582MHz
MOV 0X0A,A
BC 0X03,0
WRITE: CALL BSTART
MOV A,@0B10100000
MOV DBUF,A
CALL TX8BIT
CALL CACK ;检测应答信号
JBC 0X03,0
JMP WRITE
MOV A,@0X00 ;数据存入存储器的地址
MOV DBUF,A
CALL TX8BIT
CALL CACK
MOV A,@0B01010101 ;数据
MOV DBUF,A
CALL TX8BIT
CALL CACK
CALL BSTOP
NOP
JMP $
READ: CALL BSTART
MOV A,@0B10100000 ;送控制字节
MOV DBUF,A
CALL TX8BIT
CALL CACK
JBC 0X03,0
JMP READ ;没收到确定信号继续发送
MOV A,@0X00
MOV DBUF,A
CALL TX8BIT
CALL CACK
READDA:
CALL BSTART
MOV A,@0B10100001
MOV DBUF,A
CALL TX8BIT
CALL CACK
CALL RX8BIT
CALL TACK
CALL BSTOP
JMP $
/*----------子程序--------------------------*/
/*发送起始位程序 BSTART*/
;说明: 当SCL=1时,向SDA发一个下降沿
/*------------------------------------------*/
BSTART:
SET_I2COUT ;SET I2C AS OUTPUT
BS 0X07,SDA ;P77=1
NOP ;延时0.6US
NOP
BS 0X07,SCL ;P66=1
NOP ;延时0.6US
NOP
BC 0X07,SDA ;P77=0
NOP ;延时0.6US
NOP
BC 0X07,SCL ;P66=0
NOP ;延时0.6US
RET
/*END BSTART---------------------------------*/
/*发送结束位子程序BSTOP*/
;说明: SCL = 1向SDA发一个上升沿
/*------------------------------------------*/
BSTOP:
SET_I2COUT
BC 0X07,SDA
NOP
NOP
BS 0X07,SCL
NOP
NOP
BS 0X07,SDA
NOP
RET
/*END BSTOP*/
/*------------------------------------------*/
/*接收应答信号*/
;入口:无
;出口:C 应答信号,接收OK,C=0,否则C=1
CACK:
SET_I2CIN
NOP
NOP
BS 0X07,SCL
NOP
NOP
NOP
NOP
JBC 0X07,SDA ;检测应答信号
BS 0X03,0
JBS 0X07,SDA
BC 0X03,0
NOP
NOP
BC 0X07,SCL
RET
/*------------------------------------------*/
/*发送应答信号*/
;入口:无
;出口:无
TACK:
SET_I2COUT
BC 0X07,SDA
NOP
NOP
BC 0X07,SCL
NOP
NOP
BS 0X07,SDA
NOP
NOP
NOP
NOP
BC 0X07,SCL
RET
/*发送8位子程序*/
;入口:DBUF 要发送的8位
;出口:无
TX8BIT:
SET_I2COUT
MOV A,@8
MOV COUNT,A
TXLP:
RLC DBUF
JBS 0X03,0
BC 0X07,SDA
JBC 0X03,0
BS 0X07,SDA
NOP
NOP
BS 0X07,SCL
NOP
NOP
NOP
BC 0X07,SCL
DJZ COUNT
JMP TXLP
RET
/*END TX8BIT*/
/*------------------------------------------*/
/*接收8位子程序*/
;入口:无
;出口:DBUF 接收到的8位数据
RX8BIT:
SET_I2CIN
MOV A,@8
MOV COUNT,A
CLR DBUF
RXLP:
BS 0X07,SCL
NOP
NOP
NOP
JBC 0X07,SDA
BS 0X03,0
JBS 0X07,SDA
BC 0X03,0
NOP
NOP
RLC DBUF
NOP
NOP
BC 0X07,SCL
DJZ COUNT
JMP RXLP
RET
/*END RX8BIT*/
/*------------------------------------------*/ 答 1: 互相学习我好像没看到你对上拉寄存器操作过,还有一点,就是SDA线一定要上拉,否则检测不到应答信号的。 答 2: 回复MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
有啊,我两个口都有上拉啊· 答 3: 互相学习IOW 0X07 这条语句的作用不是说上拉,,是把 76 77 口置为输入。
上拉控制寄存器上 iocd
多查查资料 答 4: 互相学习我用的单片机是78568的,它的IOC 有两页啊,PAGE1就是用来设上拉的。
BS 0X03,5 ;选IOC PAGE1
MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
答 5: 成功小弟经过一天的调试终于成功了!我以上的程序没有错,原因在于编译过程,有一句没有编译啊(IOW 0X07)。我没整得没办法,就去看一下list 文件才发现的。
以上程序大家可以放心用啊!
高手帮帮忙看一下啊!
/*存储器定义*/
SCL == 6
SDA == 7
COUNT == 0X22 ;发送的位数
DBUF == 0X23 ;发送接收数据缓冲
;----------------------------
/*宏定义*/
/*设置P76(SCL) P77(SDA)为输出口,P76内部上拉*/
SET_I2COUT MACRO
BC 0X03,5 ;选IOC PAGE0
MOV A,@0X00 ;P76 P77为输出口? IOW 0X07
BS 0X03,5 ;选IOC PAGE1
MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
ENDM
/*------------------------------------------*/
/*设置P76(SCL) 为输出口 P77(SDA)为输入口,P76内部上拉*/
SET_I2CIN MACRO
BC 0X03,5 ;选IOC PAGE0
MOV A,@0X80 ;P76 为输出 P77为输 IOW 0X07
BS 0X03,5 ;选IOC PAGE1
MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
ENDM
/*------------------------------------------*/
MAIN:
MOV A,@0B01011000 ;设定工作时钟 3.582MHz
MOV 0X0A,A
BC 0X03,0
WRITE: CALL BSTART
MOV A,@0B10100000
MOV DBUF,A
CALL TX8BIT
CALL CACK ;检测应答信号
JBC 0X03,0
JMP WRITE
MOV A,@0X00 ;数据存入存储器的地址
MOV DBUF,A
CALL TX8BIT
CALL CACK
MOV A,@0B01010101 ;数据
MOV DBUF,A
CALL TX8BIT
CALL CACK
CALL BSTOP
NOP
JMP $
READ: CALL BSTART
MOV A,@0B10100000 ;送控制字节
MOV DBUF,A
CALL TX8BIT
CALL CACK
JBC 0X03,0
JMP READ ;没收到确定信号继续发送
MOV A,@0X00
MOV DBUF,A
CALL TX8BIT
CALL CACK
READDA:
CALL BSTART
MOV A,@0B10100001
MOV DBUF,A
CALL TX8BIT
CALL CACK
CALL RX8BIT
CALL TACK
CALL BSTOP
JMP $
/*----------子程序--------------------------*/
/*发送起始位程序 BSTART*/
;说明: 当SCL=1时,向SDA发一个下降沿
/*------------------------------------------*/
BSTART:
SET_I2COUT ;SET I2C AS OUTPUT
BS 0X07,SDA ;P77=1
NOP ;延时0.6US
NOP
BS 0X07,SCL ;P66=1
NOP ;延时0.6US
NOP
BC 0X07,SDA ;P77=0
NOP ;延时0.6US
NOP
BC 0X07,SCL ;P66=0
NOP ;延时0.6US
RET
/*END BSTART---------------------------------*/
/*发送结束位子程序BSTOP*/
;说明: SCL = 1向SDA发一个上升沿
/*------------------------------------------*/
BSTOP:
SET_I2COUT
BC 0X07,SDA
NOP
NOP
BS 0X07,SCL
NOP
NOP
BS 0X07,SDA
NOP
RET
/*END BSTOP*/
/*------------------------------------------*/
/*接收应答信号*/
;入口:无
;出口:C 应答信号,接收OK,C=0,否则C=1
CACK:
SET_I2CIN
NOP
NOP
BS 0X07,SCL
NOP
NOP
NOP
NOP
JBC 0X07,SDA ;检测应答信号
BS 0X03,0
JBS 0X07,SDA
BC 0X03,0
NOP
NOP
BC 0X07,SCL
RET
/*------------------------------------------*/
/*发送应答信号*/
;入口:无
;出口:无
TACK:
SET_I2COUT
BC 0X07,SDA
NOP
NOP
BC 0X07,SCL
NOP
NOP
BS 0X07,SDA
NOP
NOP
NOP
NOP
BC 0X07,SCL
RET
/*发送8位子程序*/
;入口:DBUF 要发送的8位
;出口:无
TX8BIT:
SET_I2COUT
MOV A,@8
MOV COUNT,A
TXLP:
RLC DBUF
JBS 0X03,0
BC 0X07,SDA
JBC 0X03,0
BS 0X07,SDA
NOP
NOP
BS 0X07,SCL
NOP
NOP
NOP
BC 0X07,SCL
DJZ COUNT
JMP TXLP
RET
/*END TX8BIT*/
/*------------------------------------------*/
/*接收8位子程序*/
;入口:无
;出口:DBUF 接收到的8位数据
RX8BIT:
SET_I2CIN
MOV A,@8
MOV COUNT,A
CLR DBUF
RXLP:
BS 0X07,SCL
NOP
NOP
NOP
JBC 0X07,SDA
BS 0X03,0
JBS 0X07,SDA
BC 0X03,0
NOP
NOP
RLC DBUF
NOP
NOP
BC 0X07,SCL
DJZ COUNT
JMP RXLP
RET
/*END RX8BIT*/
/*------------------------------------------*/ 答 1: 互相学习我好像没看到你对上拉寄存器操作过,还有一点,就是SDA线一定要上拉,否则检测不到应答信号的。 答 2: 回复MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
有啊,我两个口都有上拉啊· 答 3: 互相学习IOW 0X07 这条语句的作用不是说上拉,,是把 76 77 口置为输入。
上拉控制寄存器上 iocd
多查查资料 答 4: 互相学习我用的单片机是78568的,它的IOC 有两页啊,PAGE1就是用来设上拉的。
BS 0X03,5 ;选IOC PAGE1
MOV A,@0B11000000
IOW 0X07 ;设P76内部上拉
答 5: 成功小弟经过一天的调试终于成功了!我以上的程序没有错,原因在于编译过程,有一句没有编译啊(IOW 0X07)。我没整得没办法,就去看一下list 文件才发现的。
以上程序大家可以放心用啊!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |