Code:
'Oscillator Initialization
DEFINE OSC 32 ' Osc. in MHz
OSCCON = %01110000
OSCTUNE.6 = 1
ADCON0.0 = 0 ' Turns off A-to-D module
ADCON1 = $0F ' Makes 100% port A digital
TRISA = %00000000
CMCON = 7 ' Comparators Off
DEFINE I2C_HOLD 1
'DEFINE I2C_SLOW 1
' Define used register flags
SSPIF VAR PIR1.3 ' SSP (I2C) interrupt flag
SSPIE VAR PIE1.3 ' SSP Int Enable
BF VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
R_W VAR SSPSTAT.2 ' SSP (I2C) Read/Write
D_A VAR SSPSTAT.5 ' SSP (I2C) Data/Address
CKP VAR SSPCON1.4 ' SSP (I2C) SCK Release Control
SSPEN VAR SSPCON1.5 ' SSP (I2C) Enable
SSPOV VAR SSPCON1.6 ' SSP (I2C) Receive Overflow Indicator
WCOL VAR SSPCON1.7 ' SSP (I2C) Write Collision Detect
'STRETCH VAR SSPCON2.0 ' SSP (I2C) Clock stretch
A var byte ' my counter variable for testing
'---------------- Alias pins -----------------------------------
TRISC.3 = 1 ' input
TRISC.4 = 1 ' input
'--------------- Define used register flags -------------------
'STAT_BF VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
'STAT_RW VAR SSPSTAT.2 ' SSP (I2C) Read/Write
'STAT_DA VAR SSPSTAT.5 ' SSP (I2C) Data/Address
CKE VAR SSPSTAT.6 ' SSP (I2C) Data/Address
'------------------- Rx Buffer definition --------------------
RxBufferLEN con 3
RxBuffer var byte[Rxbufferlen]
RxBufferIndex var byte
'------------------ Tx Buffer definition ----------------------
TxBufferLEN con 3
TxBuffer var byte[txbufferlen]
TxBufferIndex var byte
'------------------ Define constants ------------------------
'I2Caddress CON $2 ' Make address = 2
I2Caddress CON $06 ' Make address = 2
' Define constants
U8 var byte
U17 var byte
InByte var byte
OutByte var byte
readcnt VAR BYTE
'U8 = $06
U17 = $08
'STRETCH = 1
WRData var byte
' Initialize I2C slave mode
'SSPCON2 = 0 ' General call address disabled
'SSPADD = My_I2C_address ' Set our address
SSPADD = I2Caddress ' Set our address
SSPCON2.7 = 0 ' General call address disabled
SSPCON1 = $36 ' Set to I2C slave with 7-bit address
SSPSTAT = 0
SSPIE = 1
SSPIF = 0
RxBufferIndex = 0
TxBufferIndex = 0
bf = 0
SSPOV = 0
'Port C harware UART settings
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1
'----------------- Initialization Done! -----------------------------
rxbuffer[0] = 0
rxbuffer[1] = 0
rxbuffer[2] = 0
GoTo main
I2C_Slave: ' I2C slave subroutine
hserout ["SSPIF = ",#SSPIF," BF = ",#bf,13,10]
hserout ["R_W = ",#R_w," D_A = ",#D_A,13,10]
hserout ["SSPBUF = ",#SSPBUF,13,10]
SSPIF = 0 ' Clear interrupt flag
SSPov = 0 ' Clear interrupt flag
bf = 0 ' clear buffer full
IF R_W = 1 Then
hserout ["R_W = 1, Read data from U8",13,10]
goto I2C_Read ' Read data from us
endif
IF SSPBUF = I2Caddress Then
hserout ["It's to me! ",#SSPBUF," = ",#I2Caddress,13,10]
endif
IF D_A = 1 Then
hserout ["Data (not address)",13,10]
goto I2C_Write ' Data for us (not address)
endif
GoTo I2C_Exit
I2C_Write: ' I2C write data to us
InByte = SSPBUF ' Put buffer data into array
Rxbuffer[Rxbufferindex] = InByte
rxbufferindex = rxbufferindex + 1
hserout ["SSPBUF Write = ",#SSPBUF,13,10]
GoTo i2c_exit
I2C_Read: ' I2C read data from us
hserout ["SSPBUF Read = ",#SSPBUF,13,10]
IF D_A = 0 Then
TxBufferIndex = 0
EndIF
while BF : wend ' loop while buffer is full
wcol = 0 ' clear collision flag
SSPBUF = TxBuffer[TxBufferIndex]
while wcol
wcol = 0
SSPBUF = TxBuffer[TxBufferIndex]
wend
hserout ["SSPBUF Outbyte = ",#SSPBUF," should be outbyte 16 or 31",13,10]
CKP = 1 ' release clock, allowing read by master
TxBufferIndex = TxBufferIndex + 1 ' increment index
if TxBufferIndex = TxBufferlen then ' all bytes have been tx
TxBufferIndex = 0 ' reset index
endif
I2C_Exit:
Return
main:
pause 300
hserout [13,10,"Start of program U8",13,10]
hserout ["RxBuffer = "]
for a = 0 to 2
hserout [dec rxbuffer[a]," "]
next a
hserout [13,10]
loop:
' IF SSPIF = 1 Then
IF BF = 1 Then
hserout [13,10,"Went into I2C_Slave routine",13,10]
GoSub i2c_slave
hserout ["RxBuffer = "]
for a = 0 to 2
hserout [dec rxbuffer[a]," "]
next a
hserout [13,10]
hserout ["SSPCON1 = ",hex sspcon1," ",bin sspcon1,13,10]
hserout ["SSPCON2 = ",hex sspcon2," ",bin sspcon2,13,10]
hserout ["SSPSTAT = ",hex sspstat," ",bin sspstat,13,10]
hserout ["SSPBUF = ",#sspbuf,13,10]
if rxbufferindex = RxBufferLEN then ' end of buffer transfer
WrData = 1
rxbufferindex = 0
rxbuffer[0] = 0
rxbuffer[1] = 0
rxbuffer[2] = 0
hserout ["RxBuffer Cleared = "]
for a = 0 to 2
hserout [dec rxbuffer[a]," "]
next a
hserout [13,10]
endif
endif
SSPOV = 0
WCOL = 0
IF RxBuffer[0] = 15 Then
hserout ["Got a 15",13,10]
hserout [" Readcount is: ",#readcnt,13,10]
hserout ["Have a 16 to send if asked",13,10]
TxBuffer[0] = 16
EndIF
IF RxBuffer[0] = 30 Then
hserout ["Got a 30",13,10]
hserout [" Readcount is: ",#readcnt,13,10]
hserout ["Have a 31 to send if asked",13,10]
TxBuffer[0] = 31
EndIF
WrData=0
pause 50
GoTo loop
End
Bookmarks