نوشته اصلی توسط
skiboys
ممنون من lcd را راه اندازی کرده ام بدون emwin برای توابع هم با استفاده از هدرهای موجود خودم هدر نوشته ام برای درایور ILI9325
منظورم این بود که پایه های کنترلی و پایه های دیتا کجا تعریف شده اند که من طبق سخت افزار خود تغییرشان دهم؟
برای ان برنامه نگفتید روی LCD چه چیزی مشاهده خواهیم کرد؟
وقتی ال سی دی رو راه اندازی کردید بدون emwin، دیگه به سخت افزار کاری نخواهیم داشت. فقط به سراغ فایل LCDCONF.H بروید.
اونجا چند تا تابع هست. السیدی من 320*240 با درایورILI9320 است که بصورت SPI به میکرو وصل شده. در فایل LCDCONF.H فایل هدر السیدی روincludeکنید.
سپس تنظیمات ماکروهای اول فایل رو انجام بدهید:
کد:
// Color depth
//
#define LCD_BITSPERPIXEL 16 /* Currently the values 16 and 18 are supported */
//
// Physical display size
//
#define XSIZE_PHYS 320
#define YSIZE_PHYS 240
//
// Color conversion
//
#define COLOR_CONVERSION GUICC_565
//
// Display driver
//
#define DISPLAY_DRIVER GUIDRV_FLEXCOLOR
//
// Orientation
//
//#define DISPLAY_ORIENTATION (0)
//#define DISPLAY_ORIENTATION (GUI_MIRROR_X)
//#define DISPLAY_ORIENTATION (GUI_MIRROR_Y)
//#define DISPLAY_ORIENTATION (GUI_MIRROR_X | GUI_MIRROR_Y)
//#define DISPLAY_ORIENTATION (GUI_SWAP_XY)
//#define DISPLAY_ORIENTATION (GUI_MIRROR_X | GUI_SWAP_XY)
#define DISPLAY_ORIENTATION (GUI_MIRROR_Y | GUI_SWAP_XY)
//#define DISPLAY_ORIENTATION (GUI_MIRROR_X | GUI_MIRROR_Y | GUI_SWAP_XY)
سپس تابع InitController رو ملاحظه کنید. در این تابع باید تابع LCDInit رو قرار بدهید و تمام.
از اینجا به بعد شما دو انتخاب دارید:
یکی استفاده از توابع ارسال تکی و بلوکی و دیگری توابع ارسال ساده اطلاعات/
اگر می خواهید به روش ساده عمل کنید، تابع LCD_X_DisplayDriver رو ببینید، اونجا چند قسمت هست که در نسخه BSP همه اونها حذف شده (چون از روش اول استفاده شده).
در نسخه precompile که با کیل اومده، فایل دست نخورده در فولدر سمپل قرار گرفته.
در اون فایل تابع بصورت زیر تعریف شده:
کد:
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData) {
int r;
switch (Cmd) {
case LCD_X_INITCONTROLLER: {
//
// Called during the initialization process in order to set up the
// display controller and put it into operation. If the display
// controller is not initialized by any external routine this needs
// to be adapted by the customer...
//
// ...
return 0;
}
case LCD_X_SETVRAMADDR: {
//
// Required for setting the address of the video RAM for drivers
// with memory mapped video RAM which is passed in the 'pVRAM' element of p
//
LCD_X_SETVRAMADDR_INFO * p;
p = (LCD_X_SETVRAMADDR_INFO *)pData;
//...
return 0;
}
case LCD_X_SETORG: {
//
// Required for setting the display origin which is passed in the 'xPos' and 'yPos' element of p
//
LCD_X_SETORG_INFO * p;
p = (LCD_X_SETORG_INFO *)pData;
//...
return 0;
}
case LCD_X_SHOWBUFFER: {
//
// Required if multiple buffers are used. The 'Index' element of p contains the buffer index.
//
LCD_X_SHOWBUFFER_INFO * p;
p = (LCD_X_SHOWBUFFER_INFO *)pData;
//...
return 0;
}
case LCD_X_SETLUTENTRY: {
//
// Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p
//
LCD_X_SETLUTENTRY_INFO * p;
p = (LCD_X_SETLUTENTRY_INFO *)pData;
//...
return 0;
}
case LCD_X_ON: {
//
// Required if the display controller should support switching on and off
//
return 0;
}
case LCD_X_OFF: {
//
// Required if the display controller should support switching on and off
//
// ...
return 0;
}
default:
r = -1;
}
return r;
}
که در اون دستورات مختلفی که emwin بهش نیاز داره رو نشون داده. شما باید در هر case دستور مورد نیاز رو قرار بدهید.
اگر میخواهید از روش اول استفاده کنید که پیشنهاد میکنم استفاده کنید، تابع LCD_X_Config رو باید اصلاح کنید:
در این تابع، در نسخه BSP ساختاری به نام PortAPI تعریف شده که وظیفش معرفی توابع ارسال تکی و بلوکی رجیستر و داده السیدی است. توابعPortAPI برای مودهای 8، 16 و 32 وجود دارند. من مود 16 بیتی که 65K رنگ بود رو انتخاب کرده ام. چون مود 18 بیتی که السیدی ساپورت میکنه رو emwin ساپورت نمیکنه.!!
کد:
PortAPI.pfWrite16_A0 = LCD_X_SPI_Write00;
PortAPI.pfWrite16_A1 = LCD_X_SPI_Write01;
PortAPI.pfWriteM16_A1 = LCD_X_SPI_WriteM01;
PortAPI.pfReadM16_A1 = LCD_X_SPI_ReadM01;
در مثال فوق LCD_X_SPI_Write00 برای ارسال یک فرمان و LCD_X_SPI_Write01 برای ارسال یک داده ، LCD_X_SPI_WriteM01 برای ارسال بلوکی از داده ها و LCD_X_SPI_ReadM01 برای خواندن بلوکی از داده ها به ساختار PortAPI معرفی شده است.
این هم شرح توابع فوق:
کد:
/*******************************************************************************
* Write command *
* Parameter: c: command to write *
* Return: *
*******************************************************************************/
void LCD_X_SPI_Write00(U16 c)
{
wr_cmd(c);
}
/*******************************************************************************
* Write data byte *
* Parameter: c: word to write *
* Return: *
*******************************************************************************/
void LCD_X_SPI_Write01(U16 c)
{
wr_dat(c);
}
/*******************************************************************************
* Write multiple data bytes *
* Parameter: pData: pointer to words to write *
* NumWords: Number of words to write *
* Return: *
*******************************************************************************/
void LCD_X_SPI_WriteM01(U16 * pData, int NumWords)
{
LCD_CS(0);
spi_tran_fifo(SPI_START | SPI_WR | SPI_DATA); /* Write : RS = 1, RW = 0 */
while(NumWords--)
{
spi_tran_fifo(((*pData) >> 8)); /* Write D8..D15 */
spi_tran_fifo(((*(pData++)) & 0xFF)); /* Write D0..D7 */
}
while(LPC_SSP0->SR & (1<<4)); /* wait until done */
LCD_CS(1);
}
/*******************************************************************************
* Read multiple data bytes *
* Parameter: pData: pointer to words to read *
* NumWords: Number of words to read *
* Return: *
*******************************************************************************/
void LCD_X_SPI_ReadM01(U16 * pData, int NumWords)
{
LCD_CS(0);
spi_tran_fifo(SPI_START | SPI_RD | SPI_DATA); /* Read: RS = 1, RW = 1 */
spi_tran_fifo(0); /* Dummy byte 1 */
while(NumWords--)
{
*pData = spi_tran(0) << 8; /* Read D8..D15 */
*(pData++) |= spi_tran(0); /* Read D0..D7 */
}
while(LPC_SSP0->SR & (1<<4)); /* wait until done */
LCD_CS(1);
}
به نحوه ارسال و دریافت بلوکی داده ها توجه کنید. در دیتاشیت درایور السیدی شماحتما در این مورد صحبت شده. اگر تصمیم دارید که سرعت نمایش تصاویر بالا باشه یااحیانا فیلم نمایش بدهید گریزی از این توابع نیست. مخصوصا اگر سرعت انتقال اطلاعات پایین باشه مثل السیدی من که SPI است. سایر توابع که مربوط به lowlevel ارسال اطلاعات با SPI بوده رو دیگه ننوشتم...
در آخر مقادیر تعریف شده رو به emwin میفرستیم:
کد:
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16);
//
// Orientation
//
Config.Orientation = DISPLAY_ORIENTATION;
Config.NumDummyReads = 2; /* 5 dummy bytes are required when reading GRAM by SPI. 1 byte is read in LCD_X_SPI_WriteM01, so 4 bytes are left */
GUIDRV_FlexColor_Config(pDevice, &Config);
اگه همه چیز درست باشه، با پروگرام کردن bsp دموی EMWIN اجرا خواهد شد
این لینک هم مفیده حتما بخونید:
http://www.nxp.com/documents/applica...te/AN11218.pdf
نکته دیگه درباره این فایل، تعریف pDevice است. در پست بعدی توضیح می دهم