Hallo,
nachdem ich das neue Display XV-TFT2428T erhalten habe, möchte ich versuchen es an dem XMega128-A1 Modul zum laufen zu bringen. Dazu habe ich versucht den Beispielcode umzuschreiben.
Dabei ist mir aufgefallen, dass bei der Initialisierung per Software SPI, etwas fehlt. So wie der Code aktuell steht, wird immer das gleiche Bit übertragen.
Ich habe eine Zeile hinzugefügt und schiebe bei jedem Übertragungszyklus "output" jeweils ein Bit weiter.
Ich habe zum nachverfolgen den Code für den ATMega mit drin stehen lassen.
Der abgewandelte Code "Display_SPI.c" sieht wie folgt aus:
Die Headerdatei "Display_SPI.h" sieht wie folgt aus:
Die Maindatei sieht zum Test wie folgt aus:
Leider bleibt das Display schwarz und rührt sich nicht, wenn ich es initialisiere und Befehle sende.
Zumindest meine Leuchtdiode zeigt ein Clock, ein SS/ und ein MOSI Signal an wie es sein sollte, wenn ich sie an dem jeweiligen Pin anschließe.
Die Spannung am Display messe ich mit 3,4 V. Auch wenn ich das Display nur an die Spannung hänge mit einer MicroSD-Karte( ist eine 2GB-Karte zu groß ? ) und der "flash.xvc" Datei darauf, welche ich mit FAT32 formatiert habe, bleibt das Display schwarz. In der Anleitung steht, hier sollte ein Status der übertragenden Datei angezeigt werden, ist das richtig?
Ich bin für Hinweise oder Ideen zum Code oder Display dankbar
Gruß Gerald
nachdem ich das neue Display XV-TFT2428T erhalten habe, möchte ich versuchen es an dem XMega128-A1 Modul zum laufen zu bringen. Dazu habe ich versucht den Beispielcode umzuschreiben.
Dabei ist mir aufgefallen, dass bei der Initialisierung per Software SPI, etwas fehlt. So wie der Code aktuell steht, wird immer das gleiche Bit übertragen.
Ich habe eine Zeile hinzugefügt und schiebe bei jedem Übertragungszyklus "output" jeweils ein Bit weiter.
Ich habe zum nachverfolgen den Code für den ATMega mit drin stehen lassen.
Der abgewandelte Code "Display_SPI.c" sieht wie folgt aus:
Code:
#include <avr/io.h>
#include <util/delay.h>
#include "Display_SPI.h"
/*********************************************************************************
* SPI Interface
*********************************************************************************
* Microcontroller: AVR Xmega128
*
* SCK : PF7 (OUTPUT)
* MOSI : PF5 (OUTPUT)
* MISO : PF6 (INPUT)
* CS_ : PF4 (OUTPUT)
*
* BUSY_ : PF2 (INPUT, Pullup Resistor activated)
* TINT_ : PF3 (INPUT, Pullup Resistor activated)
*
*********************************************************************************/
//#define SPI_MOSI_SET() PORTB |= (1<<PB2);
#define SPI_MOSI_SET PORTF.OUTSET = PIN5_bm
//#define SPI_MOSI_CLR() PORTB &= ~(1<<PB2);
#define SPI_MOSI_CLR PORTF.OUTCLR = PIN5_bm
// #define SPI_CLK_SET() PORTB |= (1<<PB1)
#define SPI_CLK_SET PORTF.OUTSET = PIN7_bm
//#define SPI_CLK_CLR() PORTB &= ~(1<<PB1)
#define SPI_CLK_CLR PORTF.OUTCLR = PIN7_bm
//#define SPI_MISO_IS_SET() PINB & (1<<PB3)
#define SPI_MISO_IS_SET PORTF.IN & 0x20 // ist EingangsPIN "PF6" auf high, dann ist die Bedingung erfüllt
//********************************************************************************
// Software SPI an PORTF
// fck max: 2MHz
//********************************************************************************
void SPI_Init(void)
{
// Port und Direction
PORTF.DIR &= ~(1<<PIN2); /* DDRB &= ~(1<<PINB4);*/ // Busy Input Pullup
PORTCFG.MPCMASK |= (1<<PIN2); /* PORTB |= (1<<PB4);*/ // Maske setzen
PORTF.PIN0CTRL = 0x18; // mit der markierten Maske kann der PIN2 auf PullUP ( Handbuch Seite 142 ) gesetzt werden
// SS\ PF4 OUTPUT
// SCK PF7 OUTPUT
// MOSI PF5 OUTPUT
// MISO PF6 INPUT
PORTF.DIR |= (1<<PIN4)|(1<<PIN5)|(1<<PIN7); // PORTB |= (1<<PB2) | (1<<PB1) | (1<<PB0); // High
PORTF.OUTSET |= (1<<PIN4) | (1<<PIN7); // DDRB |= (1<<PB2) | (1<<PB1) | (1<<PB0); // Direction Output // hier habe ich MOSI auf low gelassen
PORTF.DIR &= ~(1<<PIN6); // DDRB &= ~(1<<PB3); // MISO Input
// TOUCH_
PORTCFG.MPCMASK |= (1<<PIN3); // PORTB |= (1<<PB5); // PINB5 Input mit Pullup
PORTF.PIN0CTRL = 0x18;
PORTF.DIR &= ~(1<<PIN3); //DDRB &= ~(1<<PB5);
_delay_ms(1000);
}
uint8_t SPI_RW (uint8_t output)
{
uint8_t input;
uint8_t i;
uint8_t c_data;
c_data = output;
for (i=0; i<8; i++)
{
SPI_CLK_CLR;
_delay_ms(100);
if (c_data & 0x80) // Output MOSI
{
SPI_MOSI_SET;
} else {
SPI_MOSI_CLR;
}
c_data = c_data <<1; // hier Bit schieben, da sonst immer das gleiche Bit gesendet wird
_delay_ms(100);
SPI_CLK_SET;
_delay_ms(100);
input <<= 1; // Input MISO
if (SPI_MISO_IS_SET)
{
input |= 1;
} else {
input &= ~1;
}
}
SPI_MOSI_CLR; // Mosi auf Null, falls das letzte übertragende Bit 1 war
return input; //return the byte clocked in from SPI slave
}
uint8_t WaitWhileDisplayBusy_Timeout500ms(void)
{
uint16_t time;
time = 50000; // timeout 500ms
while (DISPLAY_BUSY)
{
time--;
if (0 == time)
{
// Timeout, deselect display spi
SPI_SS_HIGH // timeout
_delay_us(1);
return 0x00;
}
_delay_us(10);
}
return 0xFF;
}
uint8_t WaitWhileDisplayBusy(void)
{
uint16_t time;
time = 10000; // timeout 50ms
time = 50000;
while (DISPLAY_BUSY)
{
time--;
if (0 == time)
{
// Timeout, deselect display spi
SPI_SS_HIGH // timeout
_delay_us(1);
return 0x00;
}
_delay_us(5);
}
return 0xFF;
}
uint8_t WaitUntilDisplayBusy(void)
{
uint16_t time;
time = 10000; // timeout 50ms
time = 50000;
while (DISPLAY_NOTBUSY)
{
time--;
if (0 == time)
{
// Timeout, deselect display spi
SPI_SS_HIGH // timeout
_delay_us(1);
return 0x00;
}
_delay_us(5);
}
return 0xFF;
}
uint8_t WaitWhileTouch(void)
{
uint16_t time;
time = 10000; // timeout 10ms
while (TOUCHPANEL_EVENT)
{
time--;
if (0 == time)
{
// Timeout, deselect display spi
SPI_SS_HIGH // timeout
_delay_us(1);
return 0x00;
}
_delay_us(1);
}
return 0xFF;
}
uint8_t SendCommand(uint16_t command)
{
/**************************************
Wait for display ready
**************************************/
if (!WaitWhileDisplayBusy()) return 0; // timeout
/**************************************
Select display spi
**************************************/
SPI_SS_LOW;
_delay_us(2);
/**************************************
Send command to display
**************************************/
SPI_RW((uint8_t)(command>>8)); // MSB
SPI_RW((uint8_t)command); // LSB
/**************************************
Wait until display signals busy
**************************************/
if (!WaitUntilDisplayBusy()) return 0; // timeout
return 0xFF;
}
Die Headerdatei "Display_SPI.h" sieht wie folgt aus:
Code:
#define SPI_HARDWARESPI
//#define SPI_SOFTWARESPI
/*********************************************************************************
* SPI Interface
*********************************************************************************
* Microcontroller: AVR Xmega128
*
* SCK : PF7 (OUTPUT)
* MOSI : PF5 (OUTPUT)
* MISO : PF6 (INPUT)
* CS_ : PF4 (OUTPUT)
*
* BUSY_ : PF2 (INPUT, Pullup Resistor activated)
* TINT_ : PF3 (INPUT, Pullup Resistor activated)
*
*********************************************************************************/
#define SPI_SS_HIGH _delay_us(1); /*PORTB |= (1<<PB0);*/ PORTF.OUTSET = PIN4_bm;
// Note: Deassert SS_ (CS_) not until the SPI-Transfer is really finished
// otherwise it is possible the display module does not receive the last data byte
// completely. We use an small delay of 1us to take account of this.
#define SPI_SS_LOW /* PORTB &= ~(1<<PB0);*/ PORTF.OUTCLR = PIN4_bm
#define DISPLAY_BUSY /*!(PINB & (1<<PB4));*/ !(PORTF.IN & 0x02) // Bedingung PIN3 PORTF low
#define DISPLAY_NOTBUSY /*PINB & (1<<PB4);*/ (PORTF.IN & 0x02) // Bedingung PIN3 PORTF high
#define TOUCHPANEL_EVENT /*!(PINB & (1<<PB5));*/ !(PORTF.IN & 0x04)
void SPI_Init (void);
unsigned char SPI_RW (unsigned char output);
uint8_t WaitWhileDisplayBusy_Timeout500ms(void);
uint8_t WaitWhileDisplayBusy(void);
uint8_t WaitUntilDisplayBusy(void);
uint8_t WaitWhileTouch(void);
uint8_t SendCommand(uint16_t command);
Die Maindatei sieht zum Test wie folgt aus:
Code:
#include <asf.h>
#include <util/delay.h>
#include <Display_SPI.h>
#include <Display_System.h>
#include <Display_Graphics.h>
#include <Display_Text.h>
int main (void)
{
board_init();
SPI_Init();
_delay_ms(1000);
while(1){
SetBacklightIntensity(85);
}
// Insert application code here, after the board has been initialized.
}
Leider bleibt das Display schwarz und rührt sich nicht, wenn ich es initialisiere und Befehle sende.
Zumindest meine Leuchtdiode zeigt ein Clock, ein SS/ und ein MOSI Signal an wie es sein sollte, wenn ich sie an dem jeweiligen Pin anschließe.
Die Spannung am Display messe ich mit 3,4 V. Auch wenn ich das Display nur an die Spannung hänge mit einer MicroSD-Karte( ist eine 2GB-Karte zu groß ? ) und der "flash.xvc" Datei darauf, welche ich mit FAT32 formatiert habe, bleibt das Display schwarz. In der Anleitung steht, hier sollte ein Status der übertragenden Datei angezeigt werden, ist das richtig?
Ich bin für Hinweise oder Ideen zum Code oder Display dankbar
Gruß Gerald