|
|
View previous topic :: View next topic |
Author |
Message |
chrisa
Joined: 28 Oct 2009 Posts: 4
|
18F67J50 SPI2 |
Posted: Wed Oct 28, 2009 11:58 am |
|
|
Hello, I'm working with a 18F67J50. I want to interface with an SD card over the SPI2 port (port D pins). I have successfully targeted the 18F6722 and am porting to the J50 because of the need for USB.
The problem is I never see any activity on the clock pin (D6) at all.
The SPI1 port works.
Before posting code and such, has anyone ever encountered problems with the 18F67J50 and SPI2?
BTW, I'm using the #use spi version not setup_spi2
#use spi(MASTER,CLK=MMCSD_PIN_SCL, DO=MMCSD_PIN_SDO, DI=MMCSD_PIN_SDI, BITS=8, MODE=3, stream=mmcsd_spi, FORCE_HW) |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 28, 2009 4:02 pm |
|
|
Post your compiler version. It's given at the top of the .LST file.
It's a 4-digit number in this format: x.xxx |
|
|
chrisa
Joined: 28 Oct 2009 Posts: 4
|
|
Posted: Thu Oct 29, 2009 7:11 am |
|
|
The compiler version is 4.099 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Oct 29, 2009 11:12 am |
|
|
Quote: | #use spi(MASTER,CLK=MMCSD_PIN_SCL, DO=MMCSD_PIN_SDO, DI=MMCSD_PIN_SDI, BITS=8, MODE=3, stream=mmcsd_spi, FORCE_HW) |
Post the #define statements for these 3 pins. |
|
|
chrisa
Joined: 28 Oct 2009 Posts: 4
|
|
Posted: Thu Oct 29, 2009 11:41 am |
|
|
#define MMCSD_PIN_SCL PIN_D6 //o
#define MMCSD_PIN_SDI PIN_D5 //i
#define MMCSD_PIN_SDO PIN_D4 //o
#define MMCSD_PIN_SELECT PIN_D7 //o
The program uses mmcsd.c written by CCS as the driver to an mmc card |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Oct 29, 2009 3:07 pm |
|
|
It's buggy. It's accessing the wrong registers for SPI2. I compiled it
with vs. 4.099 and looked at the .LST file. Here's the code that is
supposed to write to SSPBUF2 to do the transfer:
Code: |
.... #use spi(MASTER, CLK=MMCSD_PIN_SCL, DO=MMCSD_PIN_SDO, DI=MMCSD_PIN_SDI, BITS=8, MODE=3, stream=mmcsd_spi, FORCE_HW)
00004: MOVF F66,W // PMDIN1L (*** Bug - should be SSP2BUF)
00006: MOVFF 07,F66 // PMDIN1L (*** Bug - should be SSP2BUF)
0000A: BTFSS F64.0 // USTAT (*** Bug - should be SSP2STAT)
0000C: BRA 000A
0000E: MOVFF F66,01 // PMDIN1L (*** Bug - should be SSP2BUF)
00012: GOTO 004E (RETURN)
|
The start-up code is also partially incorrect:
Code: |
00020: BCF F95.4
00022: BSF F95.5
00024: BCF F95.6
00026: MOVLW 30
00028: MOVWF F63 // UEIR (*** Bug - should be SSP2CON1)
0002A: MOVLW 00
0002C: MOVWF F64 // USTAT (*** Bug - should be SSP2STAT)
|
spi_write2() does access the correct registers. However, the mmcsd.c
file is written for spi_xfer(), so this doesn't help directly.
Code: |
... spi_write2(0x55);
00064: MOVF F6F,W // SSP2BUF
00066: MOVLW 55
00068: MOVWF F6F // SSP2BUF
0006A: RRCF F6D,W // SSP2STAT
0006C: BNC 006A
|
However, I think you can do a work-around by doing this:
1. Comment out the #use spi() statement in the mmcsd.c file.
2. Setup the SPI mode, etc., with a setup_spi2() statement near the
start of main() in your application program. I looked at the .LST file,
and setup_spi2() to work OK.
3. Write your own spi_xfer() routine (that works). Put it above the
#include line for the mmcsd.c file.
Here's a framework for the work-around:
Code: |
#include <18F67J50.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
// SPI mode definition.
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
// We need a dummy stream for our own spi_xfer() function.
#define mmcsd_spi 1
// This spi_xfer() replaces the built-in function,
// which is buggy in vs. 4.099 for the 18F67J50
// when using #use spi() with SPI2.
int8 spi_xfer(int8 stream, int8 data)
{
int8 retval;
retval = spi_read2(data);
return(retval);
}
#define MMCSD_PIN_SCL PIN_D6 // o
#define MMCSD_PIN_SDI PIN_D5 // i
#define MMCSD_PIN_SDO PIN_D4 // o
#define MMCSD_PIN_SELECT PIN_D7 // o
// Remember to comment out both #use spi() statements in mmcsd.c
#include <mmcsd.c>
//======================================
void main(void)
{
int8 result;
setup_spi2(SPI_MASTER | SPI_MODE_3 | SPI_CLK_DIV_4);
mmcsd_init();
// Put other mmcsd function calls here.
while(1);
}
|
|
|
|
chrisa
Joined: 28 Oct 2009 Posts: 4
|
|
Posted: Fri Oct 30, 2009 1:11 pm |
|
|
Thank you for the help. Although this instance still isn't working, we are seeing a clock and data on the pins. That was the first obstacle. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|