Hardware I2C


Closed Thread
Results 1 to 12 of 12

Thread: Hardware I2C

Hybrid View

  1. #1
    Join Date
    May 2006
    Location
    Del Rio, TX, USA
    Posts
    343


    Did you find this post helpful? Yes | No

    Default

    It's great to here when someone has success. Especially when they have put in the work (like getting into the datasheet) that you have.

    SteveB

  2. #2
    Join Date
    Feb 2013
    Posts
    1,124


    Did you find this post helpful? Yes | No

    Default Re: Hardware I2C

    I tried to use above code with 24C32 and PIC16F887 but it does not works. It stuck on this loop: while SSPCON2.0 = 1 : wend

    Here's complete code:

    Code:
    '****************************************************************
    '*  Name    : I2C EEPROM                                        *
    '*  Author  : Daniel T. Barber                                  *
    '*  Notice  : Copyright (c) 2018                                *
    '****************************************************************
    
    @ ERRORLEVEL -306   ' turn off crossing page boundary message
     
    '************ Config Settings for 16F877A *************
    #CONFIG
    cfg1 = _INTRC_OSC_NOCLKOUT    ; INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
    cfg1&= _WDT_ON                ; WDT enabled
    cfg1&= _PWRTE_OFF             ; PWRT disabled
    cfg1&= _MCLRE_OFF             ; RE3/MCLR pin function is digital input, MCLR internally tied to VDD
    cfg1&= _CP_OFF                ; Program memory code protection is disabled
    cfg1&= _CPD_OFF               ; Data memory code protection is disabled
    cfg1&= _BOR_OFF               ; BOR disabled
    cfg1&= _IESO_ON               ; Internal/External Switchover mode is enabled
    cfg1&= _FCMEN_ON              ; Fail-Safe Clock Monitor is enabled
    cfg1&= _LVP_OFF               ; RB3 pin has digital I/O, HV on MCLR must be used for programming
    cfg1&= _DEBUG_OFF             ; In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
      __CONFIG _CONFIG1, cfg1
    
    cfg2 = _BOR40V                ; Brown-out Reset set to 4.0V
    cfg2&= _WRT_OFF               ; Write protection off
      __CONFIG _CONFIG2, cfg2
    
    #ENDCONFIG
     
    TRISA=%00000000  'SET A TO OUTPUT   1=input
    TRISC=%00011000   'set C 3 4  input
    TRISB=%00000000   'set PortB to output
    ANSELH=%00000000   ' ADC OFF B
    ANSEL=%00000000 'configure PortA as digital except first 2
    ADCON1=%10000000  'adc justify
    OSCCON=%01110101  'SET FREQUENCY TO 8MHZ
    WPUB=%00000000    'turn off Pullups
    CM1CON0=0         'DISABLE COMPARATORS
    CM2CON0=0         'SAME HERE
      
    Define OSC 8 'Adjust consistent with oscillator speed being used
    
    ADCON1 = 7      ' Set PORTA and PORTE to digital
    
    DEFINE LCD_DREG PORTB  
    DEFINE LCD_DBIT 4  
    DEFINE LCD_RSREG PORTB 
    DEFINE LCD_RSBIT 2  
    DEFINE LCD_EREG PORTB  
    DEFINE LCD_EBIT 3  
    DEFINE LCD_BITS 4  
    DEFINE LCD_LINES 2  
    DEFINE LCD_COMMANDUS 1500  
    DEFINE LCD_DATAUS 44
    'clear
    
    
    I2CBufferSize  con 64
    
    Reg_Pointer	Var Byte 	 ; Address register
    I2CDATA		Var Byte 	 ; data to read/write
    I2CAddr		Var Byte 	 ; Device address
    
    I2C_Wait	     var byte 
    countI2C	     var byte 
    I2CWRBuff	     var byte (I2CBufferSize) 
    I2CWRsize	     Var Byte 
    I2CRDBuff	     var byte (I2CBufferSize) 
    I2CRDsize	     Var Byte 
    
    I2CErrCode     Var Byte 
    I2CErrCode     = 0
    
    x var byte 'temp var
    
    SSPSTAT.7 = 0       ; SMP<7> - Slew rate control Enabled (400kHz)
    SSPCON = %00101000
              ; | ''''--  SSPM<3:0> - I2C Master mode, clock = FOSC / (4 * (SSPADD+1))
              ; '-------- SSPEN<5> - Synchronous Serial Port Enable bit
    
    SSPADD = $0E        ; set I2C clock rate to 400kHz
    'SSPADD = $59		; set I2C clock rate to 100kHz
    
    
    
    for x=0 to 255
    lcdout $fe, $2, "wait..."
    I2CAddr=x
    gosub read1byte
    lcdout $fe, $2, "data=", dec i2cdata
    pause 1000
    next
    stop
    
    
    
    
    
    ;-----------------------------------------------------------
    ; Main Routines
    ;-----------------------------------------------------------
    Write1Byte:
         I2CErrCode.1 = 0
    	I2CAddr.0	=	0	;Set Write Bit
    	Gosub StartI2C      ;Send Start, Addr, Wait for Ack
    	if I2CErrCode.1	=	1 then RETURN
    		I2CDATA = I2CWRBuff(0) 
    	gosub I2CWRByte	    ;Send I2CDATA Byte
    	Gosub SendStopBit	;Send Stop Bit
    Return
    ;-----------------------------------------------------------
    WriteXBytes:
         I2CErrCode.1 = 0
    	I2CAddr.0	=	0	;Set Write Bit
    	Gosub StartI2C      ;Send Start, Addr, Wait for Ack
    	if I2CErrCode.1	=	1 then RETURN
    	For countI2C = 0 to I2CWRsize-1
    		I2CDATA = I2CWRBuff(countI2C)
    ;          hserout [dec countI2C,"-",ihex2 I2CDATA," ",13,10] 
    		gosub I2CWRByte	    ;Send I2CDATA Byte
    	next countI2C      
    	Gosub SendStopBit	;Send Stop Bit
    Return
    ;-----------------------------------------------------------
    Read1Byte:
         I2CErrCode.1 = 0
    	I2CAddr.0	=	1	;Set Read Bit
    	Gosub StartI2C      ;Send Start, Addr, Wait for Ack
    	if I2CErrCode.1	=	1 then RETURN
        gosub I2CRDByte
    	I2CRDBuff(0) = 	I2CDATA 
        gosub Send_NO_Ack
        Gosub SendStopBit
    Return
    ;-----------------------------------------------------------
    ReadXBytes:
         I2CErrCode.1 = 0
    	I2CAddr.0	=	1	;Set Read Bit
    	Gosub StartI2C      ;Send Start, Addr, Wait for Ack
    	if I2CErrCode.1	=	1 then RETURN
         for countI2C = 0 to I2CRDsize-2
              gosub I2CRDByte
              gosub Send_Ack
    		I2CRDBuff(countI2C) = 	I2CDATA 
         next  countI2C
         countI2C = I2CRDsize - 1
         gosub I2CRDByte
         gosub Send_NO_ACK
         Gosub SendStopBit
         I2CRDBuff(countI2C) = 	I2CDATA 
    Return
    ;-----------------------------------------------------------
    ; Process Routines
    ;-----------------------------------------------------------
    StartI2C:
    
         ;Send Start Bit
         SSPCON2.0 = 1                 ; SEN<0> - Send start bit
         while SSPCON2.0 = 1 : wend    ; Wait for completion
         ;Send Slave Address
         PIR1.3 = 0                    ; SSPIF - Clear interrupt Flag
         SSPBUF = I2CAddr              ; move slave address to SSPBUF
         While PIR1.3 = 0 : Wend       ; SSPIF - Wait for SSP to complete sending slave address
         ;Wait for Acknowledge or Restart
         i2c_wait = 0                  ; Reset wait counter
         While SSPCON2.6 = 1           ; Wait for Acknowledge from slave  1=NotAck
              I2C_Wait = I2C_Wait + 1  ; Increment wait counter
              if I2C_Wait = 0 then     ; Wait for 256 counts
                   goto I2CResError    ; Acknowledge "Time Out" - Report error and RETURN      
              else
                   ; Send Repeated Start
                   SSPCON2.1 = 1       ; RSEN - Send Repeated Start
                   while SSPCON2.1 = 1 : wend    ; Wait for completion
                   ; Resend the Slave Address
                   PIR1.3 = 0                    ; SSPIF - Clear interrupt Flag
                   SSPBUF = I2CAddr              ; move slave address to SSPBUF
                   While PIR1.3 = 0 : Wend       ; SSPIF - Wait to complete sending Slave Address
              endif 
         wend
         RETURN                        ; Acknowledge recieved
    Return
    ;-----------------------------------------------------------
    I2CWRByte:
         PIR1.3 = 0                    ; SSPIF - Clear interrupt Flag
         SSPBUF = I2CDATA              ; Move data to SSPBUF
         While PIR1.3 = 0 : Wend       ; SSPIF - Wait for SSP to complete sending
    
         ;Wait for Acknowledge or Abort
         i2c_wait = 0                  ; Reset wait counter
         While SSPCON2.6 = 1           ; Wait for Acknowledge from slave  1=NotAck
              I2C_Wait = I2C_Wait + 1  ; Increment wait counter
              if I2C_Wait = 0 then     ; Wait for 256 counts
                   goto I2CResError    ; Acknowledge "Time Out" - Report error and RETURN      
              endif 
         wend
         RETURN                        ; Acknowledge recieved
    Return
    ;-----------------------------------------------------------
    I2CRDByte:
         PIR1.3 = 0                    ; SSPIF - Clear interrupt Flag
         SSPCON2.3 = 1                 ; RCEN - Enable receive mode
    
         While PIR1.3 = 0 : Wend       ; SSPIF - Wait for SSP to complete receiving
         
         I2CDATA = SSPBUF
    
    Return
    ;-----------------------------------------------------------
    SendStopBit
         SSPCON2.2 = 1                 ; PEN - send stop bit
         While SSPCON2.2 = 1 : Wend    ; Wait for SSP to complete
    Return
    ;-----------------------------------------------------------
    Send_NO_Ack:
         SSPCON2.5 = 1                 ; ACKDT - Set Ack bit to NotAck
         SSPCON2.4 = 1                 ; ACKEN - send ACKDT bit
         While SSPCON2.4 = 1 : Wend    ; Wait for SSP to complete
    Return
    ;-----------------------------------------------------------
    Send_Ack:
         SSPCON2.5 = 0                 ; ACKDT - Set Ack bit to Ack
         SSPCON2.4 = 1                 ; ACKEN - send ACKDT bit
         While SSPCON2.4 = 1 : Wend    ; Wait for SSP to complete
    Return
    ;-----------------------------------------------------------
    I2CResError:
    	I2CErrCode.1	=	1
    	lcdout $fe, $2, "I2C Error!!!"
    Return
    ;-----------------------------------------------------------

Similar Threads

  1. I2C Master/Slave 16F88/16F767 working code
    By DanPBP in forum Code Examples
    Replies: 2
    Last Post: - 23rd October 2012, 22:31
  2. HARDWARE I2C SAMPLE CODE question
    By Michael Wakileh in forum Code Examples
    Replies: 2
    Last Post: - 16th June 2009, 21:07
  3. I2C Master Slave issues.
    By cpayne in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 29th March 2008, 19:33
  4. Hardware I2C
    By Kamikaze47 in forum mel PIC BASIC Pro
    Replies: 21
    Last Post: - 13th March 2008, 13:24
  5. Please help with i2cslave i2c slave
    By cycle_girl in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 1st December 2005, 13:55

Members who have read this thread : 2

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts