|
|
View previous topic :: View next topic |
Author |
Message |
abafin
Joined: 22 Aug 2011 Posts: 2
|
PIC24FJ256GB110 SPI Problem ! |
Posted: Mon Aug 22, 2011 5:02 am |
|
|
Hey everyone!
I have a problem and I don't know how I can solve. I have used spi communication for PIC18f2550 and 18f4550 before. But now, I'm using PIC24FJ256GB110 and I don't know how to use spi on this pic. I guess, I have to find spi header file because I can configure pic24fj256gb110's spi register, but I couldn't find it. Could you share spi header file for pic24fj256gb110 or have any idea ?
Thank you in advance... |
|
|
abafin
Joined: 22 Aug 2011 Posts: 2
|
|
Posted: Tue Aug 23, 2011 5:52 am |
|
|
my code is:
Code: |
#include <24fj256gb110.h>
#include <stdlib.h>
#include <spi_register.h>
#FUSES HS,NOWDT,NOJTAG,NOPROTECT,NOWRT,DEBUG,ICSP1,NOWDT,NOIESO,PR,NOCKSFSM,NOOSCIO
#PIN_SELECT SDO1=PIN_C3
#PIN_SELECT SDI1=PIN_C2
#PIN_SELECT SCK1OUT=PIN_C1
#use delay(clock=20000000)
#use spi(SPI1, MODE=3, MASTER, BITS=8, stream=SPIA)
void main()
{
setup_spi2(FALSE);
setup_spi3(FALSE);
setup_adc(ADC_OFF);
setup_adc_ports(NO_ANALOGS);
set_tris_a(0);
set_tris_c(4);
output_a(0);
output_c(0);
SPI1CON1=4414;
RPINR20=9767;
SPIROV=0;
SPIEN=1;
SRMPT=1;
while(1)
{
spi_write(0x66);
output_high(pin_a1);
delay_ms(500);
output_low(pin_a1);
delay_ms(500);
}
}
|
spi_register.h is;
Code: |
#WORD SPI1STAT = 0x0240
#WORD SPI1CON1 = 0x0242
#WORD SPI1BUF = 0x0248
#WORD RPINR20 = 0x06A8
#WORD RPINR21 = 0x06AA
#BIT SPIEN =SPI1STAT.15
#BIT SRMPT =SPI1STAT.7
#BIT SPIROV =SPI1STAT.6
#BIT DISSCK = SPI1CON1.12
#BIT DISSDO = SPI1CON1.11
#BIT MODE16 = SPI1CON1.10
#BIT SMP = SPI1CON1.9
#BIT CKE = SPI1CON1.8
#BIT SSEN = SPI1CON1.7
#BIT CKP = SPI1CON1.6
#BIT MSTEN = SPI1CON1.5
#BIT SPRE2 = SPI1CON1.4
#BIT SPRE1 = SPI1CON1.3
#BIT SPRE0 = SPI1CON1.2
#BIT PPRE1 = SPI1CON1.1
#BIT PPRE0 = SPI1CON1.0
|
where am i wrong ? |
|
|
miketwo
Joined: 04 Aug 2010 Posts: 24
|
|
Posted: Tue Aug 23, 2011 11:25 am |
|
|
I'm not an expert by any stretch, but I've messed around with SPI stuff before.
It seems like you're mixing and matching different methods. You have some #pin_selects, but no setup_spi(). And you have a #use spi, but then you're trying to set registers directly.
I wouldn't bother with trying to set the registers directly, unless you need to use all 3 SPI modules. It's a pain because the PIC24 requires an unlocking sequence to set them. See page 128 (Section 9.4.4.1) of the datasheet.
I would try using just the #use spi(), no pin selects or register-meddling, with the spi_xfer() function, and see if you have any luck with that. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Tue Aug 23, 2011 11:36 am |
|
|
As a first point, consult the compiler help file. You're mixing two different SPI access methods provided by PCD, and are adding various SFR accesses. I didn't check, if your code possibly works though, but SPI access can be done easier.
#USE_SPI and setup_spi/spi_read/spi_write are mutual exclusive. In my opinion, setup_spi is the better method for hardware access, allowing various things, that can't be done with #USE_SPI directly, e.g. changing the frequency (required for SD_Card) or mode (partly required for multi device access).
You normally won't need SFR accesses when using the CCS SPI functions. A somewhat confusing point is the mapping of CCS mode syntax to standard SPI modes, because it has changed between PCD versions. There have been also problems with spi_write() functionality in previous PCD versions. You can review forum posts related to PIC24 spi operation, or ask specifically. It won't be bad, if you are able to verify the operation of your SPI code, either by looking at the hardware signals or the register settings.
Below an SPI example, that works with old and new PCD versions
Code: | #IF getenv("VERSION")>=4.109
#define SPI_MODE_0 0x100
#define SPI_MODE_1 0
#define SPI_MODE_2 0x40
#define SPI_MODE_3 0x140
#ELSE
#define SPI_MODE_0 0x100
#define SPI_MODE_1 0
#define SPI_MODE_2 0x140
#define SPI_MODE_3 0x40
#ENDIF
setup_spi(SPI_MASTER | SPI_MODE_0 |SPI_CLK_DIV_1);
SPI_nCS_LAT = 0;
// spi_read() is used for compatibility with previous PCD versions
spi_read(0xAB);
spi_read(0);
spi_read(0);
spi_read(0);
h=spi_read(0);
SPI_nCS_LAT = 1; |
|
|
|
|
|
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
|