这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » EMC,IIC,EEPROM 高手帮我看一下EMC单片机模拟IIC读写EEPRO

共2条 1/1 1 跳转至

EMC,IIC,EEPROM 高手帮我看一下EMC单片机模拟IIC读写EEPROM

院士
2006-09-17 18:14:16     打赏
EMC,IIC,EEPROM 高手帮我看一下EMC单片机模拟IIC读写EEPROM



关键词: EEPROM     高手     帮我     看一下     单片机     模拟         

院士
2006-12-22 22:43:00     打赏
2楼
问 各位大侠帮我看一下,下面这个程序, 模拟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 文件才发现的。
以上程序大家可以放心用啊!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]