Hi,
I am converting F28335 McBSP to SPI for EEPROM 25LC320A. I saw a voltage and current on SI, SCLK and !CS. I use external CS instead of FSX. !WP and !HOLD are permanently high. However, I see no current in the SO pin. I keep reading 0xFF because the SO pin enables pull-up. Am I doing anything wrong here? Please help.
Regards,
Here is how I initialize McBSPA GPIO
EALLOW;
/* Configure McBSP-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be McBSP functional pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 2; // GPIO20 is MDXA pin
GpioCtrlRegs.GPADIR.bit.GPIO20 = 1; //output
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 2; // GPIO21 is MDRA pin
GpioCtrlRegs.GPADIR.bit.GPIO21 = 0; //input
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 2; // GPIO22 is MCLKXA pin
GpioCtrlRegs.GPADIR.bit.GPIO22 = 1; //output
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2; // GPIO7 is MCLKRA pin (Comment as needed)
GpioCtrlRegs.GPADIR.bit.GPIO7 = 0; //input
//GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 1; // GPIO58 is MCLKRA pin (Comment as needed)
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 2; // GPIO23 is MFSXA pin
GpioCtrlRegs.GPADIR.bit.GPIO23 = 1; //output
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 2; // GPIO5 is MFSRA pin (Comment as needed)
GpioCtrlRegs.GPADIR.bit.GPIO5 = 0; //input
//GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 1; // GPIO59 is MFSRA pin (Comment as needed)
/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0; // Enable pull-up on GPIO20 (MDXA)
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0; // Enable pull-up on GPIO21 (MDRA)
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; // Enable pull-up on GPIO22 (MCLKXA)
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up on GPIO7 (MCLKRA) (Comment as needed)
//GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; // Enable pull-up on GPIO58 (MCLKRA) (Comment as needed)
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0; // Enable pull-up on GPIO23 (MFSXA)
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (MFSRA) (Comment as needed)
//GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; // Enable pull-up on GPIO59 (MFSRA) (Comment as needed)
/* Set qualification for selected input pins to asynch only */
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3; // Asynch input GPIO21 (MDRA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 3; // Asynch input GPIO22 (MCLKXA)
GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 3; // Asynch input GPIO7 (MCLKRA) (Comment as needed)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // Asynch input GPIO58(MCLKRA) (Comment as needed)
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3; // Asynch input GPIO23 (MFSXA)
GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3; // Asynch input GPIO5 (MFSRA) (Comment as needed)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // Asynch input GPIO59 (MFSRA) (Comment as needed)
EDIS;
Here is how I convert McBSPA to SPI
// McBSP-A register settings
McbspaRegs.SPCR2.all=0x0000; // Reset FS generator, sample rate generator & transmitter
McbspaRegs.SPCR1.all=0x0000; // Reset Receiver, Right justify word, Digital loopback dis.
//To do: check this later. CLKRM and FSRM seem to be don't care in CLK STOP mode.
McbspaRegs.PCR.all=0x0F08; //(CLKXM=CLKRM=FSXM=FSRM= 1, FSXP = 1, SCLKME =0)
//delete later. For testing only
McbspaRegs.SPCR1.bit.DLB = 0;
McbspaRegs.SPCR1.bit.CLKSTP =2; //Clock stop mode 10b low inactive state
McbspaRegs.PCR.bit.CLKXP =0; //transmit data on the rising edge of CLKX and
McbspaRegs.PCR.bit.CLKRP =0; //receive data on the falling edge of MCLKR
McbspaRegs.RCR2.bit.RDATDLY=01; // FSX setup time 1 in master mode. 0 for slave mode (Receive)
McbspaRegs.XCR2.bit.XDATDLY=01; // FSX setup time 1 in master mode. 0 for slave mode (Transmit)
McbspaRegs.RCR1.bit.RWDLEN1=0; //0--8bit, 2--16bit, 5--32bit
McbspaRegs.XCR1.bit.XWDLEN1=0; //0--8bit, 2--16bit, 5--32bit
McbspaRegs.SRGR2.all=0x2000; // CLKSM=1, FSGM =0, FPER=1
McbspaRegs.SRGR1.all =0x0063; // CLKG period, CLKGDV=16, frame width=1
McbspaRegs.XCR1.bit.XFRLEN1 =0; //transmit frame length = 1 serial word
McbspaRegs.RCR1.bit.RFRLEN1 =0; //receive frame length = 1 serial word
McbspaRegs.XCR2.bit.XPHASE =0; //single-phase transmit frame
McbspaRegs.RCR2.bit.RPHASE =0; //single-phase receive frame
//============ Enable ===============
DelayUs(100);
McbspaRegs.SPCR2.bit.GRST=1; //Enable sample rate generator
DelayUs(100); //wait 100us
McbspaRegs.SPCR2.bit.XRST=1; //Enable TX
McbspaRegs.SPCR1.bit.RRST=1; //Enabke RX
McbspaRegs.SPCR2.bit.FRST=1; //Frame sync generator reset
EDIS;
Here is how send and receive values to/from EEPROM
eepromCS();
while( McbspaRegs.SPCR2.bit.XRDY == 0 ) {}
McbspaRegs.DXR1.all= EEPROM_READ_INSTR;
while( McbspaRegs.SPCR1.bit.RRDY == 0 ) {}
rdata1 = McbspaRegs.DRR1.all;
while( McbspaRegs.SPCR2.bit.XRDY == 0 ) {}
McbspaRegs.DXR1.all= ((address & 0xFF00) >>8); //address MSB first
while( McbspaRegs.SPCR1.bit.RRDY == 0 ) {}
rdata1 = McbspaRegs.DRR1.all;
while( McbspaRegs.SPCR2.bit.XRDY == 0 ) {}
McbspaRegs.DXR1.all= (address & 0x00FF); //address LSB
while( McbspaRegs.SPCR1.bit.RRDY == 0 ) {}
rdata1 = McbspaRegs.DRR1.all;
while( McbspaRegs.SPCR2.bit.XRDY == 0 ) {}
McbspaRegs.DXR1.all= 0xA5; //dummy
while( McbspaRegs.SPCR1.bit.RRDY == 0 ) {}
rdata1 = McbspaRegs.DRR1.all;
while( McbspaRegs.SPCR2.bit.XRDY == 0 ) {}
McbspaRegs.DXR1.all= 0xB5; //dummy
while( McbspaRegs.SPCR1.bit.RRDY == 0 ) {}
rdata1 = McbspaRegs.DRR1.all;
eepromDS();