Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Register Log in

pic16f877a + spi + 93LC46A-I/OT EEPROM

mayasunny

Member level 2
Joined
Mar 21, 2019
Messages
51
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
458
Hi members,
i'm working on pic16f877a micro controller, i want to interface 96LC46A-I/OT EEPROM with pic controller using spi module.
my pic oscillator is about 20MHz, and eeprom Fclk is max 2MHz.
now im unable to generate clock at SCL pin , i don't know why. i checked spi separately, it is generating clock signal, but when i interface with external eeprom problem comes.any help from members?
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
17,275
Helped
3,914
Reputation
7,826
Reaction score
3,778
Trophy points
113
Activity points
114,680
Hi,

"SCL" usually is an "I2C" pin, not an "SPI" pin. Please check this.

And for the rest: How do you think we can help you without showing your code and schematic?

Klaus
 

kripacharya

Banned
Joined
Dec 28, 2012
Messages
1,209
Helped
182
Reputation
360
Reaction score
175
Trophy points
1,343
Location
New Delhi
Activity points
0
Check your connections ! Obviously some mistake in your wiring.
But also give more details of "problem comes". What problem exactly ?
 

mayasunny

Member level 2
Joined
Mar 21, 2019
Messages
51
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
458
Hi,

"SCL" usually is an "I2C" pin, not an "SPI" pin. Please check this.

And for the rest: How do you think we can help you without showing your code and schematic?

Klaus
Thanks for your reply ,
klausST "SCL/SCK" is the clock pin for both SPI & I2C according to pic16f877a datasheet.

- - - Updated - - -

Check your connections ! Obviously some mistake in your wiring.
But also give more details of "problem comes". What problem exactly ?
i made a mistake in setting bit to CKE pin, i made this pin high now i can see the clock from master. now the problem im facing is whatever the data i'm writing to eeprom is showing as 0xFF, (SSPBUF = 0XFF), i don't know why,
below is my spi code can you check please


Code:
#pragma config FOSC = HS                                 // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF                                // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON                                // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON                                // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF                                 // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF                                 // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF                                 // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF                                  // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>
#define _XTAL_FREQ 20000000

//SPI lines
#define CS RA5 //Chip select ON RA5
#define MOSI RC5 //Master Out Slave In
#define MISO RC4 //Master in slave out
#define SCK RC3 //Clock

/*SPI_COMMANDS
#define READ 0b00001100;
#define WRITE 0b00001010;
#define EWEN  0b10001001; 
#define EWDS 0b00001000;
#define ERASE 0b00001110;*/

unsigned char HiByte;                                        //High Order Byte 
unsigned char LoByte;                                        //Low Order Byte
unsigned char HiData;                                        //Hi Data Byte (upper 8 bits of word)
unsigned char ReadData[1];                                   //Holds Device data being read back
unsigned char Length;                                        //Number of Bytes to read (1 for x8 mode)
unsigned char Result,rxdata;

void SPI_init(void);                                         // Init. function
void Ewen(void);                                             // Erase/Write Enable function
void Ewds(void);                                             // Erase/Write Disable function
void SPI_write_cmd(unsigned char, unsigned char, unsigned char);            // 8-bit Write function
unsigned char DataRdyMwire(void );
char SPI_Write(char);
unsigned char SPI_Read (unsigned char, unsigned char, unsigned char , unsigned char);
char getdata( unsigned char, unsigned char );

void main(void)
{
    HiByte = 0x0A;                                                //Dummy Zero's, Start Bit and Op Code for Byte Write
    LoByte = 0x10;                                                //Address bits for 93LC66C
    HiData = 0x5A;                                                  //Upper 8 bits of Data word
    Length = 0x01;                                                  //Number of bytes to read  (1 for x8)
    while(1){
    SPI_init();
 
    Ewen();
    //  __delay_ms(1);
    SPI_write_cmd(HiByte, LoByte, HiData);
   // __delay_ms(1);
    Ewds();
    HiByte = 0x0C;                                                //Changes OpCode from Write to Read for next function
    __delay_us(1);
    SPI_Read(HiByte, LoByte, ReadData, Length);
    }
    while(1);                                                    //Loop here forever
}

void SPI_init()
{  
  //  ADCON1 = 0X4F;
    TRISC5 = 0;                                                  // Configure PORTC I/O, MOSI
    TRISC3 = 0;                                                  // Configure PORTC I/O, CLK
    TRISC4 = 1;                                                  // Configure PORTC I/O, MISO  
    PORTA = 0;                                                   // Clear all PORTA pins
    TRISA = 0; 
    SSPSTAT = 0b01000000; 
    SSPCON = 0b00100001; 
}



void Ewen(void)
{
    CS = 1;                                                     //Select Device
    SPI_Write(0x09);                                            //EWEN Command
    SPI_Write(0x08);
     __delay_us(1);
    CS = 0;                                                     //Deselect Device
}

char SPI_Write(char incoming)
{
    SSPBUF = incoming;                                          //Write the user given data into buffer
    if (SSPCONbits.WCOL == 1)                                   // test if write collision occurred
    {
         return(-1);   
    }                                                           // if WCOL bit is set return negative #
    else
    {
        while(!SSPSTATbits.BF );                                // wait until bus cycle complete
        //rxdata = SSPBUF;
        return (0);                                             // if WCOL bit is not set return non-negative#
    }    
}

void SPI_write_cmd(unsigned char HiByte, unsigned char LoByte, unsigned char HiData)
{
    CS = 1;                                                     // Select Device
    SPI_Write(HiByte);                                            // Send HiByte (Dummy bits, SB, and Op Code)
    SPI_Write(LoByte);                                            // Send LoByte (Address for the 93LC66C)    
    SPI_Write(HiData);                                            // Send HiData to EEPROM
    CS = 0;                                                       // Deselect Device and initiate write
    __delay_us(1);
    CS = 1;                                                        // Select Device
    while (!DataRdyMwire());                                    // Wait for Write to complete
    CS = 0;                                                        // Deselect device
    
   // __delay_us(1);
}

unsigned char DataRdyMwire(void)
{
    if(PORTCbits.RC4)                                             // test if DO line is high    
      return (1);                                                 // return ready = true
    else
      return (0);                                                 // else ready = false
}

void Ewds(void)
{
    CS = 1;                                                     //Select Device
     SPI_Write(0x08);                                           //EWDS Command to disable write/erase operation
     SPI_Write(0x00);   
      __delay_us(1);
    CS = 0;                                                     //Deselect Device
}

unsigned char SPI_Read(unsigned char HiByte, unsigned char LoByte, unsigned char ReadData, unsigned char Length )
{
    LoByte = LoByte << 1;
    CS = 1;                                                       // Select Device
    SPI_Write( HiByte );                                          // Send Read OpCode 
    SPI_Write( LoByte );                                          // WRITE word address to EEPROM
    Result=getdata(ReadData, Length);                             // Reads 1 byte
    __delay_us(1);
    CS = 0;                                                       // Deselect Device
                                  
} 

char getdata( unsigned char ReadData, unsigned char length )
{
    while ( length )                                              // stay in loop until length = 0
    {
      SSPBUF = 0x00;                                              // initiate bus cycle
      while(!SSPSTATbits.BF );                                    // wait until byte has been received
      __delay_us(1);
      ReadData = SSPBUF;                                          // save byte
      length--;                                                   // reduce string byte count by 1
    }
  return(ReadData);
      
}
</xc.h>
 
Last edited by a moderator:

kripacharya

Banned
Joined
Dec 28, 2012
Messages
1,209
Helped
182
Reputation
360
Reaction score
175
Trophy points
1,343
Location
New Delhi
Activity points
0
Many points can come to mind. However most important one is that the Instruction set for your ic is 9- bits length. I cannot see where/ how these 9- bits are being formed or managed.
 

mayasunny

Member level 2
Joined
Mar 21, 2019
Messages
51
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
458
i'm in confusion, in eeprom datasheet they mention like this s.b(startbit),opcode,address(A6-A0) , this total comes to 10bits
but you are saying 9th bit, can you explain it little clear

- - - Updated - - -

one more thing my eeprom size is 1kb
 

kripacharya

Banned
Joined
Dec 28, 2012
Messages
1,209
Helped
182
Reputation
360
Reaction score
175
Trophy points
1,343
Location
New Delhi
Activity points
0
I am simply looking at datasheet of 93LC46A, which is what you mentioned. Clearly mentions 9-bit in many places. Also, it's A5.. A0 and not A6.. A0
 

mayasunny

Member level 2
Joined
Mar 21, 2019
Messages
51
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
458
I am simply looking at datasheet of 93LC46A, which is what you mentioned. Clearly mentions 9-bit in many places. Also, it's A5.. A0 and not A6.. A0
sir, please check X8 organization, ORG=0
 

kripacharya

Banned
Joined
Dec 28, 2012
Messages
1,209
Helped
182
Reputation
360
Reaction score
175
Trophy points
1,343
Location
New Delhi
Activity points
0
Clearly you are referring to datasheet of some other device. Please cross-check and confirm precisely which eeprom you are talking about.

- - - Updated - - -

Okay, I think I have located the variant you are using.

- - - Updated - - -

So back to my point, where are you handling 10-bits?

- - - Updated - - -

Start with functions EWEN and EWDS
 

mayasunny

Member level 2
Joined
Mar 21, 2019
Messages
51
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
458
EWEN 1(S.B) 00(OP) 1 1 XXXX (A6-A0) for this

SPI_Write(0x04); //EWEN Command
SPI_Write(0xC0);

im little confused how to handle this 10bits

SPI_Write(0x04); //EWDS Command to disable write/erase operation
SPI_Write(0x00);
 
Last edited:

kripacharya

Banned
Joined
Dec 28, 2012
Messages
1,209
Helped
182
Reputation
360
Reaction score
175
Trophy points
1,343
Location
New Delhi
Activity points
0
I don't know how your SPI_write works. It is probably byte oriented. Also what control is there for clock speed?

You could write your own bit-banged routines which handle non 8-bit transfers and also allow control of clock speed below maximum of chip.
 

mayasunny

Member level 2
Joined
Mar 21, 2019
Messages
51
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
458
now i'm operating it with 1.25MHz frequency
 

Aussie Susan

Advanced Member level 4
Joined
Jan 5, 2015
Messages
1,149
Helped
359
Reputation
718
Reaction score
355
Trophy points
83
Activity points
12,491
The EEPROM says that it is "microwire compatible" and while mirowire and SPI are related, they are NOT the same.
You haev two choices: 1) use a newer EEPROM that has a standard SPI or I2C interface (Microchip and many others make these in abundance) which will let you use the MCU's MSSP module; 2) bit-bang the interface as the MSSP module ONLY works with 8-bit values and you need the 9/10/18/25/whatever clocks for each transfer.
Susan
 

Aussie Susan

Advanced Member level 4
Joined
Jan 5, 2015
Messages
1,149
Helped
359
Reputation
718
Reaction score
355
Trophy points
83
Activity points
12,491
OK - I had not seen that. Thanks for pointing it out.
AN1023 (linked from the EEPROMs data sheet page you linked to) certainly shows the MSSP module being used. What it also shows is that the EEPROM will ignore leading '0's in the MSByte which I did not pick up from the data sheet itself. Also many (other) devices can be a but sensitive to too many clocks - looks like this one is not.
Given that Application Note, you should now be all set.
Susan
 

kripacharya

Banned
Joined
Dec 28, 2012
Messages
1,209
Helped
182
Reputation
360
Reaction score
175
Trophy points
1,343
Location
New Delhi
Activity points
0
Interesting AppNote. Especially this line quoted from the text "Since the Microwire protocol is not native to the MSSP module, a version of SPI mode 0,0 has been implemented and works within the data sheet specifications for Microwire".

Also the purpose of that Start-Bit (SB) becomes clear.
 

Toggle Sidebar

Part and Inventory Search


Welcome to EDABoard.com

Sponsor

Sponsor

Design Fast


×
Top