|
|
View previous topic :: View next topic |
Author |
Message |
saran Guest
|
spi problem |
Posted: Wed Aug 15, 2007 11:03 pm |
|
|
hi
i am new to this ccs
i am now trying to communicate b/w to pics using spi and i have written code , but master is not clk signal
can anyone help
[#include<18F452.h>
//#use spi(FORCE_HW, BITS=8, stream=SPI_STREAM)
#use delay(clock=10000000)
#include<lcd.c>
#fuses HS,NOWDT,NOPROTECT//,NOLVP,PUT
#define CS PIN_A5
#define DA PIN_C5
#define DI PIN_C4
#define CLK PIN_C3
void main()
{
int16 a,b;
SET_TRIS_A(0x00);
SET_TRIS_C(0x10);
SET_TRIS_B(0x00);
b=0;
lcd_init();
lcd_gotoxy(1,1);
//output_high(DA);
// output_high(CLK);
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
while(TRUE)
{
output_high(CS);
spi_write(b);
a=spi_read();
output_low(CS);
printf(lcd_putc,"%lu",a);
b=b+1;
delay_ms(100);
}
}
]
[#include<18f4455.h>
#use delay(clock=10000000)
#include<lcd.c>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#define CS PIN_A0
#define DA PIN_C7
#define DI PIN_B0
#define CLK PIN_B1
void main()
{
int16 i;
SET_TRIS_A(0x00);
SET_TRIS_C(0x00);
SET_TRIS_B(0x01);
lcd_init();
lcd_gotoxy(1,1);
//output_high(DA);
//output_high(CLK);
// output_high(CS);
setup_spi(SPI_SLAVE | SPI_L_TO_H | SPI_CLK_DIV_16);
while(1)
{
i=spi_read();
spi_write(i);
}
}
] |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Thu Aug 16, 2007 1:52 am |
|
|
When posting code please use the 'code' buttons in order to preserve the layout.
in your master change toThe reason for this change is that the master is the only device that can generate clock signals on a SPI bus. When you write data to a slave the SPI bus is reading data from the slave at the same time.
Calling spi_read() without a parameter is returning the last read value (no clock signals). Calling spi_read(x) with a parameter will generate clock signals for writing value x and returns you a new value from the slave.
The slave will never generate clock pulses which makes the line below an invalid setup combination Code: | setup_spi(SPI_SLAVE | SPI_L_TO_H | SPI_CLK_DIV_16);
| change to Code: | setup_spi(SPI_SLAVE | SPI_L_TO_H);
|
Do you have the Chip Select line from the master is connected to PIN_A5 on the slave? |
|
|
saran Guest
|
still no change |
Posted: Thu Aug 16, 2007 3:38 am |
|
|
Thanku for ur reply
still there is no change
the clock is not generating (on seeing on oscilloscope)
I am getting only constant high signal on clk pin
i have the SS pins too |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Thu Aug 16, 2007 3:56 am |
|
|
What is your compiler version?
Are you sure your processor is running? For example try toggling an I/O pin with a LED connected.
Set the NOLVP fuse again. At least 99% of the people don't use a low voltage programmer and than this is a dangerous feature. With LVP activated a high level voltage on PIN_B5 will cause your processor to stop. |
|
|
saran Guest
|
no problem in programming |
Posted: Thu Aug 16, 2007 4:30 am |
|
|
I have tested the ic a
its working
i dont know , where the problem lies |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Thu Aug 16, 2007 4:43 am |
|
|
No clock on the SPI bus means the master has a problem.
Try the very simple program below and see if you do get a clock signal. Code: | #include<18F452.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP, PUT
#use delay(clock=10000000)
void main()
{
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
while(TRUE)
{
spi_write(0xAA); // 0xAA has no special meaning but has every bit different.
delay_ms(100);
output_toggle(PIN_A5); // added so you can check the chip is running
}
} |
Besides the missing clock there is a problem with your chip select signal to the slave. The SS line is active low while you have it now designed for active high.
Again, what is your compiler version? |
|
|
saran Guest
|
no change |
Posted: Fri Aug 17, 2007 1:00 am |
|
|
i am not getting the expected value (AA)
i am getting some garbage values
i am using PCWH version |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
Re: no change |
Posted: Fri Aug 17, 2007 1:29 am |
|
|
saran wrote: | i am not getting the expected value (AA)
i am getting some garbage values | At least this means there is a clock. How are you checking the sent data? The slave code you posted has no method for displaying the received data.
How is your electrical connection between the master and slave? Which pins are connected?
Are both master and slave running at the same voltage?
Quote: | i am using PCWH version | The version number has 4 digits, something like 3.249 or 4.050. You can find this number on top of the list file (*.lst) or by using the 'Compiler version' tool (Start/Programs/PIC-C/Compiler version). |
|
|
saran Guest
|
spi... |
Posted: Fri Aug 17, 2007 3:12 am |
|
|
CCS PCH C Compiler, Version 3.249, 28193 .
This is the compiler version ,i am using
I am same power supply for both the PICs
master 18f452
slave 18f4455
both the ss are connected
SDO of master is connected to SDI of slave
SDI of master is connected to SDO of slave
both the clocks are connected
Here is my modified code Code: |
#include<18F452.h>
#use delay(clock=10000000)
#include<lcd.c>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#define CS PIN_A5
#define DA PIN_C5
#define DI PIN_C4
#define CLK PIN_C3
void main()
{
int16 a,b;
SET_TRIS_A(0x00);
SET_TRIS_C(0x10);
SET_TRIS_B(0x00);
b=0;
lcd_init();
lcd_gotoxy(1,1);
lcd_putc('T');
lcd_putc('X');
lcd_gotoxy(1,2);
lcd_putc('R');
lcd_putc('X');
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4);
while(TRUE)
{
lcd_gotoxy(4,1);
printf(lcd_putc,"%lu",b);
output_high(CS);
spi_write(b);
a=spi_read(0);
output_low(CS);
lcd_gotoxy(4,2);
printf(lcd_putc,"%lu",a);
b=b+1;
delay_ms(500);
}
}
|
slave code
Code: |
#include<18f4455.h>
#use delay(clock=10000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#define CS PIN_A5
#define DA PIN_C7
#define DI PIN_B0
#define CLK PIN_B1
void main()
{
int16 i,a=999;
SET_TRIS_A(0x21);
SET_TRIS_C(0x00);
SET_TRIS_B(0x03);
setup_spi(SPI_SLAVE | SPI_H_TO_L );
while(1)
{
i=spi_read(0);
// delay_ms(50);
spi_write(i);
delay_ms(400);
//a--;
}
}
| [/quote] |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
Re: no change |
Posted: Fri Aug 17, 2007 3:19 am |
|
|
saran wrote: | i am not getting the expected value (AA)
i am getting some garbage values | At least this means there is a clock. How are you checking the sent data? The slave code you posted has no method for displaying the received data.
How is your electrical connection between the master and slave? Which pins are connected?
Are both master and slave running at the same voltage?
Quote: | i am using PCWH version | The version number has 4 digits, something like 3.249 or 4.050. You can find this number on top of the list file (*.lst) or by using the 'Compiler version' tool (Start/Programs/PIC-C/Compiler version). |
|
|
saran Guest
|
nc |
Posted: Fri Aug 17, 2007 3:38 am |
|
|
CCS PCH C Compiler, Version 3.249, 28193 .
This is the compiler version ,i am using
I am same power supply for both the PICs
master 18f452
slave 18f4455
both the ss are connected
SDO of master is connected to SDI of slave
SDI of master is connected to SDO of slave
both the clocks are connected
Here is my modified code
Master code\
Code: |
#include<18F452.h>
#use delay(clock=10000000)
#include<lcd.c>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#define CS PIN_A5
#define DA PIN_C5
#define DI PIN_C4
#define CLK PIN_C3
void main()
{
int16 a,b;
SET_TRIS_A(0x00);
SET_TRIS_C(0x10);
SET_TRIS_B(0x00);
b=0;
lcd_init();
lcd_gotoxy(1,1);
lcd_putc('T');
lcd_putc('X');
lcd_gotoxy(1,2);
lcd_putc('R');
lcd_putc('X');
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4);
while(TRUE)
{
lcd_gotoxy(4,1);
printf(lcd_putc,"%lu",b);
output_high(CS);
spi_write(b);
a=spi_read(0);
output_low(CS);
lcd_gotoxy(4,2);
printf(lcd_putc,"%lu",a);
b=b+1;
delay_ms(500);
}
}
|
slave code
Code: |
#include<18f4455.h>
#use delay(clock=10000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#define CS PIN_A5
#define DA PIN_C7
#define DI PIN_B0
#define CLK PIN_B1
void main()
{
int16 i,a=999;
SET_TRIS_A(0x21);
SET_TRIS_C(0x00);
SET_TRIS_B(0x03);
setup_spi(SPI_SLAVE | SPI_H_TO_L );
while(1)
{
i=spi_read(0);
// delay_ms(50);
spi_write(i);
delay_ms(400);
//a--;
}
}
|
|
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Fri Aug 17, 2007 8:09 am |
|
|
You are using a stable compiler version and the hardware setup looks correct.
Quote: | ... there is a problem with your chip select signal to the slave. The SS line is active low while you have it now designed for active high. | This bug is still present causing your slave never to become active when you are writing data. Reverse the output levels of the CS pin.
In the slaveI haven't looked at the assembly code for this, but all example code is only using the spi_read() functions in the slave. |
|
|
|
|
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
|