Here is the code that is working for me. I am sending three bytes to the slave. In this example 10, 20 and 30. The slave adds 1 and sends back 11, 21 and 31.
Here is a snipit of the master portion.
Here is the full slave. Pic18F2620 @ 20MhzCode:I2Caddress = $0A I2CWrite i2cdat,i2cclk,I2Caddress,[10,20,30],NoGo pauseus 5 i2cread i2cdat,i2cclk,i2caddress,[tp_x, tp_y, tp_dp],NoGo2 pauseus 5 USBBuffer[0] = tp_x USBBuffer[1] = tp_y USBBuffer[2] = tp_dp USBBuffer[3] = 0 gosub dousbout ' I am using USB as a debugger pause 100 goto mainmenu NoGo: USBBuffer[0] = 1 USBBuffer[1] = 2 USBBuffer[2] = 3 USBBuffer[3] = 0 gosub dousbout goto mainmenu NoGo2: USBBuffer[0] = 4 USBBuffer[1] = 5 USBBuffer[2] = 6 USBBuffer[3] = 0 gosub dousbout goto mainmenu
Disregard all the extra stuff, I am using this slave a Touch Screen controller.Code:asm __CONFIG _CONFIG1H, _OSC_HS_1H __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_512_2H __CONFIG _CONFIG3H, _PBADEN_OFF_3H __CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L endasm DEFINE OSC 20 'DEFINE ADC_BITS 10 'DEFINE ADC_CLOCK 3 'DEFINE ADC_SAMPLEUS 50 Define I2C_SLOW 1 DEFINE I2C_HOLD 1 'OSCCON = %01110001 '8mhz 'OSCTUNE.6 = 1 ' PLL selected 32mhz clock ' PicBasic Pro I2C slave program ' Alias pins scl VAR PORTC.3 ' I2C clock input sda VAR PORTC.4 ' I2C data input 'ADCON2.7=1 ADCON1 = $F '$B 'an1-an3 analog remainder digital CMCON = 7 'PortA Digital ' '---------------- Alias pins ----------------------------------- 'SCLDIR var TRISC.3 'SDADIR var TRISC.4 '--------------- Define used register flags ------------------- SSPIF VAR PIR1.3 ' SSP (I2C) interrupt flag SSPIE VAR PIE1.3 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 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 WrData var byte j var byte '------------------- Rx Buffer defintion -------------------- RxBufferLEN con 3 RxBuffer var byte[Rxbufferlen] RxBufferIndex var byte RxCnt var byte rxcnt = 0 '------------------ Tx Buffer defintion ---------------------- TxBufferLEN con 3 TxBuffer var byte[txbufferlen] TxBufferIndex var byte TxCnt var byte txcnt = 0 '------------------ Define constants ------------------------ rxinptr var byte rxoutptr var byte txinptr var byte txoutptr var byte rxinptr = 0 rxoutptr = 0 txinptr = 0 txoutptr = 0 I2Caddress CON $0A ' Make address = 2 ' Allocate RAM result VAR BYTE ' ADC result DataIn VAR BYTE[8] ' Data in DataOut VAR BYTE[8] ' Data out array readcnt VAR BYTE ' I2C read count readcnt = 0 ' Zero counter '**************************************************************** ' Variables used in the program. ' '**************************************************************** transdata var byte transbit7 var transdata.7 Tdata var word txdata var word tydata var word txcomp var word tycomp var word tx var word ty var word tvalue var word txcomp=0 tycomp=0 tx=0 ty=0 tvalue=0 PD var bit 'pen down flag address var byte ' -------------- Initialize I2C slave mode ------------------------ 'SCLDIR = 1 ' SCL must be an input before enabling interrupts 'SDADIR = 1 SSPADD = I2Caddress ' Set our address SSPCON1 = $36 ' Set to I2C slave with 7-bit address SSPCON2.0 = 1 SSPSTAT = 0 SSPIE = 1 SSPIF = 0 RxBufferIndex = 0 TxBufferIndex = 0 'LED1 var PORTC.1 ' Interrupt definition ' ==================== ' USB interrupt used to keep USB connection alive INCLUDE "DT_INTS-18.bas" ' Base Interrupt System INCLUDE "ReEnterPBP-18.bas" ' Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler SSP_INT, _I2C_Int, PBP, yes endm INT_CREATE ; Creates the interrupt processor endasm ''----------------- Initialization Done! ----------------------------- @ INT_ENABLE SSP_INT ; Master Synchronous Serial Port Interrupt Flag bit. The transmission/reception is complete txbuffer = 0 portc.1 = 1'high led1 goto Main '***************************************************************************** '------------------------- I2C subroutine -------------------------------- I2C_Int: If R_W = 0 then 'Write from master if D_A = 0 then ' It's address from master address = SSPBUF ' do nothing rxcnt = 1 rxinptr = 0 rxoutptr = 0 txinptr = 0 txoutptr = 0 else WCOL = 0 sspov = 0 if bf = 1 then 'There is data in buffer if rxcnt < rxbufferlen then rxbuffer[rxinptr] = SSPBUF rxinptr = rxinptr + 1 if rxinptr = rxbufferlen then rxinptr = 0 endif rxcnt = rxcnt + 1 EndIF endif else ' Read by master dataout = SSPBUF 'dummy read if bf = 0 then ' if buffer is empty if txcnt > 0 then ' Is there a byte to transfer SSPBUF = txbuffer[txoutptr] 'get the byte abd send it txoutptr = txoutptr + 1 if txoutptr = txbufferlen then txoutptr = 0 txcnt = txcnt - 1 else 'no byte to send endif endif endif sspif = 0 CKP = 1 @ INT_RETURN ' -------------------------end I2C subroutine -------------------------------- '--------------------[ main program loop]--------------------------------------- Main: 'SSPOV = 0 'WCOL = 0 'INTCON.7 = 0 'trrn off interrupt if txcnt < txbufferlen then TxBuffer[txinptr] = rxbuffer[txinptr] | %00000001 ' add "1" to the data in txinptr = txinptr + 1 if txinptr = txbufferlen then txinptr = 0 txcnt = txcnt + 1 'INTCON.7 = 1 'turn on interrupt endif if rxcnt != 0 then datain = rxbuffer[rxoutptr] rxoutptr = rxoutptr + 1 if rxoutptr = rxbufferlen then rxoutptr = 0 endif rxcnt = rxcnt - 1 endif WrData=0 goto main end
Thanks
Dave





Bookmarks