View previous topic :: View next topic |
Author |
Message |
uN_Eof
Joined: 17 May 2010 Posts: 29 Location: I live in Spain, with the toros, paella and tortilla
|
Slave SPI out of sync |
Posted: Tue Aug 30, 2011 2:11 pm |
|
|
Hello all.
I am trying to both send and receive data from an SPI interface but the data I send is always out of sync. Here is the code:
Code: | #ifndef _libds
#define _libds
#endif
unsigned int command; //command rcv'd by spi
void dsconf(){
input(DSATT);
input(DSCMD);
input(DSCLK);
setup_spi(SPI_SLAVE | SPI_H_TO_L | SPI_XMIT_L_TO_H);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
}
unsigned int revbits(unsigned int x) {
unsigned int h = 0;
int i = 0;
for(h = i = 0; i < 8; i++) {
h = (h << 1) + (x & 1);
x >>= 1;
}
return h;
}
void ack(unsigned int us){
output_low(DSACK);
delay_us(us);
input(DSACK);
}
void write(unsigned int data, int doack = 1){
//delay_us(2);
SSPBUF = data;
//if(doack)
// ack(3);
}
int _sspbuf() {
return SSPBUF;
}
#INT_SSP
void libds_isr(){
ack(3);
command = revbits(_sspbuf()); //IMPORTANT
if(command == 0x00){
output_high(GREEN_LED);
}
switch(command){
case 0x01:
write(0x41);
break;
case 0x00:
write(0xFF);
break;
case 0x42:
write(0x5A);
break;
}
} |
My main
Code: | void main(){
setup_oscillator(OSC_32MHZ);
dsconf();
write(0xFF);
do{/*if(bytecount < 1) write(0xFF,0);*/ }while(1);
//do{output_LOW(GREEN_LED);delay_ms(1000);output_high(GREEN_LED);delay_ms(1000);}while(1);
} |
And here is an example of out of sync communication attempt:
Thanks in advance. |
|
|
uN_Eof
Joined: 17 May 2010 Posts: 29 Location: I live in Spain, with the toros, paella and tortilla
|
|
Posted: Thu Sep 15, 2011 12:08 pm |
|
|
nobody?
I'm totally desperate. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 15, 2011 1:57 pm |
|
|
The reason you didn't get a reply is because too many important things
are missing from your post. You didn't tell us what the Master is. Is
another PIC ? If so, where's the code for it ?
You didn't tell us what PIC you are using for the slave. Or your compiler
version.
From your setup_spi() statement for the slave, it's clear that the Slave PIC
uses the \SS pin. But we don't see any Master code, so we don't know if
you're toggling the Master's slave select line. Also, your logic analyzer
diagram doesn't show a \SS signal. So we are left wondering just what
you are doing ?
You are also using this construct which is an ANSI C data structures
library, which we don't normally see used in CCS programming.
Quote: | #ifndef _libds
#define _libds
#endif
|
Here you are using an access routine to read the SSPBUF. It's not totally
clear why you're doing this. One can speculate, but it is unusual in CCS.
Quote: |
int _sspbuf() {
return SSPBUF;
} |
Your post comes across as incomplete or strange and that's why you
didn't get any replies so far. |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Thu Sep 15, 2011 2:02 pm |
|
|
does this new situation have any relationship to the old
Slave SPI Inhibits SCK
you posted
???? |
|
|
uN_Eof
Joined: 17 May 2010 Posts: 29 Location: I live in Spain, with the toros, paella and tortilla
|
|
Posted: Fri Sep 16, 2011 8:51 am |
|
|
PCM programmer wrote: | The reason you didn't get a reply is because too many important things
are missing from your post. You didn't tell us what the Master is. Is
another PIC ? If so, where's the code for it ?
You didn't tell us what PIC you are using for the slave. Or your compiler
version.
From your setup_spi() statement for the slave, it's clear that the Slave PIC
uses the \SS pin. But we don't see any Master code, so we don't know if
you're toggling the Master's slave select line. Also, your logic analyzer
diagram doesn't show a \SS signal. So we are left wondering just what
you are doing ?
You are also using this construct which is an ANSI C data structures
library, which we don't normally see used in CCS programming.
Quote: | #ifndef _libds
#define _libds
#endif
|
Here you are using an access routine to read the SSPBUF. It's not totally
clear why you're doing this. One can speculate, but it is unusual in CCS.
Quote: |
int _sspbuf() {
return SSPBUF;
} |
Your post comes across as incomplete or strange and that's why you
didn't get any replies so far. |
Hello, first of all sorry for the incompleteness.
My PIC18F4620 is slave. I am connecting to a Play Station 2, and my PIC is supposed to emulate the controller. The PS2 to dualshock2 (ds2 from now, the ps2 standard controller) protocol uses SPI with some slight modifications to the protocol. This modification is simple: after getting a byte from the PS2 the DS2 has to pull low a line for 3 or 4 us, thats all, as far as I know.
As long as my logic analyzer is a Pickit2 I only have 3 channels to sample at the same time. I know \SS is OK because its low when the clock cycles are done (I used the logic analyzer).
I removed the lines you mentioned in my code.
I used routine to access SSPBUF just in case I had to change something (like doing something prior to reading or things like that) each time I
read it.
Sorry again for being incomplete, and thanks. I hope the information I gave above helps.
asmboy wrote: | does this new situation have any relationship to the old
Slave SPI Inhibits SCK
you posted
???? |
I think it doesn't. That was because I wrote this:
Code: | setup_spi(SPI_SLAVE);
setup_spi(SPI_H_TO_L);
setup_spi(SPI_XMIT_L_TO_H); |
instead of this:
Code: | setup_spi(SPI_SLAVE | SPI_H_TO_L | SPI_XMIT_L_TO_H); |
Thanks again. |
|
|
uN_Eof
Joined: 17 May 2010 Posts: 29 Location: I live in Spain, with the toros, paella and tortilla
|
|
Posted: Sun Sep 18, 2011 2:31 pm |
|
|
Still missing some info? Please tell me, I really need help.
Thanks in advance. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Sep 18, 2011 3:02 pm |
|
|
Quote: |
My PIC18F4620 is slave. I am connecting to a Play Station 2, and my PIC
is supposed to emulate the controller. The PS2 to dualshock2 (ds2 from
now, the ps2 standard controller) protocol uses SPI with some slight
modifications to the protocol. |
1. Post a link to documentation for the Playstation SPI Master, if it's available.
Quote: | I removed the lines you mentioned in my code.
|
2. Post your current complete 18F4620 SPI slave test program.
We should be able to copy and paste it into MPLAB and have it compile
with no changes, and no errors. It should have the #include for the PIC,
#fuses, #use delay, other #use library lines. It should have a main(),
all necessary #defines and variable declarations.
3. What's your CCS compiler version ? It's given at the top of the .LST
file, which will be in your project directory after a successful compilation.
Version numbers look like this:
http://www.ccsinfo.com/devices.php?page=versioninfo
4. What's the Vdd voltage of the 18F4620 PIC ?
5. What are the signal voltage levels of the Playstation ? Are they 3.3v
or are they 5v levels ? |
|
|
uN_Eof
Joined: 17 May 2010 Posts: 29 Location: I live in Spain, with the toros, paella and tortilla
|
|
Posted: Mon Sep 19, 2011 2:14 pm |
|
|
1. This one is one of the best and also the one in which I based my design: http://store.curiousinventor.com/guides/ps2
And I think I found the problem. The PS2 receives and sends data in the same edge of the clock cycle (you can see this in the first o-oscope shoot), and the MSSP module can't handle this.
2. I'll post all my code if you tell me so after reading the above info.
3. 4.013
4. Exact same as the actual PS2 controller. 3v3. And it's a PIC18LF4620 (I didn't mention the L as I wasn't requesting hardware help, but it's good to know).
5. 3v3 levels.
I don't want to be tough or rude not posting my code, please understand that I don't want to waste my time copying my code here if the problem has no solution as the problem is in the PIC's internal hardware.
Thank you so much. |
|
|
|