I've sorted my glitch out, copying a double-byte send I2C section to create the triple byte I'd overlooked the unwanted I2C_Stop call before sending the 3rd byte, so was never seeing it.
Code:;====== call I2C_Start call I2C_Address movlw 00h ; 00=Command stream. movwf I2C_Command_or_Data call I2C_byte movlw 21h ;Column Address; movwf I2C_Command_or_Data call I2C_byte movlw 00h ; Low column. movwf I2C_Command_or_Data call I2C_byte movlw 3Fh ; High column. movwf I2C_Command_or_Data call I2C_byte call I2C_Stop ; ;====== call I2C_Start call I2C_Address movlw 00h ; 00=Command stream. movwf I2C_Command_or_Data call I2C_byte movlw 22h ;[3] Page Address; movwf I2C_Command_or_Data call I2C_byte movlw 00h ; Start page. movwf I2C_Command_or_Data call I2C_byte movlw 03h ; End page. movwf I2C_Command_or_Data call I2C_byte call I2C_Stop ; I2C_Start ;-- Start -- bcf PORTA,SDA ;START commence, call _nops bcf PORTA,SCK ; START complete. return I2C_Address ;-- Address_byte -- ;= 78h (bit [0] = R/W. Writing, so = 0. bcf PORTA,SDA ;bit 7 call clk_it bsf PORTA,SDA ;bit 6 call clk_it bsf PORTA,SDA ;bit 5 call clk_it bsf PORTA,SDA ;bit 4 call clk_it bsf PORTA,SDA ;bit 3 call clk_it bcf PORTA,SDA ;bit 2 call clk_it bcf PORTA,SDA ;bit 1 call clk_it bcf PORTA,SDA ;bit 0 (R/W bit) call clk_it ; return ; I2C_Ack ;-- Ack -- bsf STATUS,RP0 ;Page 1. bsf TRISA,SDA ;Set as input to release the line bcf STATUS,RP0 ;Page 0. call clk_it bsf STATUS,RP0 ;Page 1. bcf TRISA,SDA ;Set back to output. bcf STATUS,RP0 ;Page 0. return ; I2C_byte ;-- Command or Data byte -- movlw 08h movwf countbits ;count the 8 bits RLF byte_bits btfss I2C_Command_or_Data,7 goto low_bit1 bsf PORTA,SDA goto _clk1 low_bit1 bcf PORTA,SDA _clk1 call clk_it decfsz countbits,same goto _rlf goto I2C_Ack ;return _rlf rlf I2C_Command_or_Data goto byte_bits ; I2C_Stop ;-- Stop -- bcf PORTA,SDA ;Before STOP, ensure its low. call _nops bsf PORTA,SCK ;STOP commence, call _nops bsf PORTA,SDA ; STOP completed. ; call _nops call d50mS return ;I2C over.




Bookmarks