PIC单片机

单片机

PIC单片机 PIC单片机自学 PIC单片机编程 PIC单片机教材下载 PIC单片机学习源程序 PIC单片机仿真器|PIC单片机编程器 PIC单片机编程器实验板定价 PIC单片机学习开发板购买方式 PIC单片机学习论坛
PIC单片机】主题文章: 回复文章:^c^PIC单片机通讯E2PROM^*^
发信人:hnhkj 发表时间:2001-12-03 20:29:25

有哪位大虾熟悉PIC单片机通讯E2PROM的方法,请不吝赐教。


PIC单片机 www.pic16.com

 回复文章:帮忙查错
发信人:hnhkj 发表时间:2001-12-04 10:47:59

;=======================================        
;PIC16C74B单片机与AT24C64通讯
;该程序实现的功能是:
;将I2C_A,I2C_B.....I2C_K内容写入EEPROM中
;同时在EEPROM中读出数据从新写入各个寄存器
;=======================================
        LIST  P=16C74B
        #include<p16c74.inc>
        ERRORLEVEL  -302
I2C_A    EQU      0X20    
I2C_B    EQU      0X21
I2C_C    EQU      0X22
I2C_D    EQU      0X23
I2C_E    EQU      0X24
I2C_F    EQU      0X25
I2C_G    EQU      0X26    
REG1     EQU      0X2B
REG2     EQU      0X2C
COUNT    EQU      0X71            ;I2C
BCOUNT   EQU      0X72            ;I2C
TXBUF    EQU      0X73            ;I2C
RXBUF    EQU      0X74            ;I2C
BUSCON   EQU      0X75            ;I2C
BUSSTA   EQU      0X76            ;I2C
I2CBUF   EQU      0X77            ;I2C
SLAVEADDR        EQU    0XA0      ;I2C
DATAADDRH        EQU    0X01      ;I2C
DATAADDRL        EQU    0X00      ;I2C
;---------------------------------------    
;BUSCON
;---------------------------------------    
SLAVE_RW        EQU       7
LAST_BYTE_RX    EQU       6
SLAVE_ACTIVE    EQU       5
TIME_OUT        EQU       4
;---------------------------------------    
;BUSSTA
;---------------------------------------
BUS_BUSY          EQU       7
TX_PROGRESS       EQU       6
RX_PROGRESS       EQU       5
TX_SUCCESS        EQU       4
RX_SUCCESS        EQU       3
FATAL_ERROR       EQU       2    ;SLAVE EEPROM 
ABORT             EQU      1
ACK_ERROR         EQU       0
;---------------------------------------
R_NOT_W  EQU       0           
TRUE     EQU       1
FALSE    EQU       0
SDA      EQU     0X04            ;I2C
SCL      EQU     0X03            ;I2C
;=======================================
        ORG     0X00
        GOTO    START
        ORG     0X20
START   BCF     STATUS,RP1
        BCF     STATUS,RP0
        CLRF    RA
        CLRF    RB
        CLRF    RC
        CLRF    RD
        CLRF    RE      
        BSF     STATUS,RP0
        CLRF    TRISA
        CLRF    TRISB                      
        CLRF    TRISC
        CLRF    TRISD
        CLRF    TRISE
        MOVLW   0X02
        MOVWF   I2C_A
        MOVLW   0X04
        MOVWF   I2C_B
        MOVLW   0X03
        MOVWF   I2C_C
        MOVLW   0X03
        MOVWF   I2C_D
        MOVLW   0X05
        MOVWF   I2C_E
        MOVLW   0X06
        MOVWF   I2C_F
        MOVLW   0X04
        MOVWF   I2C_G
;=======================================        
START1  
        CALL   I2CBUS_INIT
        CALL   REGTOI2CBUF
        CALL   I2CWRITE
        CALL   CLRI2CBUF
        CALL   D10
        CALL   I2CREAD      
        CALL   I2CBUFTOREG
        GOTO   START1
;=======================================    
;CLRI2CBUF
;---------------------------------------
CLRI2CBUF
        BCF        STATUS,RP0
        MOVLW      I2CBUF
        MOVWF      FSR
        MOVLW      0X08
        MOVWF      COUNT
CLRLOOP CLRF       INDF
        INCF       FSR,F
        DECFSZ     COUNT,F
        GOTO       CLRLOOP
        RETURN
;---------------------------------------    
;将各个REGSTER数据写入 I2CBUF 缓冲区
;---------------------------------------
REGTOI2CBUF
        BCF        STATUS,RP0
        MOVLW      I2CBUF
        MOVWF      FSR
        MOVF       I2C_A,W
        MOVWF      INDF
        INCF       FSR,F
        MOVF       I2C_B,W
        MOVWF      INDF
        INCF       FSR,F
        MOVF       I2C_C,W
        MOVWF      INDF
        INCF       FSR,F
        MOVF       I2C_D,W
        MOVWF      INDF
        INCF       FSR,F
        MOVF       I2C_E,W
        MOVWF      INDF
        INCF       FSR,F
        MOVF       I2C_F,W
        MOVWF      INDF
        INCF       FSR,F
        MOVF       I2C_G,W
        MOVWF      INDF
        RETURN
;---------------------------------------
;将 I2CBUF 缓冲区数据写入各个REGSTER 
;---------------------------------------        
I2CBUFTOREG
        BCF        STATUS,RP0
        MOVLW      I2CBUF
        MOVWF      FSR
        MOVF       INDF,W
        MOVWF      I2C_A
        INCF       FSR,F
        MOVF       INDF,W
        MOVWF      I2C_B
        INCF       FSR,F
        MOVF       INDF,W
        MOVWF      I2C_C
        INCF       FSR,F
        MOVF       INDF,W
        MOVWF      I2C_D
        INCF       FSR,F
        MOVF       INDF,W
        MOVWF      I2C_E
        INCF       FSR,F
        MOVF       INDF,W
        MOVWF      I2C_F
        INCF       FSR,F
        MOVF       INDF,W
        MOVWF      I2C_G
        RETURN
;=======================================    
;将I2CBUF缓冲区内的数据写入EEPROM
;=======================================
I2CWRITE
        CALL       I2CSTART
        BTFSS      BUSSTA,BUS_BUSY
        GOTO       TX_FAIL
        BCF        BUSCON,SLAVE_RW
        CALL       TX_SLAVE_ADDR
        BTFSS      BUSSTA,TX_SUCCESS    ;SUCESSFULL?
        GOTO       TX_FAIL
        CALL       TX_DATA_ADDR
        BTFSS      BUSSTA,TX_SUCCESS
        GOTO       TX_FAIL
        MOVLW      I2CBUF
        MOVWF      FSR
        MOVLW      07
        MOVWF      COUNT
T_BYTE_LOOP
        MOVF       INDF,W
        MOVWF      TXBUF
        CALL       I2CTXB
        BTFSS      BUSSTA,TX_SUCCESS
        GOTO       TX_FAIL
        INCF       FSR,F
        DECFSZ     COUNT,F
        GOTO       T_BYTE_LOOP
        GOTO       TX_PASS
TX_FAIL CALL       I2CSTOP
        BCF        BUSSTA,TX_PROGRESS
        BCF        BUSSTA,TX_SUCCESS
        RETLW      FALSE
TX_PASS
        CALL       I2CSTOP
        BCF        BUSSTA,TX_PROGRESS
        RETLW      TRUE
;---------------------------------------            
;从 EEPROM 中读出数据到 I2CBUF 寄存器
;---------------------------------------
I2CREAD BCF        STATUS,RP0
        BCF        BUSSTA,RX_SUCCESS
        CALL       I2CSTART
        BTFSS      BUSSTA,BUS_BUSY
        GOTO       RX_FAIL
        BCF        BUSCON,SLAVE_RW
        CALL       TX_SLAVE_ADDR
        BTFSS      BUSSTA,TX_SUCCESS   
        GOTO       RX_FAIL
        CALL       TX_DATA_ADDR
        BTFSS      BUSSTA,TX_SUCCESS
        GOTO       RX_FAIL
        CALL       I2CSTART
        BSF        BUSCON,SLAVE_RW
        CALL       TX_SLAVE_ADDR
        BTFSS      BUSSTA,TX_SUCCESS 
        GOTO       RX_FAIL
        BCF        BUSSTA,LAST_BYTE_RX
        MOVLW      I2CBUF
        MOVWF      FSR
        MOVLW      07
        MOVWF      COUNT 
R_BYTE_LOOP
        MOVLW      0X01
        XORWF      COUNT,W
        BTFSC      STATUS,Z
        BSF        BUSSTA,LAST_BYTE_RX
        CALL       I2CRXB
        BTFSS      BUSSTA,RX_SUCCESS
        GOTO       RX_FAIL
        MOVF       RXBUF,W     
        MOVWF      INDF
        INCF       FSR,F
        DECFSZ  COUNT,F
        GOTO       R_BYTE_LOOP 
        GOTO       RX_PASS
RX_FAIL CALL       I2CSTOP
        BCF        BUSSTA,RX_PROGRESS
        BCF        BUSSTA,RX_SUCCESS
        RETLW      FALSE  
RX_PASS CALL       I2CSTOP
           BCF        STATUS,RP0
        BCF        BUSSTA,TX_PROGRESS
        BCF        BUSSTA,RX_PROGRESS
        BSF        BUSSTA,RX_SUCCESS
        RETLW      TRUE
;=======================================        
; I2C 初始化
;=======================================
I2CBUS_INIT
        BCF        STATUS,RP0
        MOVF       RC,W
        ANDLW      0X18
        MOVWF      RC
        CLRF       BUSSTA
        CLRF       BUSCON
        RETURN         
;=======================================    
; 传送设备地址
;入口:  BUSCON
;出口:  BUSSTA
;=======================================
TX_SLAVE_ADDR
        BCF        STATUS,RP0
        BCF        BUSSTA,ACK_ERROR
        MOVLW      SLAVEADDR
        MOVWF      TXBUF
        BTFSC      BUSCON,SLAVE_RW
        BSF       TXBUF,R_NOT_W
        CALL       I2CTXB           
        BTFSC      BUSSTA,TX_SUCCESS 
        GOTO       TXADDR_SUCCESS
        CLRWDT
        BTFSS      BUSSTA,ACK_ERROR
        CALL       I2CSTOP
        GOTO       TXADDR_END
TXADDR_SUCCESS
        CLRWDT
TXADDR_END
        RETURN
;=======================================    
;TX_DATA_ADDR   发送写/读的地址
;=======================================
TX_DATA_ADDR
        BCF        STATUS,RP0
        MOVLW      DATAADDRH
        MOVWF      TXBUF
        CALL       I2CTXB
        BCF        STATUS,RP0
        BTFSS      BUSSTA,TX_SUCCESS
        GOTO       TX_DATA_ADDR_ERROR
        MOVLW      DATAADDRL
        MOVWF      TXBUF
        CALL       I2CTXB
        BCF        STATUS,RP0
        BTFSS      BUSSTA,TX_SUCCESS
        GOTO       TX_DATA_ADDR_ERROR
        GOTO       TX_DATA_END
TX_DATA_ADDR_ERROR
        BCF        BUSSTA,TX_PROGRESS
        BCF        BUSSTA,TX_SUCCESS
        BSF        BUSSTA,ACK_ERROR
TX_DATA_END
        RETURN
;=======================================    
;向 EEPROM 输出一个8位数据,并检测EEPROM的ACK信号
;入口:  TXBUF  寄存器
;       BUSSTA 寄存器
;出口:  EEPROM 存储器
;       BUSSTA 寄存器
 ;======================================    
I2CTXB  BCF        STATUS,RP0
        BSF        BUSSTA,TX_PROGRESS
        BCF        BUSSTA,TX_SUCCESS
        MOVLW      0X08
        MOVWF      BCOUNT
TXLOOP  CLRWDT                
        BSF        STATUS,RP0     
        BCF        TRISC,SCL 
        NOP    
        BCF        TRISC,SDA     
        BCF        STATUS,RP0    
        RLF        TXBUF,F       
        BSF        STATUS,RP0
        BTFSC      STATUS,C
        BSF        TRISC,SDA
        NOP
        BSF        TRISC,SCL
        NOP
        NOP
        BCF        STATUS,RP0
        DECFSZ     BCOUNT,F
        GOTO       TXLOOP
;---------------------------------------
;检测是EEPROM否有ACK信号产生,产生为正常
;检测方法:
;   1. 将RC口的SCL.SDA分别设置为输出和输入状态
;   2. 延时2个指令周期,将SCL设置为高电平
;   3. 延时2个指令周期,检测RC口SDA的状态
;   4. 如果为高电平,设置错误状态,返回
;   5. 如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行
;---------------------------------------
        BSF        STATUS,RP0
        BCF        TRISC,SCL
        BSF        TRISC,SDA
        NOP
        NOP
        BSF        TRISC,SCL
        NOP
        BCF        STATUS,RP0
        BTFSC      RC,SDA
        GOTO       TX_ERR
        BSF        STATUS,RP0
        BCF        TRISC,SCL
        BCF        STATUS,RP0
        BCF        BUSSTA,TX_PROGRESS
        BSF        BUSSTA,TX_SUCCESS
        BCF        BUSSTA,ACK_ERROR
        GOTO       TX_END
TX_ERR  BCF        BUSSTA,TX_PROGRESS
        BCF        BUSSTA,TX_SUCCESS
        BSF        BUSSTA,ACK_ERROR
TX_END  RETURN
;=======================================
;从EEPROM中读出 8 位的数据,并发送发送ACK信号
;入口:  EEPROM  存储器
;       BUSCON  寄存器
;出口:  RXBUF   寄存器
;       BUSSTA  寄存器
;=======================================
I2CRXB  BCF        STATUS,RP0
        BSF        BUSSTA,RX_PROGRESS
        BCF        BUSSTA,RX_SUCCESS
        MOVLW      0X08
        MOVWF      BCOUNT
RXLOOP  CLRWDT
        BSF        STATUS,RP0
        BCF        TRISC,SCL          ;定义TRISC<SCL>为输出
        BSF        TRISC,SDA          ;定义TRISC<SDA>为输入       
        NOP              
        NOP
        BSF        TRISC,SCL          ;TRISC<SCL>输出高电平
        NOP
        BCF        STATUS,RP0
        BCF        STATUS,C
        BTFSC      RC,SDA             ;原指令为BTFSC TRISC,SDA
        BSF        STATUS,C
        RLF        RXBUF,F
        DECFSZ     BCOUNT,F
        GOTO       RXLOOP
;---------------------------------------
;发送ACK信号到EEPROM
;判断接收的是否为最后一个字节
;LAST_BYTE_RX为1,是    SDA发送一个高电平,结束
;LAST_BYTE_RX为0,不是  SDA发送一个低电平ACK,继续接收
;---------------------------------------
        BSF        STATUS,RP0
        BCF        TRISC,SCL      
        BCF        TRISC,SDA      
        BTFSC      BUSCON,LAST_BYTE_RX      ;检测是否是最后一个字节
        BSF        TRISC,SDA                ;是最后一个字节
        NOP                             ;发送ACK信号
        BSF        TRISC,SCL
        NOP
        NOP
        NOP
        NOP
        BCF        TRISC,SCL
        BCF        STATUS,RP0
        BCF        BUSSTA,RX_PROGRESS   
        BSF        BUSSTA,RX_SUCCESS
        RETURN
;=======================================
;I2C 开始信号
;输入:  无
;输出:  BUFSSTA<BUS_BUSY>
;=======================================
I2CSTART
        BSF     STATUS,RP0
        BSF     TRISC,SDA    ;1US
        NOP                     ;1US
        BSF     TRISC,SCL       ;1US
        NOP
        NOP
        BCF     TRISC,SDA
        NOP
        NOP
        BCF     STATUS,RP0
        BSF     BUSSTA,BUS_BUSY
        RETURN
;=======================================
;I2C 结束信号
;输入:  无
;输出:  BUSSTA<BUS_BUSY>
;=======================================
I2CSTOP
        BSF     STATUS,RP0
        BCF     TRISC,SCL
        BCF     TRISC,SDA
        BSF     TRISC,SCL
        NOP
        NOP
        BSF     TRISC,SDA
        NOP
        BCF     STATUS,RP0
        BCF     BUSSTA,BUS_BUSY              
        RETURN
;=======================================
; D10 @
;  clock in 4Mhz
;  delay 10ms
;=======================================    
D10    MOVLW    0X0D        
    MOVWF    REG1
LOOP2    MOVLW    0XFF        
    MOVWF    REG2
LOOP1    DECFSZ    REG2,f
    GOTO    LOOP1
    DECFSZ    REG1,f
    GOTO    LOOP2
    RETURN
;=======================================
I2CERR  CLRWDT
        NOP
        NOP
        NOP
        RETURN 
        END






PIC单片机 www.pic16.com  

 回复文章:I2C编程
发信人:hnhkj 发表时间:2001-12-05 11:06:46

                          SSP控制寄存器SSPCON

WCOL    SSPOV    SSPEN    CKP    SSPM3    SSPM2    SSPM1    SSPM0    地址:14h上电值:00h
    │        │      │      │     │                        │
    │        │      │      │     ├────────────┘
    │        │      │      │     │            
    │        │      │      │     └── 同步串行口(SSP)模式选择
    │        │      │      │              0000= SPI主控模式,时针=OSC/4
    │        │      │      │              0001= SPI主控模式,时针=OSC/16
    │        │      │      │              0010= SPI主控模式,时针=OSC/64
    │        │      │      │              0011= SPI主控模式,时钟=TMR2输出/2
    │        │      │      │              0100= SPI从属模式,时钟=SCK脚输入,SS脚使能
    │        │      │      │              0101= SPI从属模式,时钟=SCK脚输入,SS脚关闭
    │        │      │      │              0110=I2C从属模式,7位地址
    │        │      │      │              0111=I2C从属模式,10位地址
    │        │      │      │              1011=I2C主控模式(从属模式关闭)
    │        │      │      │              1110=I2C从属模式,7位地址,并支持主控模式
    │        │      │      │              1111=I2C从属模式,10位地址,并支持主控模式
    │        │      │      └───── 时钟极性选择
    │        │      │                       ·SPI模式
    │        │      │                          1=下降沿发送,上升沿接收
    │        │      │                          0=上升沿发送,下降沿接收
    │        │      │                       ·I2C模式
    │        │      │                          1=时钟使能(时钟线释放)
    │        │      │                          0=时钟线锁定为低电平,以保证数据建立时间
    │        │      └────── 同步串行口(SSP)使能位
    │        │                        ·SPI模式
    │        │                          1=使能SPI模块,并定义SCK,SDO和SDI为传输线
    │        │                          0=关闭SPI模块,释放SCK,SDO和SDI为一般I/O线
    │        │                        ·I2C模式:
    │        │                          1=使能I2C模块,并定义SDA和SCL为传输线
    │        │                          0=关闭I2C模块,释放SDA和SCL为一般I/O线
    │        │                          注:当使能SPP时,这些传输线应由用户定义为正确的
    │        │                              输入/输出方向,详见各相应章节。
    │        └────────── 接收溢出位。
    │                                  1=发生接收溢出,详见具体章节介绍。
    │                                  0=未发生接收溢出。
    └─────────────── 写操作冲突标志位
                                        1=在传送过程中又有数据试图写入SSPBUF寄存器。
                                           该位需由软件清零。
                                        0=未发生写操作冲突。


                                                                   
 



PIC单片机 www.pic16.com   

 回复文章:I2C编程
发信人:hnhkj 发表时间:2001-12-05 11:19:26

                         SSP状态寄存器SSPSTAT

                   R     R     R     R     R     R
         ─  ─   D/A    P     S    R/W    UA    BF    地址:94h上电值:00h
         │  │   │    │    │    │    │    │
         └┬┘   │    │    │    │    │    └──── 缓冲区满
           │     │    │    │    │    │               ·接收(SPI和I2C模式)
           │     │    │    │    │    │                  1=接收完成,SSPBUF满
           │     │    │    │    │    │                  0=接收未完成,SSPBUF空
           │     │    │    │    │    │               ·发送(I2C模式)
           │     │    │    │    │    │                  1=发送正在进行,SSPBUF满
           │     │    │    │    │    │                  0=发送已经完成,SSPBUF空
           │     │    │    │    │    └────── 地址更新(10位I2C从属模式)
           │     │    │    │    │                      1=通知用户更新SSPADD中的地址
           │     │    │    │    │                      0=地址尚不需更新
           │     │    │    │    └───────── 读/写信息位(I2C模式),该位记录I2C
           │     │    │    │                            的读/写状态。用户需用这个位来判
           │     │    │    │                            断发送和接收状态。
           │     │    │    │                              1=读
           │     │    │    │                              0=写
           │     │    │    └────────────── 起始位(I2C模式)
           │     │    │                                     1=I2C线上检测到起始位
           │     │    │                                     0=I2C线上未检测到起始位
           │     │    └───────────────── 停止位(I2C模式)
           │     │                                           1=I2C线上检测到停止位
           │     │                                           0=I2C线上未检测到停止位
           │     └──────────────────── 数据/地址位(I2C模式)
           │                                                  1=最后收到的字节是数据
           │                                                  0=最后收到的字节是地址
           └──────────────────────── 未用



PIC单片机 www.pic16.com   

 回复文章:探讨
发信人:hnhkj 发表时间:2001-12-05 12:05:20

帮忙查错这个程序是一个完整的程序,它是采用了PIC的双向I/O功能实现的,它本身能够执行.但是它的缺点是没有能够充分的利用PIC本身的I2C通讯功能,我查找了许多的相关资料都没有一个完整的程序.他们的程序都是通过I2C的从器件功能接收/发送,但是作为主器件功能接收/发送却没有.不知道是由于在作为主器件不能够使用的缘故还是有其他的因素,希望各位大虾能够来到这里,我们大家来探讨探讨.


PIC单片机 www.pic16.com  

 回复文章:I2C
发信人:mzh 发表时间:2001-12-05 15:34:26

咨询过MICROCHIP工程师:带有SSP模块的PIC单片机只有I2C的从模式功能,带有MSSP模块的PIC单片机有主/从两种功能。


PIC单片机 www.pic16.com    

 回复文章:PIC16C74B属于哪种
发信人:hnhkj 发表时间:2001-12-05 16:58:28




PIC单片机 www.pic16.com 

 回复文章:一篇关于PIC实现I2C的文章
发信人:hnhkj 发表时间:2001-12-05 19:10:54




PIC单片机 www.pic16.com  

 回复文章:硬件I2C之我见
发信人:martin 发表时间:2001-12-05 21:55:13

硬件I2C的主模式,只能在具有MSSP模块的单片机里实现,如PIC16F87X,而PIC16C7X的SSP只能启用I2C从模式。我个人不太喜欢用硬件I2C,因为我觉得硬件I2C不能节省多少代码,而且要设置的地方多了些,其实主要原因还是用IO口模拟的软件方式用得熟了,所以,通常也就偷懒了,呵呵!硬件主I2C较之用IO口软件模拟的I2C,硬件的波特率固定,速度也快些,但设置较显烦琐,调起来可能不如用惯了的软件方式来得快。这是我个人的想法,不是叫大家不要去用,改天我贴一个硬件I2C的例程上来大家看看。


※  PIC单片机 www.pic16.com   

 回复文章:谢谢MARTIN
发信人:hnhkj 发表时间:2001-12-06 08:09:00




※  PIC单片机 www.pic16.com    

 回复文章:I2C从器件的检测方法
发信人:hnhkj 发表时间:2001-12-06 08:14:26

我这里有一种主器件在I2C总线上检测从器件的方法,不知道是不是理想的,望各位大虾探讨。
          开始--从地址--应答--停止 (表示有从器件)
                          |
                       不应答-停止 (表示无从器件,或从器件忙)



PIC单片机 www.pic16.com  

 回复文章:MSSP之硬件I2C主方式例子
发信人:martin 发表时间:2001-12-07 15:45:02

我不想贴了,太长。有MICROCHIP光盘的,或者上网,去看一下应用笔记里的AN735,有原代码。


PIC单片机 www.pic16.com    

 回复文章:IIC&SPI
发信人:loxinme 发表时间:2002-11-29 15:27:16




PIC单片机 www.pic16.com  

 回复文章:请教
发信人:SSL 发表时间:2002-11-29 16:42:42

MCU 工作在 SLAVE方式的时候MCU的地址是固定的吗?还是把所有SDA LINE上的数据都读进来.


PIC单片机 www.pic16.com