Jag sitter och försöker sparka igång en display men lyckas inte. Nu tror jag att jag kört huvudet in i väggen för jag vet varken ut eller in.
Displayen jag pillrar med heter SD1298
http://www.techtoys.com.hk/Displays/FG ... WHG01.htm
På hemsidan ovan finns färdiga programmerings exempel och kopplingsscheman för hur displayen skall kopplas in och initieras. Trots all denna hjälp lyckas jag inte. Den enda lycka jag haft är att lyckas tända/släcka backlighten

Jag försökte först använda SPI interfacet till displayen, men lyckades inte. De jag beställde displayen av sa att det var långsamt och att de inte ens försökt. Efter en hel del meckande, utan att få igång den försöker jag nu med paralell interfacet.
Just nu har jag uppkopplat en platta med 8 bitars paralellbuss och tillgång till
CS, WR, WD, CD och RESET till displayen. Jag har testat alla pinnarna så att det går att toggla mellan 1 och 0 (testet har jag gjort upprepade gånger då jag trott att det var problemet)
Man kan ställa in hur man vill prata med displayen genom att sätta PS3, PS1 och PS0, och är satt till [1,0,0] som motsvarar 8080 8 bit paralell interface enligt databladet.
Jag har stegat genom koden för ett skriv kommando och mätt så att pinnarna får rätt värden och att det sker i rätt ordning, men displayen ändrar sig ingenting. Ett tag trodde jag att den behövde en längre reset-puls, så jag låter reset vara låg i ca 40ms efter att processorn startar uppt för att låta den resettas ordentligt.
Jag har även testat att skriva "read" commandon till displayen för att se om jag kan läsa ut samma värde som jag skrivit, men jag läser bara 0xFF på databussen från displayen.
Jag börjar misstänka att det är nått problem med själva displayen, men vet av erfarenhet att jag brukar missa på en del enkla grejjer. Har ni någon aning om vad jag skulle kunna testa för att se om displayen lever över huvud taget??
här kommer lite kod som jag kör på displayen:
Kod: Markera allt
int main(void)
{
uint8 x;
// peperials
timer2_init();
init_io();
board_3VSens_dis(); // pull RESET pin low
timer2_delay_ms(40);
board_3Vdisp_en(); // pull RESET pin high
board_3VSens_en();
ssd_lcd_init();
while(1)
{
// init display
ssd_lcd_init();
// write a line
for(x=0;x<240;x++) cDispSetPixel(x, 32, RGB16(0,0,31));
timer2_delay_ms(200);
}
return 1;
}
#define DISP_CMD 0
#define DISP_DAT 1
// pin definitions.
#define DISP_SHDN_BL PORTBbits.RB11 // pwm for backlight control
#define DISP_CD PORTBbits.RB13
#define DISP_WR PORTBbits.RB14 //< // kolla om den verkligen behövs.
#define DISP_CS PORTGbits.RG15 //<
#define DISP_RD PORTFbits.RF3 //< // kolla om den verkligen behövs
#define DISP_BUS PORTD
uint8 ssd_read(void)
{
uint8 u8Temp;
DISP_BUS|= 0x00FF; //set dataport to input
DISP_WR = 1;
DISP_RD = 0;
DISP_CD = 1;
DISP_CS =0;
DISP_CS = 1;
Nop();
Nop();
Nop();
u8Temp = PORTD &0xFF;
DISP_RD = 1;
return u8Temp;
}
void ssd_lcd_data(uint8 u8Data)
{
TRISD &= 0xFF00;
DISP_BUS &= 0xFF00;
DISP_BUS |= u8Data;
DISP_CD = HIGH; // high for display data
DISP_WR = LOW;
DISP_RD = HIGH;
DISP_CS = LOW;
DISP_CS =HIGH;
}
void ssd_lcd_cmd(uint8 u8Data)
{
TRISD &= 0xFF00;
DISP_BUS &= 0xFF00;
DISP_BUS |= u8Data;
DISP_CD = LOW; // high for display data
DISP_WR = LOW;
DISP_RD = HIGH;
// clock pulse
DISP_CS = LOW;
DISP_CS =HIGH;
}
uint16 ssd_read_data(uint8 addr)
{
uint16 u16Temp;
// ssd_lcd_cmd(addr); // set register address
u16Temp = ssd_read();
u16Temp = u16Temp<<8;
u16Temp |= ssd_read();
return u16Temp;
}
void ssd_clr(uint16 u16Color)
{
uint8 i,hiByte,lowByte;
uint16 j;
hiByte = u16Color>>8;
lowByte = (uint8)u16Color;
for(j=0;j<320;j++)
{
for(i=0;i<240;i++)
{
ssd_lcd_data(i); ssd_lcd_data(j);
}
}
}
void cDispSetPixel(uint8 x, uint16 y, uint16 color)
{
uint8 hiByte, lowByte;
ssd_lcd_cmd(0x4E); //set address in the 240 pixel direction
ssd_lcd_data(0x00); //hiByte first fill all zero
ssd_lcd_data(x); //0<x<239
hiByte = y>>8;
lowByte = (uint8)y;
ssd_lcd_cmd(0x4F); //set address in the 320 pixel direction
ssd_lcd_data(hiByte);
ssd_lcd_data(lowByte);
hiByte = color>>8;
lowByte = (uint8)color;
ssd_lcd_cmd(0x22); //RAM write command
ssd_lcd_data(hiByte); //write color content here
ssd_lcd_data(lowByte);
}
void ssd_lcd_init(void)
{
volatile uint16 u16Temp;
DISP_SHDN_BL = 1;
DISP_CD = 1;
DISP_WR = 1; //< // kolla om den verkligen behövs.
DISP_CS = 1;
TRISD &= 0xFF00;
PORTD &= 0xFF00;
ssd_lcd_cmd(0x00); //Start Oscillation
ssd_lcd_data(0x00);
ssd_lcd_data(0x01);
u16Temp = ssd_read_data(0x00);
ssd_lcd_cmd(0x01); //Driver Output Control
ssd_lcd_data(0x23);
ssd_lcd_data(0x3F);
u16Temp = ssd_read_data(0x01);
ssd_lcd_cmd(0x02); //LCD Drive AC Control
ssd_lcd_data(0x06);
ssd_lcd_data(0x00);
ssd_lcd_cmd(0x03); //Power Control (1)
ssd_lcd_data(0xA8);
ssd_lcd_data(0xA6);
ssd_lcd_cmd(0x07); //Display Control
ssd_lcd_data(0x00);
ssd_lcd_data(0x33);
ssd_lcd_cmd(0x11); //Entry Mode (R11h): Set Display color mode for 65k/262k color
ssd_lcd_data(0x68); //DFM1:DFM0=1:1 for 65k color (POR)
ssd_lcd_data(0x30);
ssd_lcd_cmd(0x0C); //Power Control (2)
ssd_lcd_data(0x00);
ssd_lcd_data(0x05);
ssd_lcd_cmd(0x0D); //Power Control (3)
ssd_lcd_data(0x30);
ssd_lcd_data(0x0B);
ssd_lcd_cmd(0x0E); //Power Control (4)
ssd_lcd_data(0x20);
ssd_lcd_data(0x00);
ssd_lcd_cmd(0x10); //Exit Sleep Mode
ssd_lcd_data(0x00);
ssd_lcd_data(0x00);
timer2_delay_ms(30);
//DelayMs(30); //delay 30ms
ssd_lcd_cmd(0x1E); //Power Control (5)
ssd_lcd_data(0x00);
ssd_lcd_data(0xA8);
ssd_lcd_cmd(0x44); //Horizontal RAM address position start/end setup
ssd_lcd_data(0xEF); //dec 239
ssd_lcd_data(0x00); //dec 0, i.e. horizontal ranges from 0 -> 239
//POR value is 0xEF00 anyway. This address must be set before RAM write
ssd_lcd_cmd(0x45); //Vertical RAM address start position setting
ssd_lcd_data(0x00); //0x0000 = dec 0
ssd_lcd_data(0x00);
ssd_lcd_cmd(0x46); //Vertical RAM address end position setting
ssd_lcd_data(0x01); //0x013F = dec 319
ssd_lcd_data(0x3F);
ssd_lcd_cmd(0x22); //RAM write command
ssd_clr(SSD_GREEN);
}