Предпринимается попытка вывести на дисплей точку.
Контроллер дисплея- Epson S1D15G00.
Код следующий:
volatile AT91PS_PIO pPIOA = AT91C_BASE_PIOA;
void Delay (unsigned long a)
{
while (--a!=0);
}
void SpiInit()
{
*AT91C_PIOB_OER=BIT20;
*AT91C_PIOB_SODR=BIT20;
*AT91C_PIOB_OER=BIT2;
*AT91C_PIOB_SODR=BIT2;
*AT91C_PIOB_OER=BIT12;
*AT91C_PIOB_SODR=BIT12;
*AT91C_PIOB_PDR=BIT12 | BIT16 | BIT17 | BIT18;
*AT91C_PIOB_ASR=BIT12 | BIT16 | BIT17 | BIT18;
*AT91C_PIOB_BSR=0x0;
*AT91C_PMC_PCER=1 << AT91C_ID_SPI0;
*AT91C_SPI0_CR=AT91C_SPI_SWRST | AT91C_SPI_SPIEN;
*AT91C_SPI0_CR=AT91C_SPI_SPIEN;
*AT91C_SPI0_MR=(AT91C_SPI_DLYBCS & (0 << 24)) |
(AT91C_SPI_PCS & (0xE << 16)) |
(AT91C_SPI_LLB & (0 << 7)) |
(AT91C_SPI_MODFDIS & (1 << 4)) |
(AT91C_SPI_PCSDEC & (0 << 2)) |
(AT91C_SPI_PS & (0 << 1)) |
(AT91C_SPI_MSTR & (1 << 0));
*AT91C_SPI0_CSR =(AT91C_SPI_DLYBCT & (0x01 << 24)) |
(AT91C_SPI_DLYBS & (0x01 << 16)) |
(AT91C_SPI_SCBR & (0x10 << 8)) |
(AT91C_SPI_BITS & (AT91C_SPI_BITS_9)) |
(AT91C_SPI_CSAAT & (0x0 << 3)) |
(AT91C_SPI_NCPHA & (0x0 << 1)) |
(AT91C_SPI_CPOL & (0x01 << 0));
}
void WriteSpiCommand(volatile unsigned int command) {
while((*AT91C_SPI0_SR & AT91C_SPI_TXEMPTY) == 0);
command = (command & ~0x0100);
*AT91C_SPI0_TDR = command;
}
void WriteSpiData (volatile unsigned int data)
{
while ((*AT91C_SPI0_SR & AT91C_SPI_TXEMPTY) ==0);
data=(data | 0x100);
*AT91C_SPI0_TDR=data;
}
void InitLcd(void)
{
LCD_RESET_LOW;
Delay(10000);
LCD_RESET_HIGH;
Delay(10000);
WriteSpiCommand(DISCTL);
WriteSpiData(0x00);
WriteSpiData(0x20);
WriteSpiData(0x00);
WriteSpiCommand(COMSCN);
WriteSpiData(1);
WriteSpiCommand(OSCON);
WriteSpiCommand(SLPOUT);
WriteSpiCommand(PWRCTR);
WriteSpiData(0x0f);
WriteSpiCommand(DISINV);
WriteSpiCommand(DATCTL);
WriteSpiData(0x01);
WriteSpiData(0x00);
WriteSpiData(0x02);
WriteSpiCommand(VOLCTR);
WriteSpiData(32);
WriteSpiData(3);
Delay(100000);
WriteSpiCommand(DISON);
}
void LCDSetPixel(int x, int y, int color) {
WriteSpiCommand(PASET);
WriteSpiData(x);
WriteSpiData(x);
WriteSpiCommand(CASET);
WriteSpiData(y);
WriteSpiData(y);
WriteSpiCommand(RAMWR);
WriteSpiData((color >> 4) & 0xFF);
WriteSpiData(((color & 0xF) << 4) | ((color >> 8) & 0xF));
WriteSpiData(color & 0xFF);
}
void LCDClearScreen(void) {
long i;
WriteSpiCommand(PASET);
WriteSpiData(0);
WriteSpiData(131);
WriteSpiCommand(CASET);
WriteSpiData(0);
WriteSpiData(131);
WriteSpiCommand(RAMWR);
for(i = 0; i < ((131 * 131) / 2); i++) {
WriteSpiData((BLACK >> 4) & 0xFF);
WriteSpiData(((BLACK & 0xF) << 4) | ((BLACK >> 8) & 0xF));
WriteSpiData(BLACK & 0xFF);
}
}
int main(void)
{
LowLevelInit();
SpiInit();
InitLcd();
LCDClearScreen();
LCDSetPixel(10,10,RED);
}
В результате загорается подсветка дисплея, а точкой и не пахнет.
Если есть каие- нибудь мысли поделитесь пожалуйста...