I am using a PIC18F2420 with a Microchip 25LC1024 128k x 8 EEPROM.
To get my technique down on using the MSSP I wrote the test code below to write data to the first 2 locations in the EEPROM then to read them back.
If I do two separate reads it works but when I keep the CS low to perform a sequential read and clock the next data byte out of the EEPROM I always get FF.
What am I missing here?
Code:'25LC1024 128k x 8 EEPROM 'PIC18F2420 CS Var PORTB.2 dummy_data Var Byte Data_Byte1 Var Byte Data_Byte2 Var Byte DEFINE OSC 32 '32 Mhz Osc Main: TRISB=%00000000 'Set CS as an output TRISC=%00010000 'Set SPI data in, data out and clock out SSPSTAT = %01000000 'Sample in middle, TX rising clock edge SSPCON1 = %00100010 'No collision/overflow, enable port,idle low,Fosc/64 High CS Gosub Write_SPI_data Gosub Read_SPI_data Gosub Read_SPI_Data_Sequential End Write_SPI_Data: Gosub Write_Enable Low CS SSPBUF = %00000010 ' Send Opcode for WRITE sequence While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send MSByte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send Middle Byte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send LSByte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000111 ' Send data byte While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF High CS Gosub Write_Enable ' Write Enable Latch is reset after ' WRITE instruction successfully ' executed so re-enable. Low CS SSPBUF = %00000010 ' Send Opcode for WRITE sequence While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send MSByte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send Middle Byte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000001 ' Send LSByte of next EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00010000 ' Send data byte While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF High CS Return Read_SPI_Data: ' This works Low CS SSPBUF = %00000011 ' Send Opcode for READ sequence While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send MSByte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send Middle Byte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send LSByte of next EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send dummy data byte to clock data out of EEPROM While SSPSTAT.0 = 0: Wend ' Wait for completion Data_Byte1 = SSPBUF ' Get data from address 0. Should be %00000111 ' and it is. High CS ' End of first READ sequence Low CS ' Perform next READ sequence SSPBUF = %00000011 ' Send Opcode for READ sequence While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send MSByte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send Middle Byte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000001 ' Send LSByte of next EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send dummy data byte to clock data ' out of EEPROM. While SSPSTAT.0 = 0: Wend ' Wait for completion Data_Byte2 = SSPBUF ' Get data from address 1. Should be ' %00010000 and it is. High CS ' End of second READ sequence Return Read_SPI_Data_Sequential: ' This doesn't work Low CS SSPBUF = %00000011 ' Send Opcode for READ sequence While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send MSByte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send Middle Byte of EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send LSByte of next EEPROM address While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF SSPBUF = %00000000 ' Send dummy data byte to clock next data out of EEPROM While SSPSTAT.0 = 0: Wend ' Wait for completion Data_Byte1 = SSPBUF ' Get data from address 0. Should be ' %00000111 and it is. ' Internal address pointer is ' automatically incremented SSPBUF = %00000000 ' Send dummy data byte to clock data ' out of EEPROM. While SSPSTAT.0 = 0: Wend ' Wait for completion Data_Byte2 = SSPBUF ' Get data from address 1. Should be ' %00010000 but is %11111111 High CS ' End of READ sequence Return Write_Enable: 'Set the write enable latch (enable write operations) Low CS SSPBUF = %00000110 ' Send Opcode for WREN While SSPSTAT.0 = 0: Wend ' Wait for completion dummy_data = SSPBUF High CS Return




Bookmarks