CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

#pin_select for HW SPI problem

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Desert Leo



Joined: 08 Jun 2011
Posts: 7

View user's profile Send private message

#pin_select for HW SPI problem
PostPosted: Thu Mar 11, 2021 5:33 am     Reply with quote

MPLAB X IDE v5.30
CCS C v5.061
PIC24FJ1024GA606
Code:

#pin_select SCK1OUT = PIN_G7
#pin_select SDI1 = PIN_G6
#pin_select SDO1 = PIN_G8
#use spi(MASTER, SPI1, MODE = 0, BAUD = 1000000)

getenv("SPI1_CLK") return 14050 = PIN_G2
getenv("SPI1_DI") return 14051 = PIN_G3
getenv("SPI1_DO") return 14050 = PIN_G2

What I am missing?
temtronic



Joined: 01 Jul 2010
Posts: 9106
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Mar 11, 2021 5:39 am     Reply with quote

I don't use that PIC, or any PPI ones but....

maybe #USE SPI ( ..), needs a 'use hardware' option ?
I've read hear that other PICs, you have to specify HW, otherwise the compiler creates SW to run the peripheral.

just a guess, without seeing rest of program or what error you're getting.
also maybe 1MHz is too fast for the attached peripheral device ??
Desert Leo



Joined: 08 Jun 2011
Posts: 7

View user's profile Send private message

PostPosted: Thu Mar 11, 2021 5:54 am     Reply with quote

Code:

#pin_select SCK1OUT = PIN_G7
#pin_select SDI1 = PIN_G6
#pin_select SDO1 = PIN_G8
#use spi(MASTER, FORCE_HW, SPI1, CLK = PIN_G7, DO = PIN_G8, DI = PIN_G6, MODE = 0, BAUD = 1000000)

Same result.

Only:
Code:

#use spi(MASTER, FORCE_HW, SPI1, CLK = PIN_G7, DO = PIN_G8, DI = PIN_G6, MODE = 0, BAUD = 1000000)

Gives Error#99 Option invalid SPI unit not assigned, use #PIN_SELECT

In the same code #pin_select and #use rs232 select correct pins.

SPI peripheral is 23K640-I/SN (max 20MHz clock @ 3,0V) powered from 3,3V LDO.
Ttelmah



Joined: 11 Mar 2010
Posts: 19221

View user's profile Send private message

PostPosted: Thu Mar 11, 2021 7:36 am     Reply with quote

The problem is that 'getenv', is a preprocessor command, returning the
default pin allocation. It knows nothing about PIN SELECT operations that
have been performed.
I don't know why you want to use getenv like this. Simplest way is to
make your own allocations for the PIN numbers, and then use these
allocations for your PIN SELECT operation, and the same allocations will
be right in place of whatever you are using getenv for here.
So something like:
Code:

#define SSP1CK PIN_G7
#define SSP1DI PIN_G6
#define SSP1DO PIN_G8

#PIN_SELECT SCK1OUT=SSP1CK
#PIN_SELECT SCK1IN=SSP1CK //Beware some chips need this selected
#PIN_SELECT SDI1=SSP1DI
#PIN_SELECT SDO1=SSP1DO
#use spi(MASTER, SPI1, MODE = 0, BAUD = 1000000)

//Then for whatever you were using the getenv for, you can just use
//SSP1CK etc..

Note that I setup the SCK1CKIN as well. On some chips the shift register
for input data is not clocked unless this is done. These are the ones where
the SPI allows separate input and output clocks.
Desert Leo



Joined: 08 Jun 2011
Posts: 7

View user's profile Send private message

PostPosted: Tue Mar 16, 2021 4:41 am     Reply with quote

Final result: getenv() is not working with parameters "SPIх_CLK", "SPIх_DI" or SPIх_DO", but with "UARTx_RX" and "UARTx_TX" is working perfect.
RPx pin mapping can be checked by reading RPINRх and RPORх registers.
temtronic



Joined: 01 Jul 2010
Posts: 9106
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Mar 16, 2021 6:04 am     Reply with quote

re: These are the ones where
the SPI allows separate input and output clocks.

hmm....curious.. does this allow you to clock in data faster than clocking out data ? Not too sure why anyone would want to ..... and do these PICs have 2 clock pins ?
just curious..new PICs are just too complcated !
Ttelmah



Joined: 11 Mar 2010
Posts: 19221

View user's profile Send private message

PostPosted: Tue Mar 16, 2021 8:15 am     Reply with quote

I think they are all PPS chips, so the clocks can be set to different pins.
The key is that the connection back to the incoming shift register is
separate to the obe to the outgoing register. So 'yes', it potentially
would allow different rates in different directions. However given that
on SPI a byte is normally clocked in while another is clocked out, how
the logic of the actual functions would work, gets scarey!...
I met is because like the original poster here, I just setup a single clock
and then found data was not being clocked back in. Sad
Desert Leo



Joined: 08 Jun 2011
Posts: 7

View user's profile Send private message

PostPosted: Tue Mar 16, 2021 8:37 am     Reply with quote

This
Code:

#pin_select SDI1 = PIN_G6
#pin_select SDO1 = PIN_G8
#pin_select SCK1OUT = PIN_G7
#use spi(MASTER, SPI1, MODE = 0)

SPI setup gives:
RPINR20 = 0b 00011010 00010101
6 of LS bits in MS byte (011010 = 26) set SPI_1_CLK_IN to RP26 (PIN_G7)
6 of LS bits in LS byte (010101 = 21) set SPI_1_DI to RP21 (PIN_G6)

RPOR9 = 0b 00000111 00000000
6 of LS bits in MS byte (000111 = 7) set RP19 (PIN_G8) to be SPI_1_DO

RPOR13 = 0b 00000000 00001000
6 of LS bits in LS byte (001000 = 8) set RP26 (PIN_G7) to be SPI_1_CLK_OUT.

So, in MSTER mode CLK_IN and CLK_OUT are connected together automatically by setup.

If in setup MASTER is replaced by SLAVE, only difference is that RPOR13 is cleared, so SPI_1_CLK_OUT is not connected.

By default RPINRx registers are set to 0x3F3F that corresponds to RP63 - out of valid RPx range and RPORx registers are cleared - not used.

Probably is possible to set CLK_IN and CLK_OUT to separate pins by directly writing in related registers after issuing OSCCON unlock sequence. This separation could be used for transmitting without receiving and receiving without transmitting. This is not my case.
Ttelmah



Joined: 11 Mar 2010
Posts: 19221

View user's profile Send private message

PostPosted: Tue Mar 16, 2021 8:59 am     Reply with quote

You are slightly missing the point.

There are some chips, where this connection is not automatically made.
I hit one a little while ago, and found you had to make the clock in connection
as well as the clock out for it to work correctly.
So on the basis that it costs nothing to tell the compiler to make both, 'it is
safer' to get into the habit of always making both. Even if your chip does not
need this.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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