Jump to content

david1982

Members
  • Posts

    29
  • Joined

  • Last visited

Everything posted by david1982

  1. Yes you where right inmarket.. I have it working now, you don’t do anything with the spi in int board but you do all spi work in acquire bus. Below is my board file for 2 ILI9341 displays running on a STM32F1 via spi. It my help others as an example. #ifndef _GDISP_LLD_BOARD_H #define _GDISP_LLD_BOARD_H //**** ILI9341 on SPI1. TESTED on STM32L1, STM32F1 AND STM32F4. // Pin & SPI setup #define SPI_METHOD_IRQ 1 #define SPI_METHOD_POLLING 2 #define SPI_METHOD SPI_METHOD_POLLING // SPI1 #define SPI_DRIVER (&SPID1) #define SPI_PORT GPIOA #define SCK_PAD 5 //PA5 #define MISO_PAD 6 //PA6 #define MOSI_PAD 7 //PA7 #define CS_PORT GPIOA #define CS2_PORT GPIOB #define RESET_PORT GPIOA #define DNC_PORT GPIOA #define CS_PAD 4 // PA4 -- 0 = chip selected #define CS2_PAD 0 // PB0 -- 0 = chip selected #define RESET_PAD 1 // PA1 -- 0 = reset #define DNC_PAD 0 // PA0 -- control=0, data=1 -- DNC or D/C // SPI setup ajust " SPI_BaudRatePrescaler_X" to set SPI speed. // Peripherial Clock 42MHz SPI2 SPI3 // Peripherial Clock 84MHz SPI1 SPI1 SPI2/3 #define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) // 42 MHz 21 MHZ #define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) // 21 MHz 10.5 MHz #define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) // 10.5 MHz 5.25 MHz #define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) // 5.25 MHz 2.626 MHz #define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) // 2.626 MHz 1.3125 MHz #define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) // 1.3125 MHz 656.25 KHz #define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) // 656.25 KHz 328.125 KHz #define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) // 328.125 KHz 164.06 KHz static SPIConfig spi_cfg = { NULL, CS_PORT, CS_PAD, SPI_BaudRatePrescaler_2 //AJUST SPEED HERE.. }; static SPIConfig spi_cfg2 = { NULL, CS2_PORT, CS2_PAD, SPI_BaudRatePrescaler_2 //AJUST SPEED HERE.. }; static inline void init_board(GDisplay *g) { (void) g; //Set up the pins.. palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL);//cs 2 palSetPadMode(SPI_PORT, CS_PAD, PAL_MODE_OUTPUT_PUSHPULL);//cs 1 palSetPadMode(SPI_PORT, SCK_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(SPI_PORT, MISO_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(SPI_PORT, MOSI_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(RESET_PORT, RESET_PAD, PAL_MODE_OUTPUT_PUSHPULL ); palSetPadMode(DNC_PORT, DNC_PAD, PAL_MODE_OUTPUT_PUSHPULL); //Select both displays palSetPad(CS_PORT, CS_PAD); palSetPad(CS2_PORT, CS2_PAD); //Reset both displays palSetPad(RESET_PORT, RESET_PAD); palClearPad(DNC_PORT, DNC_PAD); //Unselect both displays palClearPad(CS_PORT, CS_PAD); palClearPad(CS2_PORT, CS2_PAD); } static inline void post_init_board(GDisplay *g) { (void) g; } static inline void setpin_reset(GDisplay *g, bool_t state) { (void) g; palWritePad(RESET_PORT, RESET_PAD, !state); } static inline void set_backlight(GDisplay *g, uint8_t percent) { (void) g; (void) percent; } //This is where we select each display static inline void acquire_bus(GDisplay *g) { (void) g; switch(g->controllerdisplay) { case 0: spiStart(SPI_DRIVER, &spi_cfg); spiSelectI(SPI_DRIVER); break; case 1: spiStart(SPI_DRIVER, &spi_cfg2); spiSelectI(SPI_DRIVER); break; } } static inline void release_bus(GDisplay *g) { (void) g; switch(g->controllerdisplay) { case 0: spiUnselectI(SPI_DRIVER); break; case 1: spiUnselectI(SPI_DRIVER); break; } } static inline void write_index(GDisplay *g, uint8_t index) { (void) g; palClearPad(DNC_PORT, DNC_PAD); #if SPI_METHOD == SPI_METHOD_IRQ spiSend(SPI_DRIVER, 1, &index); #elif SPI_METHOD == SPI_METHOD_POLLING spiPolledExchange(SPI_DRIVER, index); #endif palSetPad(DNC_PORT, DNC_PAD); } static inline void write_data(GDisplay *g, uint8_t data) { (void) g; #if SPI_METHOD == SPI_METHOD_IRQ spiSend(SPI_DRIVER, 1, &data); #elif SPI_METHOD == SPI_METHOD_POLLING spiPolledExchange(SPI_DRIVER, data); #endif } static inline void setreadmode(GDisplay *g) { (void) g; } static inline void setwritemode(GDisplay *g) { (void) g; } static inline uint16_t read_data(GDisplay *g) { (void) g; return 0; } #endif /* _GDISP_LLD_BOARD_H */
  2. I think that what I am doing .. and sorry yes both displays use the same controller. I have set the following in my ugfxconf.. #define GDISP_TOTAL_DISPLAYS 2 #define GDISP_TOTAL_CONTROLLERS 1 #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565 My board int looks like.. static inline void init_board(GDisplay *g) { (void) g; //Set up the pins.. palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL);//cs 2 palSetPadMode(SPI_PORT, CS_PAD, PAL_MODE_OUTPUT_PUSHPULL);//cs 1 palSetPadMode(SPI_PORT, SCK_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(SPI_PORT, MISO_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(SPI_PORT, MOSI_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(RESET_PORT, RESET_PAD, PAL_MODE_OUTPUT_PUSHPULL ); palSetPadMode(DNC_PORT, DNC_PAD, PAL_MODE_OUTPUT_PUSHPULL); switch(g->controllerdisplay) { case 0: //Set pins. palSetPad(CS_PORT, CS_PAD); palSetPad(RESET_PORT, RESET_PAD); palClearPad(DNC_PORT, DNC_PAD); break; //Start SPI1 with our config. spiStart(SPI_DRIVER, &spi_cfg); spiSelectI(SPI_DRIVER); /* Slave Select assertion. */ case 1: //Set pins. palSetPad(GPIOB, 0); palSetPad(RESET_PORT, RESET_PAD); palClearPad(DNC_PORT, DNC_PAD); //Start SPI1 with our config. spiStart(SPI_DRIVER, &spi_cfg2); spiSelectI(SPI_DRIVER); break; } } But when I draw to each display only the second display works.. I am switching between displays like so.. coord_t displayA,displayB; displayA = 0; displayB = 1; gdispSetDisplay(gdispGetDisplay(displayA)); ///Do some drawing This does not show gdispSetDisplay(gdispGetDisplay(displayB)); ///Do some drawing This does show
  3. Hello all, Can some one please just help me with my multiple display set-up. I understand the basics of using the multiple displays from the examples but how do I set-up my board file as the only difference between the two displays is the chip select (SPI). Thanks.
  4. Hello, Just having some trouble displaying a custom font can someone please test it for me? userfonts.h.zip
  5. Hello all, I have a working spi SD card setup using gfile. What I want to do is have a file on the SD card with some settings (numbers) and have my code read the file and then have the setting number applied to an int. How would I best go about this? Thank you.
  6. I have fixed the error by enabling #define GFILE_NEED_STRINGS TRUE #define GFILE_NEED_PRINTG TRUE in the gfxconf file.
  7. david1982

    STDIO help.

    Hello, I am trying to use the stdio with ugfx as I need sprintf. I have updated my stdio file to fix the compile errors but now I get this error went I use sprintf undefined reference to `snprintg' How could I resolve this? Thank you.
  8. I got it all working. Thank you very much.
  9. Hello, I have got my sd card working under chibios (I can read and write). Now how do I display an bmp file that is on that sd card? I have the basics for displaying images down just don't know how to open image from the sd card. I will be grateful for any help. Thank you.
  10. Is it safe to assume that the fsmc is working? Where should I start to look to fix it. Thank you
  11. Hello, Just trying to get my SSD1289 display working and all I am getting is a screen full of multi colored pixels what would be the cause of this?? Here is my board file. /* #ifndef _GDISP_LLD_BOARD_H #define _GDISP_LLD_BOARD_H // For a multiple display configuration we would put all this in a structure and then // set g->board to that structure. /* Using FSMC A19 (PE3) as DC */ #define GDISP_REG (*((volatile uint16_t *) 0x60000000)) /* DC = 0 */ #define GDISP_RAM (*((volatile uint16_t *) 0x60100000)) /* DC = 1 */ #define GDISP_DMA_STREAM STM32_DMA2_STREAM6 #define SET_RST palSetPad(GPIOD, 3); #define CLR_RST palClearPad(GPIOD, 3); static inline void init_board(GDisplay *g) { // As we are not using multiple displays we set g->board to NULL as we don't use it. g->board = 0; switch(g->controllerdisplay) { case 0: // Set up for Display 0 #if defined(STM32F4XX) || defined(STM32F2XX) /* STM32F4 FSMC init */ rccEnableAHB3(RCC_AHB3ENR_FSMCEN, 0); #if defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM) if (dmaStreamAllocate(GDISP_DMA_STREAM, 0, 0, 0)) gfxExit(); dmaStreamSetMemory0(GDISP_DMA_STREAM, &GDISP_RAM); dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M); #endif #else #error "FSMC not implemented for this device" #endif /* Group pins */ IOBus busD = {GPIOD, (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 14) | (1 << 15), 0}; IOBus busE = {GPIOE, (1 << 3) | (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 13) | (1 << 14) | (1 << 15), 0}; /* FSMC is an alternate function 12 (AF12) */ palSetBusMode(&busD, PAL_MODE_ALTERNATE(12)); palSetBusMode(&busE, PAL_MODE_ALTERNATE(12)); /* FSMC timing register configuration */ FSMC_Bank1->BTCR[0 + 1] = (FSMC_BTR1_ADDSET_1 | FSMC_BTR1_ADDSET_3) \ | (FSMC_BTR1_DATAST_1 | FSMC_BTR1_DATAST_3) \ | (FSMC_BTR1_BUSTURN_1 | FSMC_BTR1_BUSTURN_3) ; // FSMC_Bank1->BTCR[0 + 1] = (FSMC_BTR1_ADDSET_3 | FSMC_BTR1_ADDSET_0) \ // | (FSMC_BTR1_DATAST_3 | FSMC_BTR1_DATAST_0) \ // | FSMC_BTR1_BUSTURN_0; /* Bank1 NOR/PSRAM control register configuration * Write enable, memory databus width set to 16 bit, memory bank enable */ // FSMC_Bank1->BTCR[0] = FSMC_BCR1_WREN | FSMC_BCR1_MWID_0 | FSMC_BCR1_MBKEN; break; } } static inline void post_init_board(GDisplay *g) { (void) g; } static inline void setpin_reset(GDisplay *g, bool_t state) { (void) g; if (state) { CLR_RST; } else { SET_RST; } } static inline void set_backlight(GDisplay *g, uint8_t percent) { (void) g; } static inline void acquire_bus(GDisplay *g) { (void) g; } static inline void release_bus(GDisplay *g) { (void) g; } static inline void write_index(GDisplay *g, uint16_t index) { (void) g; GDISP_REG = index; } static inline void write_data(GDisplay *g, uint16_t data) { (void) g; GDISP_RAM = data; } static inline void setreadmode(GDisplay *g) { (void) g; } static inline void setwritemode(GDisplay *g) { (void) g; } static inline uint16_t read_data(GDisplay *g) { (void) g; return GDISP_RAM; } #if defined(GDISP_USE_DMA) static inline void dma_with_noinc(GDisplay *g, color_t *buffer, int area) { (void) g; dmaStreamSetPeripheral(GDISP_DMA_STREAM, buffer); dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M); for (; area > 0; area -= 65535) { dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area > 65535 ? 65535 : area); dmaStreamEnable(GDISP_DMA_STREAM); dmaWaitCompletion(GDISP_DMA_STREAM); } } static inline void dma_with_inc(GDisplay *g, color_t *buffer, int area) { (void) g; dmaStreamSetPeripheral(GDISP_DMA_STREAM, buffer); dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PINC | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M); for (; area > 0; area -= 65535) { dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area > 65535 ? 65535 : area); dmaStreamEnable(GDISP_DMA_STREAM); dmaWaitCompletion(GDISP_DMA_STREAM); } } #endif #endif /* _GDISP_LLD_BOARD_H */
  12. Hello, I have just got hold of a tft1p4705 TFT with an D51E5TA7601 driver ic I was just wondering if any one has played with one of there before? Thank you. Here is a link to the driver ic datasheet. https://drive.google.com/file/d/0B_B2fQCYwJRiNnpzcWxqeldoZHM/view?usp=sharing
  13. Hello, I have been trying to get a large number (50+) font working for use with a temperature sensor but I am having some problems. I have userfonts working but only at a font size of 5 as soon as I try to go for the larger sizes the userfont will not work. I have also filtered for just numbers to reduce the size in case that was the problem but no luck. Is there a limit on the font size that I can use? The font I am currently trying to use is DejaVuSansMono. Any help would be great.
  14. Very nice !! :shock: Thank you!
  15. Wow that is a big difference. Thanks for cleaning up the code I to can run SPI_BaudRatePrescaler_2 now. My setup is also running about the same speed as your ugfx setup. Thank you.
  16. Great glad it helped .. Speed up is next for me also please let me know how you go.
  17. The problem was just bad setup on my end looking at examples I came up with the following board file. Hope it helps. #ifndef _GDISP_LLD_BOARD_H #define _GDISP_LLD_BOARD_H //**** ILI9341 on SPI1. TESTED on STM32F1 AND STM32F4. // Pin & SPI setup // SPI1 #define SPI_DRIVER (&SPID1) #define SPI_PORT GPIOA #define SCK_PAD 5 //PA5 #define MISO_PAD 6 //PA6 #define MOSI_PAD 7 //PA7 #define CS_PORT GPIOA #define RESET_PORT GPIOA #define DNC_PORT GPIOA #define CS_PAD 4 // PA4 -- 0 = chip selected #define RESET_PAD 1 // PA1 -- 0 = reset #define DNC_PAD 0 // PA0 -- control=0, data=1 -- DNC or D/C // SPI setup ajust " SPI_BaudRatePrescaler_X" to set SPI speed. // Peripherial Clock 42MHz SPI2 SPI3 // Peripherial Clock 84MHz SPI1 SPI1 SPI2/3 #define SPI_BaudRatePrescaler_2 ((uint16_t)0x0000) // 42 MHz 21 MHZ #define SPI_BaudRatePrescaler_4 ((uint16_t)0x0008) // 21 MHz 10.5 MHz #define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010) // 10.5 MHz 5.25 MHz #define SPI_BaudRatePrescaler_16 ((uint16_t)0x0018) // 5.25 MHz 2.626 MHz #define SPI_BaudRatePrescaler_32 ((uint16_t)0x0020) // 2.626 MHz 1.3125 MHz #define SPI_BaudRatePrescaler_64 ((uint16_t)0x0028) // 1.3125 MHz 656.25 KHz #define SPI_BaudRatePrescaler_128 ((uint16_t)0x0030) // 656.25 KHz 328.125 KHz #define SPI_BaudRatePrescaler_256 ((uint16_t)0x0038) // 328.125 KHz 164.06 KHz static SPIConfig spi_cfg = { NULL, CS_PORT, CS_PAD, SPI_BaudRatePrescaler_4 //AJUST SPEED HERE.. }; static inline void init_board(GDisplay *g) { (void) g; //g->board = 0; //Set up the pins.. palSetPadMode(SPI_PORT, SCK_PAD, PAL_MODE_ALTERNATE(5)); palSetPadMode(SPI_PORT, MOSI_PAD, PAL_MODE_ALTERNATE(5)); palSetPadMode(SPI_PORT, MISO_PAD, PAL_MODE_ALTERNATE(5)); palSetPadMode(RESET_PORT, RESET_PAD, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(CS_PORT, CS_PAD, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(DNC_PORT, DNC_PAD, PAL_MODE_OUTPUT_PUSHPULL); //Set pins. palSetPad(CS_PORT, CS_PAD); palSetPad(RESET_PORT, RESET_PAD); palClearPad(DNC_PORT, DNC_PAD); //Start SPI1 with our config. spiStart(SPI_DRIVER, &spi_cfg); } static inline void post_init_board(GDisplay *g) { (void) g; } static inline void setpin_reset(GDisplay *g, bool_t state) { (void) g; palWritePad(RESET_PORT, RESET_PAD, !state); } static inline void set_backlight(GDisplay *g, uint8_t percent) { (void) g; (void) percent; } static inline void acquire_bus(GDisplay *g) { (void) g; spiSelect(SPI_DRIVER); } static inline void release_bus(GDisplay *g) { (void) g; spiUnselect(SPI_DRIVER); } static inline void write_index(GDisplay *g, uint8_t index) { static uint8_t sindex; (void) g; palClearPad(DNC_PORT, DNC_PAD); sindex = index; spiSend(SPI_DRIVER, 1, &sindex); } static inline void write_data(GDisplay *g, uint8_t data) { static uint8_t sdata; (void) g; palSetPad(DNC_PORT, DNC_PAD); sdata = data; spiSend(SPI_DRIVER, 1, &sdata); } static inline void setreadmode(GDisplay *g) { (void) g; } static inline void setwritemode(GDisplay *g) { (void) g; } static inline uint16_t read_data(GDisplay *g) { (void) g; return 0; } #endif /* _GDISP_LLD_BOARD_H */
  18. Well I have been playing around and I am now trying to get an image to display the normal way.. I am using the romfs and I have my romfs_files.h sorted with a bmp image converted via file2c (bf.h) My code runs fine but no image displays (I toggle an LED in the while and the code does not jam up) #include "gfx.h" static gdispImage myImage; int main(void) { halInit(); chSysInit(); coord_t swidth, sheight; gfxInit(); gdispSetOrientation(GDISP_ROTATE_90); swidth = gdispGetWidth(); sheight = gdispGetHeight(); gdispImageOpenGFile(&myImage, "bf.h"); gdispImageDraw(&myImage, 20, 20, swidth, sheight, 10, 10); gdispImageClose(&myImage); while(TRUE) { gfxSleepMilliseconds(500); } } #ifndef _GFXCONF_H #define _GFXCONF_H /* The operating system to use. One of these must be defined - preferably in your Makefile */ #define GFX_USE_OS_CHIBIOS TRUE //#define GFX_USE_OS_WIN32 FALSE //#define GFX_USE_OS_LINUX FALSE //#define GFX_USE_OS_OSX FALSE /* GFX sub-systems to turn on */ #define GFX_USE_GDISP TRUE #define GFX_USE_GFILE TRUE /* Features for the GDISP sub-system. */ #define GDISP_NEED_VALIDATION TRUE #define GDISP_NEED_CLIP TRUE #define GDISP_NEED_TEXT TRUE #define GDISP_NEED_ANTIALIAS FALSE #define GDISP_NEED_CONTROL TRUE #define GDISP_NEED_STARTUP_LOGO FALSE #define GDISP_NEED_CIRCLE FALSE #define GDISP_NEED_MULTITHREAD FALSE #define GDISP_NEED_IMAGE TRUE #define GDISP_NEED_IMAGE_BMP TRUE #define GDISP_NEED_IMAGE_BMP_1 FALSE #define GDISP_NEED_IMAGE_BMP_4 FALSE #define GDISP_NEED_IMAGE_BMP_4_RLE FALSE #define GDISP_NEED_IMAGE_BMP_8 FALSE #define GDISP_NEED_IMAGE_BMP_8_RLE FALSE #define GDISP_NEED_IMAGE_BMP_16 FALSE #define GDISP_NEED_IMAGE_BMP_24 FALSE #define GDISP_NEED_IMAGE_BMP_32 FALSE #define GDISP_NEED_IMAGE_PNG FALSE #define GDISP_NEED_IMAGE_NATIVE FALSE /* GDISP - fonts to include */ #define GDISP_INCLUDE_USER_FONTS FALSE #define GDISP_INCLUDE_FONT_UI1 FALSE #define GDISP_INCLUDE_FONT_UI2 FALSE #define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS10 FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS12 FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS16 FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS24 TRUE #define GDISP_INCLUDE_FONT_DEJAVUSANS32 TRUE #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12 FALSE #define GDISP_INCLUDE_FONT_FIXED_10x20 FALSE #define GDISP_INCLUDE_FONT_FIXED_7x14 FALSE #define GDISP_INCLUDE_FONT_FIXED_5x8 FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS12_AA FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS16_AA FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS24_AA FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANS32_AA FALSE #define GDISP_INCLUDE_FONT_DEJAVUSANSBOLD12_AA FALSE /*gfile */ #define GFILE_NEED_ROMFS TRUE #define GFILE_NEED_NATIVEFS FALSE #define GFILE_NEED_CHBIOSFS FALSE /*GWIN*/ #define GWIN_NEED_IMAGE FALSE #define GWIN_NEED_CONTAINER FALSE #define GWIN_NEED_WIDGET FALSE #endif /* _GFXCONF_H */
  19. Hello. I am trying to use Image Box but I get "unknown type name 'GHandle'" when trying to build. I assume that i have not enabled something in my ugfxconf file. What could it be? I have rom file system working with my image converted to a h file also . Thank you.
  20. Thank you inmarket. I have it all working now
  21. Still on good.. I have slowed down the SPI and I have redone the board file. I also looked at the Chinese files that came with the LCD and there where some write_data differences so I corrected them in my gdisp_lld_ILI9341.c file but still nothing on the LCD. I have connected my oscilloscope and I am defiantly getting pulses on MOSI and CS also RST. The backlight is also differently on. The attachment is what I got with the LCD and below are my files. Could some one with more experience and knowledge than I please have a look. Thank You. board_ILI9341.h /* * This file is subject to the terms of the GFX License. If a copy of * the license was not distributed with this file, you can obtain one at: * * http://ugfx.org/license.html */ /** * @file boards/addons/gdisp/board_SSD1306_spi.h * @brief GDISP Graphic Driver subsystem board interface for the SSD1306 display. * * @note This file contains a mix of hardware specific and operating system specific * code. You will need to change it for your CPU and/or operating system. */ #ifndef _GDISP_LLD_BOARD_H #define _GDISP_LLD_BOARD_H // Pin & SPI setup #define SPI_DRIVER (&SPID2) #define SPI_PORT GPIOB #define SCK_PAD 13 #define MISO_PAD 14 #define MOSI_PAD 15 #define CS_PORT GPIOB #define RESET_PORT GPIOB #define DNC_PORT GPIOB #define CS_PAD 12 // 0 = chip selected #define RESET_PAD 10 // 0 = reset #define DNC_PAD 11 // control=0, data=1 static SPIConfig spi_cfg = { NULL, CS_PORT, CS_PAD, (SPI_CR1_BR_1 | SPI_CR1_CPOL | SPI_CR1_CPHA) }; static inline void init_board(GDisplay *g) { (void) g; //g->board = 0; palSetPadMode(SPI_PORT, SCK_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(SPI_PORT, MOSI_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(SPI_PORT, MISO_PAD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetPadMode(RESET_PORT, RESET_PAD, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(CS_PORT, CS_PAD, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(DNC_PORT, DNC_PAD, PAL_MODE_OUTPUT_PUSHPULL); palSetPad(CS_PORT, CS_PAD); palSetPad(RESET_PORT, RESET_PAD); palClearPad(DNC_PORT, DNC_PAD); spiStart(&SPID2, &spi_cfg); } static inline void post_init_board(GDisplay *g) { (void) g; } static inline void setpin_reset(GDisplay *g, bool_t state) { (void) g; palWritePad(RESET_PORT, RESET_PAD, !state); } static inline void set_backlight(GDisplay *g, uint8_t percent) { (void) g; (void) percent; } static inline void acquire_bus(GDisplay *g) { (void) g; spiAcquireBus(SPI_DRIVER); } static inline void release_bus(GDisplay *g) { (void) g; spiReleaseBus(SPI_DRIVER); } static inline void write_index(GDisplay *g, uint16_t index) { (void) g; spiSelect(SPI_DRIVER); static uint8_t txbuf[2] = {0}; txbuf[0] = 0x70 | 0x00 | 0x00; spiSend(SPI_DRIVER, 1, txbuf); //txbuf[0] = index & 0xFF; txbuf[0] = (index >> 8); txbuf[1] = (index & 0xFF); spiSend(SPI_DRIVER, 2, txbuf); spiUnselect(SPI_DRIVER); } static inline void write_data(GDisplay *g, uint16_t data) { (void) g; spiSelect(SPI_DRIVER); static uint8_t txbuf[2] = {0}; txbuf[0] = 0x70 | 0x00 | 0x02; spiSend(SPI_DRIVER, 1, txbuf); txbuf[0] = (data >> 8); txbuf[1] = (data & 0xFF); spiSend(SPI_DRIVER, 2, txbuf); spiUnselect(SPI_DRIVER); } static inline void setreadmode(GDisplay *g) { (void) g; } static inline void setwritemode(GDisplay *g) { (void) g; } static inline uint16_t read_data(GDisplay *g) { (void) g; spiStart(SPI_DRIVER, &spi_cfg); spiSelect(SPI_DRIVER); static uint8_t txbuf[1] = {0}; txbuf[0] = 0x70 | 0x01 | 0x02; spiSend(SPI_DRIVER, 1, txbuf); static uint8_t rxbuf[3] = {0}; spiReceive(SPI_DRIVER, 3, rxbuf); spiUnselect(SPI_DRIVER); spiStart(SPI_DRIVER, &spi_cfg); static uint16_t value = 0; value = rxbuf[1] << 8 | rxbuf[2]; return value; } #endif /* _GDISP_LLD_BOARD_H */ gdisp_lld_ILI9341.c /* * This file is subject to the terms of the GFX License. If a copy of * the license was not distributed with this file, you can obtain one at: * * http://ugfx.org/license.html */ #include "gfx.h" #if GFX_USE_GDISP #if defined(GDISP_SCREEN_HEIGHT) #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored." #undef GISP_SCREEN_HEIGHT #endif #if defined(GDISP_SCREEN_WIDTH) #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored." #undef GDISP_SCREEN_WIDTH #endif #define GDISP_DRIVER_VMT GDISPVMT_ILI9341 #include "drivers/gdisp/ILI9341/gdisp_lld_config.h" #include "src/gdisp/gdisp_driver.h" #include "board_ILI9341.h" /*===========================================================================*/ /* Driver local definitions. */ /*===========================================================================*/ #ifndef GDISP_SCREEN_HEIGHT #define GDISP_SCREEN_HEIGHT 320 #endif #ifndef GDISP_SCREEN_WIDTH #define GDISP_SCREEN_WIDTH 240 #endif #ifndef GDISP_INITIAL_CONTRAST #define GDISP_INITIAL_CONTRAST 50 #endif #ifndef GDISP_INITIAL_BACKLIGHT #define GDISP_INITIAL_BACKLIGHT 100 #endif #include "drivers/gdisp/ILI9341/ILI9341.h" /*===========================================================================*/ /* Driver local functions. */ /*===========================================================================*/ // Some common routines and macros #define dummy_read(g) { volatile uint16_t dummy; dummy = read_data(g); (void) dummy; } #define write_reg(g, reg, data) { write_index(g, reg); write_data(g, data); } #define write_data16(g, data) { write_data(g, data >> 8); write_data(g, (uint8_t)data); } #define delay(us) gfxSleepMicroseconds(us) #define delayms(ms) gfxSleepMilliseconds(ms) static void set_viewport(GDisplay *g) { write_index(g, 0x2A); write_data(g, (g->p.x >> 8)); write_data(g, (uint8_t) g->p.x); write_data(g, (g->p.x + g->p.cx - 1) >> 8); write_data(g, (uint8_t) (g->p.x + g->p.cx - 1)); write_index(g, 0x2B); write_data(g, (g->p.y >> 8)); write_data(g, (uint8_t) g->p.y); write_data(g, (g->p.y + g->p.cy - 1) >> 8); write_data(g, (uint8_t) (g->p.y + g->p.cy - 1)); } /*===========================================================================*/ /* Driver exported functions. */ /*===========================================================================*/ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) { // No private area for this controller g->priv = 0; // Initialise the board interface g-> board = 0; init_board(g); // Hardware reset setpin_reset(g, TRUE); gfxSleepMilliseconds(20); setpin_reset(g, FALSE); gfxSleepMilliseconds(20); // Get the bus for the following initialisation commands acquire_bus(g); write_index(g, 0x01); //software reset gfxSleepMilliseconds(5); write_index(g, 0x28); // display off //--------------------------------------------------------- // magic? write_index(g, 0xCF); write_data(g, 0x00); write_data(g, 0xC1); write_data(g, 0x30); write_index(g, 0xED); write_data(g, 0x64); write_data(g, 0x03); write_data(g, 0x12); write_data(g, 0x81); write_index(g, 0xE8); write_data(g, 0x85); write_data(g, 0x00); write_data(g, 0x78); write_index(g, 0xCB); write_data(g, 0x39); write_data(g, 0x2C); write_data(g, 0x00); write_data(g, 0x34); write_data(g, 0x02); write_index(g, 0xF7); write_data(g, 0x20); write_index(g, 0xEA); write_data(g, 0x00); write_data(g, 0x00); //------------power control------------------------------ write_index(g, 0xC0); //power control write_data(g, 0x23); write_index(g, 0xC1); //power control write_data(g, 0x10); //--------------VCOM write_index(g, 0xC5); //vcom control write_data(g, 0x3e);//35 write_data(g, 0x28);//3E write_index(g, 0xC7); //vcom control write_data(g, 0x86); // 0x94 //------------memory access control------------------------ write_index(g, 0x36); // memory access control write_data(g, 0x48); //0048 my,mx,mv,ml,BGR,mh,0.0 write_index(g, 0x3A); // pixel format set write_data(g, 0x55);//16bit /pixel //----------------- frame rate------------------------------ write_index(g, 0xB1); // frame rate write_data(g, 0x00); write_data(g, 0x18); //70 //----------------Gamma--------------------------------- write_index(g, 0xF2); // 3Gamma Function Disable write_data(g, 0x00); write_index(g, 0x26); write_data(g, 0x01); // gamma set 4 gamma curve 01/02/04/08 write_index(g, 0xE0); //positive gamma correction write_data(g, 0x0F); write_data(g, 0x31); write_data(g, 0x2B); write_data(g, 0x0C); write_data(g, 0x0E); write_data(g, 0x08); write_data(g, 0x4E); write_data(g, 0xF1); write_data(g, 0x37); write_data(g, 0x07); write_data(g, 0x10); write_data(g, 0x03); write_data(g, 0x0E); write_data(g, 0x09); write_data(g, 0x00); write_index(g, 0xE1); //negamma correction write_data(g, 0x00); write_data(g, 0x0E); write_data(g, 0x14); write_data(g, 0x03); write_data(g, 0x11); write_data(g, 0x07); write_data(g, 0x31); write_data(g, 0xC1); write_data(g, 0x48); write_data(g, 0x08); write_data(g, 0x0F); write_data(g, 0x0C); write_data(g, 0x31); write_data(g, 0x36); write_data(g, 0x0F); //--------------ddram --------------------- write_index(g, 0x2A); // column set // size = 239 write_data(g, 0x00); write_data(g, 0x00); write_data(g, 0x00); write_data(g, 0xEF); write_index(g, 0x2B); // page address set // size = 319 write_data(g, 0x00); write_data(g, 0x00); write_data(g, 0x01); write_data(g, 0x3F); // write_index(g, 0x34); //write_index(g, 0x35); // tearing effect off // tearing effect on // write_index(g, 0xb4); // display inversion // write_data(g, 0x00); write_index(g, 0xb7); //entry mode set write_data(g, 0x07); //-----------------display--------------------- write_index(g, 0xB6); // display function control write_data(g, 0x08); write_data(g, 0x82); write_data(g, 0x27); write_index(g, 0x11); //sleep out gfxSleepMilliseconds(100); write_index(g, 0x29); // display on write_index(g, 0x2c); // Finish Init post_init_board(g); // Release the bus release_bus(g); /* Turn on the back-light */ set_backlight(g, GDISP_INITIAL_BACKLIGHT); /* Initialise the GDISP structure */ g->g.Width = GDISP_SCREEN_WIDTH; g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Orientation = GDISP_ROTATE_0; g->g.Powermode = powerOn; g->g.Backlight = GDISP_INITIAL_BACKLIGHT; g->g.Contrast = GDISP_INITIAL_CONTRAST; return TRUE; } #if GDISP_HARDWARE_STREAM_WRITE LLDSPEC void gdisp_lld_write_start(GDisplay *g) { acquire_bus(g); set_viewport(g); write_index(g, 0x2C); } LLDSPEC void gdisp_lld_write_color(GDisplay *g) { write_data16(g, gdispColor2Native(g->p.color)); } LLDSPEC void gdisp_lld_write_stop(GDisplay *g) { release_bus(g); } #endif #if GDISP_HARDWARE_STREAM_READ LLDSPEC void gdisp_lld_read_start(GDisplay *g) { acquire_bus(g); set_viewport(g); write_index(g, 0x2E); setreadmode(g); dummy_read(g); } LLDSPEC color_t gdisp_lld_read_color(GDisplay *g) { uint16_t data; data = read_data(g); return gdispNative2Color(data); } LLDSPEC void gdisp_lld_read_stop(GDisplay *g) { setwritemode(g); release_bus(g); } #endif #if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL LLDSPEC void gdisp_lld_control(GDisplay *g) { switch(g->p.x) { case GDISP_CONTROL_POWER: if (g->g.Powermode == (powermode_t)g->p.ptr) return; switch((powermode_t)g->p.ptr) { case powerOff: case powerSleep: case powerDeepSleep: acquire_bus(g); write_reg(g, 0x0010, 0x0001); /* enter sleep mode */ release_bus(g); break; case powerOn: acquire_bus(g); write_reg(g, 0x0010, 0x0000); /* leave sleep mode */ release_bus(g); break; default: return; } g->g.Powermode = (powermode_t)g->p.ptr; return; case GDISP_CONTROL_ORIENTATION: if (g->g.Orientation == (orientation_t)g->p.ptr) return; switch((orientation_t)g->p.ptr) { case GDISP_ROTATE_0: acquire_bus(g); write_reg(g, 0x36, 0x48); /* X and Y axes non-inverted */ release_bus(g); g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Width = GDISP_SCREEN_WIDTH; break; case GDISP_ROTATE_90: acquire_bus(g); write_reg(g, 0x36, 0xE8); /* Invert X and Y axes */ release_bus(g); g->g.Height = GDISP_SCREEN_WIDTH; g->g.Width = GDISP_SCREEN_HEIGHT; break; case GDISP_ROTATE_180: acquire_bus(g); write_reg(g, 0x36, 0x88); /* X and Y axes non-inverted */ release_bus(g); g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Width = GDISP_SCREEN_WIDTH; break; case GDISP_ROTATE_270: acquire_bus(g); write_reg(g, 0x36, 0x28); /* Invert X and Y axes */ release_bus(g); g->g.Height = GDISP_SCREEN_WIDTH; g->g.Width = GDISP_SCREEN_HEIGHT; break; default: return; } g->g.Orientation = (orientation_t)g->p.ptr; return; case GDISP_CONTROL_BACKLIGHT: if ((unsigned)g->p.ptr > 100) g->p.ptr = (void *)100; set_backlight(g, (unsigned)g->p.ptr); g->g.Backlight = (unsigned)g->p.ptr; return; //case GDISP_CONTROL_CONTRAST: default: return; } } #endif #endif /* GFX_USE_GDISP */ LCD.zip
  22. Hello All. I have started to play with a new LCD ILI9341 SPI on my stm32f103. I just cannot seam to get it to work I have connected to the correct pins as per the ILI9341 example in extras .. Is there some thing else I should be doing when using the SPI? My board_ILI9341.h #ifndef _GDISP_LLD_BOARD_H #define _GDISP_LLD_BOARD_H #define LCD_PORT GPIOB #define LCD_MOSI 15 #define LCD_MISO 14 #define LCD_SCK 13 #define LCD_CS 12 #define LCD_DC 11 #define LCD_RES 10 #define LCD_DC_CMD palClearPad(LCD_PORT, LCD_DC) #define LCD_DC_DATA palSetPad(LCD_PORT, LCD_DC) #define LCD_SCK_SET palSetPad(LCD_PORT, LCD_SCK) #define LCD_SCK_RES palClearPad(LCD_PORT, LCD_SCK) #define LCD_CS_RES palSetPad(LCD_PORT, LCD_CS) #define LCD_CS_SET palClearPad(LCD_PORT, LCD_CS) /** * SPI configuration structure. * Speed 12 MHz, CPHA=0, CPOL=0, 8bits frames, MSb transmitted first. * Soft slave select. */ static const SPIConfig spi2cfg = { NULL, LCD_PORT, LCD_CS, (SPI_CR1_MSTR | SPI_CR1_SPE | SPI_CR1_SSM | SPI_CR1_SSI) }; static void send_data(uint16_t data); /** * @brief Initialise the board for the display. * * @param[in] g The GDisplay structure * * @note Set the g->board member to whatever is appropriate. For multiple * displays this might be a pointer to the appropriate register set. * * @notapi */ static inline void init_board(GDisplay *g) { // As we are not using multiple displays we set g->board to NULL as we don't use it. g->board = 0; palSetPadMode(LCD_PORT, LCD_CS, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(LCD_PORT, LCD_DC, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(LCD_PORT, LCD_RES, PAL_MODE_OUTPUT_PUSHPULL); spiStart(&SPID2, &spi2cfg); spiSelectI(&SPID2); } /** * @brief After the initialisation. * * @param[in] g The GDisplay structure * * @notapi */ static inline void post_init_board(GDisplay *g) { (void) g; } /** * @brief Set or clear the lcd reset pin. * * @param[in] g The GDisplay structure * @param[in] state TRUE = lcd in reset, FALSE = normal operation * * @notapi */ static inline void setpin_reset(GDisplay *g, bool_t state) { (void) g; if (state = TRUE) { palClearPad(LCD_PORT, LCD_RES); } else { palSetPad(LCD_PORT, LCD_RES); } } /** * @brief Set the lcd back-light level. * * @param[in] g The GDisplay structure * @param[in] percent 0 to 100% * * @notapi */ static inline void set_backlight(GDisplay *g, uint8_t percent) { (void) g; (void) percent; } /** * @brief Take exclusive control of the bus * * @param[in] g The GDisplay structure * * @notapi */ static inline void acquire_bus(GDisplay *g) { (void) g; } /** * @brief Release exclusive control of the bus * * @param[in] g The GDisplay structure * * @notapi */ static inline void release_bus(GDisplay *g) { (void) g; } /** * @brief Send data to the lcd. * * @param[in] data The data to send * * @notapi */ static inline void send_data(uint16_t data) { // http://forum.easyelectronics.ru/viewtopic.php?p=262122#p262122 while (!(SPI2->SR & SPI_SR_TXE)); // ��� ����� �� �������� ��������� - � ������ �� SPI_DR SPI2->DR = data; // ��������� � SPI_DR ��� ������� } /** * @brief Send data to the index register. * * @param[in] g The GDisplay structure * @param[in] index The index register to set * * @notapi */ static inline void write_index(GDisplay *g, uint16_t index) { (void) g; while (SPI2->SR & SPI_SR_BSY); LCD_CS_RES; LCD_DC_CMD; // ��������� ������� � ����� ������ LCD_CS_SET; send_data(index); while (SPI2->SR & SPI_SR_BSY); // ���� ���� ���������� (==1) -- ������ SPI ����� /* ������ ���� �������� ��������� �������� ������� ��������� � ���������� ����� * ����� ������ ��� �������� �������� � ��������. */ LCD_DC_DATA; // ��������� ������� � ����� ������ } /** * @brief Send data to the lcd with DC control. * * @param[in] g The GDisplay structure * @param[in] data The data to send * * @notapi */ static inline void write_data(GDisplay *g, uint16_t data) { (void) g; send_data(data); } /** * @brief Set the bus in read mode * * @param[in] g The GDisplay structure * * @notapi */ static inline void setreadmode(GDisplay *g) { (void) g; } /** * @brief Set the bus back into write mode * * @param[in] g The GDisplay structure * * @notapi */ static inline void setwritemode(GDisplay *g) { (void) g; } /** * @brief Read data from the lcd. * @return The data from the lcd * * @param[in] g The GDisplay structure * * @notapi */ static inline uint16_t read_data(GDisplay *g) { (void) g; return 0; } #endif /* _GDISP_LLD_BOARD_H */ My main.c #include "ch.h" #include "hal.h" #include "gfx.h" #include "board_ILI9341.h" int main(void) { coord_t width, height; halInit(); chSysInit(); gfxInit(); // Get the screen size width = gdispGetWidth(); height = gdispGetHeight(); // Code Here gdispFillArc(width/2, height/2, width/4, -10, -45, White); gdispDrawCircle(width/2+width/8, height/2-height/8, 13, Green); gdispFillCircle (width/2+width/8, height/2-height/8, 10, Red); gdispDrawArc(width/2+width/8, height/2-height/8, 20, 25, 115, Gray); gdispFillEllipse (width-width/6, height-height/6, width/8, height/16, Blue); gdispDrawEllipse (width-width/6, height-height/6, width/16, height/8, Yellow); while(TRUE) { gfxSleepMilliseconds(500); } }
  23. Yes the backlight is working. White screen with no noise. So I tested the pins with a scope and pressed reset on each pin test. DB08 8 /NOTHING DB09 9 /NOTHING DB10 10 /NOTHING DB11 11 /NOTHING DB12 12 /NOTHING DB13 13 /NOTHING DB14 14 /NOTHING DB15 15 /NOTHING DB00 0 /NOTHING DB01 1 /NOTHING DB02 2 /NOTHING DB03 3 /NOTHING DB04 4 /NOTHING DB05 5 /NOTHING DB06 6 /NOTHING DB07 7 /NOTHING CS 8 /3 PULSE'S ON RESET RS 9 /NOTHING WR 10 /3 BURST'S OF PULSE'S RD 11 /NOTHING Thanks
  24. Ok, That compiled with no errors but still no good.. What should my pin configuration be in my board.h file for such a setup?
  25. Ok I tryed your borad_ILI9325.h and now i get these errors 'busC' undeclared (first use in this function) board_ILI9325.h 'busB' undeclared (first use in this function) board_ILI9325.h 'index' undeclared (first use in this function) board_ILI9325.h a label can only be part of a statement and a declaration is not a statement board_ILI9325.h line 31 expected expression before 'IOBus' board_ILI9325.h line 32
×
×
  • Create New...