No.100770 作者:yi11111 邮件:yi11111@sina.com ID:65639 登陆:1次 文章数:3篇 最后登陆IP:219.237.144.163 最后登陆:2006/12/19 16:22:42 注册:2006/12/19 9:59:39 财富:109 发帖时间:2006/12/19 10:09:24 发贴者IP:219.237.144.163 标题:yi11111:2407与FM24cl16程序问题(今天在线等。。。)^_^ 摘要:No.1007702407与FM24cl16程序问题(今天在线等。。。)^_^ 这个是我写的2407和铁电存储器FM24CL26的接口程序 我是DSP.XF ——SDA DSP.IOPB5—— SCL WP接地,你说那么简单的一个程序,就是把数据往总线上丢,我怎么都弄不出来呢 用示波器看波形,发现在2407发送数据给铁电时,可以发送A0H,00H,和存放在310H的数据,铁电都给应答,但是到发送311H数据时,铁电就不给应答了 然后读程序时,每次读出来的均为FFH,都不知道哪里错了? 恳请哪位了解该程序的人士能与我一起讨论一下 万分感谢! QQ:15074535 特把程序粘下面,如调试出来,和大家共享! .include "240x.h" .def _c_int0 .text ;-------------------主程序,将0310h开始的RAM的4个数据写入24cl的00h ;----------------------然后将00h的4个数据读出存放在0315h开始的RAM中 _c_int0 CALL SYSYINTEE CALL LOADDATA ;预先在制定区域写入需写入24CL的数据4个 MAR *,AR1 LAR AR1,#300H ;AR1指向堆栈 SPLK #310H,*+ ;待写数据存放空间的首地址 SPLK #00H,*+ ;24CL的块内地址字节 SPLK #0A0H,*+ ;控制字(R/W=0) SPLK #4H,* ;待写数据字节数 CALL EEPROM READ: ;读数据至24LC CALL SYSYINTEE LAR AR1,#305H ;AR1指向堆栈 SPLK #315H,*+ ;待读数据存放空间的首地址 SPLK #00H,*+ ;24CL的块内地址字节 SPLK #0A1H,*+ ;控制字(R/W=1) SPLK #4H,* ;待读数据字节数 CALL EEPROM BCND READ,NEQ LOOP: B LOOP ; 空循环 EEPROM: LDP #225 LAR AR0, *-, AR0 ; AR0:读写的字节数,AR1:指向控制字节 ; ARP= AR0 SBRK #1 MAR *, AR1 EEPROM1: CALL I2CStart ;设置I2C总线的开始状态 LACL *+ ;AR1:临时单元 AND #0FEH ;清楚控制字的第0位 SACL * CALL I2CSendByte ;送出控制字(R/W=0) CALL I2CRecAck ;检查应答位 BCND EEPROM2, EQ LACL #1 ;出错 B EEPROMRET EEPROM2: SBRK #2 ;AR1:24CL的块内地址低字节 ;(在此之前AR1指向临时单元,比控制字 ;adress多1) CALL I2CSendByte ; 送出24CL的块内地址字节 CALL I2CRecAck ; 检查应答位 BCND EEPROM3, EQ LACL #1 ; 出错 B EEPROMRET EEPROM3: ADRK #1 ;AR1控制字节 BIT *, 15 ;读、写操作判断 BCND EEPROM4, TC SBRK #2 LAR AR1, * ;AR1:输出数据缓冲区 EEPROM31: CALL I2CSendByte ;写出一个字节数据 CALL I2CRecAck ; 检查应答位 BCND EEPROM30, EQ LACL #1 ; 出错 B EEPROMRET EEPROM30: ADRK #1 ;指向下一个字节待写数据 MAR *,AR0 BANZ EEPROM31,AR1 B EEPROM5 EEPROM4: ;读操作 CALL I2CStart ;设置I2C总线开始状态 CALL I2CSendByte ;送出控制字(R/W=1) CALL I2CRecAck ; 检查应答位 BCND EEPROM40, EQ LACL #1 ; 出错 B EEPROMRET EEPROM40: SBRK #2 LAR AR1,*,AR0 ;AR1:输入数据缓冲区 EEPROM43: BANZ EEPROM41, AR1 B EEPROM42 EEPROM41: CALL I2CRecByte ;接受一个字节数据 CALL I2CAck ;产生应答信号 MAR *, AR0 B EEPROM43 EEPROM42: CALL I2CRecByte ;接受最后一个字节数据 CALL I2CNoAck ;产生应答信号 EEPROM5: CALL I2CStop ;设置结束状态 LACL #0 ;成功标志ACC=0 EEPROMRET: RET ;返回 ;--------------启动I2C总线―――――――――――――――― I2CStart: CLRC XF ;SCL=0 SBIT1 PBDATDIR, B12_MSK ;设置IOPB4为输出 口 SBIT1 PBDATDIR, B4_MSK ;SDA=1 SETC XF ......
>>返回讨论的主题
|