|
|
View previous topic :: View next topic |
Author |
Message |
nahumof
Joined: 09 Apr 2011 Posts: 15
|
|
Posted: Fri May 13, 2011 12:54 pm |
|
|
i really don't know the cause... but i try with all the mode configurations for master and slave and works with mode 3 for the slave and any mode for master!!! it just don't care!!!
master
#use spi (DO=PIN_D6,DI=PIN_D5,CLK=PIN_D4,MODE=3,BITS=8,MSB_FIRST)
mode 0 cause errors
mode=1 ok
mode=2 ok
mode=3 ok
slave
mode
setup_spi(SPI_SLAVE |SPI_MODE_0_0) return trash
setup_spi(SPI_SLAVE |SPI_MODE_0_1) return trash
setup_spi(SPI_SLAVE |SPI_MODE_1_0) also trash
setup_spi(SPI_SLAVE |SPI_MODE_1_1) WORKS!!! but it still send 1 byte delayed...
i still wonder what happens? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri May 13, 2011 12:59 pm |
|
|
Quote: | #use spi (DO=PIN_D6,DI=PIN_D5,CLK=PIN_D4,MODE=3,BITS=8,MSB_FIRST) |
You're using software i2c with the #use spi() library. The library code
could have bugs. |
|
|
nahumof
Joined: 09 Apr 2011 Posts: 15
|
|
Posted: Fri May 13, 2011 3:41 pm |
|
|
i guess that´s it...
i´m using SPI with software spi for master using #use spi() library and using SPI HW for slave using setup_spi(SPI_SLAVE |SPI_MODE_1_1); .... |
|
|
stoyanoff
Joined: 20 Jul 2011 Posts: 375
|
|
Posted: Wed Jul 20, 2011 6:49 am |
|
|
I have a problem. I'm using the program from the first post. I'm using mode 0 and only 2 chips. The pins are connected correctly, but the master recieves 1 bit less- if i send 2(10) he receive - 1 (01). Only the last bit is lost. Here is the code I'm using:
Master:
Code: | #include <18F4520.h>
#fuses HS,NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=12000000)
#use spi(master)
#define SPI_SS PIN_D7
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
int transmit(int data)
{
int result;
output_low(SPI_SS);
spi_write(data); // Send command to slave
output_high(SPI_SS);
delay_ms(1);
output_low(SPI_SS);
result = spi_read(0);
delay_ms(1); // Read response from slave
output_high(SPI_SS);
return result;
}
void main()
{
int result,d;
output_high(SPI_SS);
setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_4);
while(1){
result=transmit(51);
output_a(result);
delay_ms(1000);
output_a(0);
delay_ms(1000);
}
}
|
slave:
Code: |
#include <18F4520.h>
#fuses HS,NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=12000000)
#use spi(SLAVE)
#byte SSPBUF = 0x0FC9
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#int_ssp
void ssp_isr(void)
{
int8 comand,dop;
dop=read_eeprom(2);
comand=SSPBUF;
SSPBUF=dop;
write_eeprom(1,comand);
}
void main(){
int d,q;
setup_spi(spi_slave|SPI_L_TO_H | spi_clk_div_4);
output_high(PIN_E0);
clear_interrupt(INT_SSP);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
output_d(0);
output_high(PIN_E0);
output_low(PIN_E2);
output_low(PIN_E1);
write_eeprom(2,20);
while(1)
{
d=read_eeprom(1);
if(d!=0){
output_d(d);
delay_ms(500);
output_d(0);
write_eeprom(1,0);
q=read_eeprom(2);
q=q+2;
write_eeprom(2,q);
delay_ms(500);
}
}
}
|
This happens only in master's side. The slave receives everything correct.
Can you tell me where is the problem??? |
|
|
stoyanoff
Joined: 20 Jul 2011 Posts: 375
|
|
Posted: Wed Jul 20, 2011 8:28 am |
|
|
Can somebody post an example with software spi tranfer(i mean without using ISR)??? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Jul 20, 2011 12:25 pm |
|
|
Quote: |
#use spi(master)
setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_4);
|
These are two different methods of setting up the SPI module. Do not
mix the two methods. I suggest that you only use setup_spi().
Quote: | #use spi(SLAVE)
setup_spi(spi_slave|SPI_L_TO_H | spi_clk_div_4);
|
1. The same comment applies regarding mixing the two methods.
Delete the #use spi() line.
2. Also, don't change the case of constants. They should be kept in
UPPER CASE the same way they are given in the .h file.
3. Also, slaves don't use a clock divisor. The master supplies the clock.
Delete the clock divisor parameter.
4. Most importantly, you are using using a different SPI mode for the
slave. You must use the same SPI mode for both master and slave.
Quote: | I have a problem. I'm using the program form the first post. |
You have massively changed the code from that post.
There are other problems besides these, especially regarding using
write_eeprom() inside the #int_ssp isr. |
|
|
|
|
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
|