Home/Support/Support Forum/RCM6000 SPI on Port C
Welcome to Digi Forum, where you can ask questions and receive answers from other members of the community.

RCM6000 SPI on Port C

0 votes
Dynamic C 10.72D, RCM6700 as SPI master, using SPI.LIB on serial port C. MCLK on PD2, MOSI on PC3, MISO on PC2.
On the Oscilloscope, I can see all signals, both those sent from the RCM6700, and the SDO from the device. (I tested the hardware by writing my own bit-bang version and it works but its way too slow) For the test, I slowed the MCLK down using the SPI_CLK_DIVISOR so it runs about as fast as my bit-bang. The device in the test is a 12-bit ADC from microchip, MCP3208.

I send data, but data that I read mirrors what I sent, not what the device sent. I am clearly missing something about the reception of the data

Code used to test -
#define CLOCK_PORT D #define CLOCK_BIT 2 #define SPI_SER_C #define SPI_RX_PORT SPI_RX_PC #define SPI_CLK_DIVISOR 200 #define SPI_CLOCK_MODE 0 #use SPI.LIB void main( void ){ char data[80], Dst[80]; char control; char channel; char ndata; char len; WrPortI( SPCR, &SPCRShadow, 0x84 ); // Parallel port A is a byte-wide output. used for CS BitWrPortI( PDDDR, &PDDDRShadow, 1, 2 ); // MCLK output BitWrPortI( PDDCR, &PDDCRShadow, 0, 2 ); // MCLK drive high-low BitWrPortI( PCDDR, &PCDDRShadow, 1, 3 ); // MOSI or SDI is an output BitWrPortI( PCDCR, &PCDCRShadow, 0, 3 ); // MOSI drive high-low BitWrPortI( PCDDR, &PCDDRShadow, 0, 2 ); // MISO or SDO is an input BitWrPortI(PCFR, &PCFRShadow,1,2); // special function the PC2 pin for MISO BitWrPortI(PCFR, &PCFRShadow,1,3); // special function the PC3 pin for MOSI WrPortI(PCALR, &PCALRShadow, RdPortI(PCALR) & ~0xF0); // alternate PC2, PC3 as TXC and RXC // special function the PD2 pin for MCLK on SCLKC BitWrPortI(PDFR, &PDFRShadow,1,2); WrPortI(PDALR, &PDALRShadow, RdPortI(PDALR) & ~0x30); // alternate select PD2 as SCLKC SPIinit(); SPImode(0); channel=7; control = ( 0x10+0x08+( channel & 0x07 ) ); while(1){ costate{ data[0] = control>>2; data[1] = control<<6; data[2] = 0x00; len = 3; WrPortI( PADR, &PADRShadow, ~(1<<3) ); SPIWrRd( (char *) data, (char *) &Dst, ndata ); WrPortI( PADR, &PADRShadow, 0xFF ); for(ndata=0;ndata<len;ndata++) printf("0x%02X ",Dst[ndata]); printf("\r\n"); waitfor(DelayMs(100)); } } }

Suggestions appreciated
asked May 11, 2021 in Rabbit Software by Henrik New to the Community (9 points)

Please log in or register to answer this question.

2 Answers

0 votes
Is this code based on Samples/SPI/spi_a2d-1.c, written for an LTC1294? It looks like a similar protocol, and you might be able to modify that sample to get it working with your hardware.

In your code where you're setting PxALR registers, I think you should be using the shadow register instead of reading the register before modifying it.

WrPortI(PDALR, &PDALRShadow, PDALRShadow & ~0x30);

And with your chip select, you could use BitWrPortI() to toggle just the bit you're interested in. Your current code doesn't respect the other bits (always sets to 1), ignoring the values from in PADRShadow.
answered May 11, 2021 by TomCollins Veteran of the Digi Community (2,298 points)
0 votes
Hi Tom

On the use of PADR - I have a CS line on each of the pins on PADR so I select only 1 by setting all others to 1.

I think I did something very obviously wrong - my RX and TX are on the wrong pins for the SPI library.

MISO should be on PC3 and MOSI on pin PC2 :[
answered May 13, 2021 by Henrik New to the Community (9 points)
So did it start working once you swapped the pins?