![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
andromeda92
Joined: 21 Jul 2017 Posts: 16
|
PIC18F4550 configuring SPI |
Posted: Mon Jul 31, 2017 7:06 pm |
|
|
Hi,
I have a pic18f4550 with crystal 16Mhz, version of compiler is 5.015.
I want to drive ili9341 320x240 with spi.
The code it was for mplab-x but i have adapted it for ccs.
How do i configure spi ?
Code: |
#include <18F4550.h>
#device ADC=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES HSPLL
#FUSES CPUDIV1
#FUSES PLL4
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV21 //Brownout reset at 2.1V
#FUSES VREGEN //USB voltage regulator enabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPB //No Boot Block code protection
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTC //Configuration registers not write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
//#use delay(crystal=16Mhz, clock=16Mhz)
#use delay(clock=48Mhz)
|
on file ili9341.h
Code: |
#define TFT_CS PIN_D0 //LATDbits.LATD0
//#define TRIS_CS TRISDbits.TRISD0
#define TFT_RES PIN_D1 //LATDbits.LATD1
//#define TRIS_RES TRISDbits.TRISD1
#define TFT_DC PIN_D2 //LATDbits.LATD2
//#define TRIS_DC TRISDbits.TRISD2
......
|
The main.c
Code: |
#include <main.h>
//#USE SPI (MASTER, CLK=PIN_B1, DI=PIN_B0, DO=PIN_C7, MODE=2, BITS=8, STREAM=SPI_1)
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
#include "ili9341.h"
#include "ili9341.c"
void main()
{
int i;
char buffer1[20];
setup_spi(SPI_MASTER | SPI_MODE_2| SPI_CLK_DIV_4 );
TFT_Init();
TFT_SetDotSize(1);
TFT_RectangleRound(5, 115, 234, 314, 10, BLACK);
.......
|
I have tested mode0, mode1, mode2, mode3, but it don't work.
How to calculate SPI_CLK_DIV_X ?
Do i need to put line
Code: |
#USE SPI (MASTER, CLK=PIN_B1, DI=PIN_B0, DO=PIN_C7, MODE=2, BITS=8, STREAM=SPI_1)
|
What is the difference with #use spi .., setup_spi and init_spi ?
Datasheet for ili9341 is here https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf
My 2.4 tft spi 320x240 is http://www.winddeal.net/image/30209/30209-6.jpg
Example code for TFT_Init();
Code: |
#include "ili9341.h"
//#use fast_io(d)
//#use fast_io(b)
//#use fast_io(c)
//==============================================================================
// Declaration of global variables.
//==============================================================================
char *font, *font2;
char width, height, letter_spacing, dot_size = 0, frame_memory = TFT_VERTICAL;
unsigned int8 tft_x = TFT_W - 1;
//==============================================================================
// This function initializes the driver ILI9341.
//==============================================================================
void TFT_Init(void){
set_tris_d(0x00);
set_tris_c(0x00);
set_tris_b(0x00);
//TRIS_CS = 0; TRIS_DC = 0; TRIS_RES = 0;
output_high(TFT_CS); output_low(TFT_DC);output_low(TFT_RES);
TFT_Reset();
TFT_WriteCommand(0xCB); // Power control A (CBh)
TFT_WriteParameter(0x39);
TFT_WriteParameter(0x2C);
TFT_WriteParameter(0x00);
TFT_WriteParameter(0x34);
TFT_WriteParameter(0x02);
..........
|
reset code
Code: |
void TFT_Reset(void){
output_high(TFT_CS);
output_low(TFT_RES); delay_ms(50);
output_high(TFT_RES); delay_ms(150);
} |
Thanks for your responses. |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jul 31, 2017 9:43 pm |
|
|
Quote: | I want to drive ili9341 320x240 with spi. |
According to the datasheet, the ili9341 can be jumpered to select 12
different interfaces. These can be i2c, SPI, and many parallel interfaces.
Do you know for certain that the SPI interface is selected ?
See page 26 of the data sheet, in this section:
7.1.1. MCU interface selection
https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf
Can you post a link to the website where you bought the lcd ?
They may have some documentation that tells which interface
the lcd has selected. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Mon Jul 31, 2017 11:48 pm |
|
|
As a comment, the ILI9341 data sheet shows three wire SPI with the clock idle low, and all data transfers being done with the data stable on the rising edge of the clock. This is mode0.
He is selecting mode2, which has the clock idling high and all data transfers on the falling edge....
He talks about MPLAB, but MPLAB is not a programming language, but an IDE. If he is translating from Microchip-C, then this will have different SPI setups, and he should look at these.
On #use,
have a look at:
<http://www.ccsinfo.com/forum/viewtopic.php?t=54162&highlight=spi+spixfer>
<http://www.ccsinfo.com/forum/viewtopic.php?t=52644&highlight=spi+spixfer>
There are many similar threads.
#USE is more flexible and more powerful, but must be used with spi_xfer. It can handle both software and hardware SPI. Setup_spi, is the older command to just handle the SPI hardware, with more limited abilities.
The unit supports a maximum SPI clock of 10MHz for a read, and 6.66MHz for a write). SPI_CLK_DIV_4, will be trying to clock at 12MHz. Too fast. |
|
![](templates/subSilver/images/spacer.gif) |
andromeda92
Joined: 21 Jul 2017 Posts: 16
|
|
Posted: Tue Aug 01, 2017 2:11 am |
|
|
PCM programmer wrote: | Quote: | I want to drive ili9341 320x240 with spi. |
According to the datasheet, the ili9341 can be jumpered to select 12
different interfaces. These can be i2c, SPI, and many parallel interfaces.
Do you know for certain that the SPI interface is selected ?
See page 26 of the data sheet, in this section:
7.1.1. MCU interface selection
https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf
Can you post a link to the website where you bought the lcd ?
They may have some documentation that tells which interface
the lcd has selected. |
Interface is SPI, it work like a charm with arduino and the library adafruit ili9341. Tihis screen is only spi, other screen have uart/i2c/spi. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Tue Aug 01, 2017 4:09 am |
|
|
Honestly you are starting from the wrong end.
First thing to do is get the SPI working with a minimum command.
Then translate the existing parallel mode ili9341 library:
<https://www.ccsinfo.com/forum/viewtopic.php?t=55040>
to use the SPI interface.
As have already pointed out, your SPI mode is wrong, and speed too fast for the chip. |
|
![](templates/subSilver/images/spacer.gif) |
andromeda92
Joined: 21 Jul 2017 Posts: 16
|
|
Posted: Tue Aug 01, 2017 5:14 am |
|
|
I have modified the code
Code: |
setup_spi(SPI_MASTER | SPI_MODE_0| SPI_CLK_DIV_4 );
|
and modified crystal to
Code: |
#use delay(crystal=16Mhz, clock=16Mhz)
|
I do not know why it does not work because this code works on youtube, the only difference is that I replaced
that
Code: |
void SPI1_Write(unsigned char data){
//SSP1CON1bits.WCOL = 0;
SSPBUF = data;
while(!SSPSTATbits.BF);
data = SSPBUF;
}
|
by
Code: |
spi_write(parameter);
|
what is the equivalent for ccs for code below using spi function
Code: |
void SPI1_Close(void){
SSPCON1 &= 0xDF;
}
|
|
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Tue Aug 01, 2017 6:48 am |
|
|
You should change the fuse to HS, not HSPLL as well. Otherwise you may well still be clocking too fast.
setup_spi(SPI_DISABLED);
Is the command to switch the SPI off. |
|
![](templates/subSilver/images/spacer.gif) |
andromeda92
Joined: 21 Jul 2017 Posts: 16
|
|
Posted: Wed Aug 02, 2017 3:18 am |
|
|
thanks for the explanation |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|