Cepгeй Бopщ (28.03.2012 16:39 - 16:42, просмотров: 161) ответил FDA на Кто работал с ЖКИ WDX0006-TGH-#01 (контроллер Sitronix ST7549)? Я что-то не понял с протоколом I2C. Получается что после передачи адреса перед передачей control byte нужно передат ьещё один бит??? Ни у кого примерчика нет для этого контроллера?
С 7548 работал, не было там такого. И в этом такая же диаграма. Где вы лишний бит увидели? В контрольном байте два старших бита несут полезную информацию и 6 незначащих. Примерчик вот такой, если поможет:
namespace ns_st7548
{
static uint8_t const I2C_address = 0x78 >> 1;
enum mode_t
{
CMD_TILL_STOP = 0x00,
DATA_TILL_STOP = 0x40
};
enum command_t
{
// General commands
FUNCTION_SET = 0x20,
SET_Y = 0x40,
SET_X = 0x80,
// Basic commands
DISPLAY_CONTROL = 0x08,
SET_VO_RANGE = 0x04,
// Extended commands
DISPLAY_CONFIG = 0x08,
SET_BIAS = 0x10,
SET_Vo = 0x80,
};
enum func_set_t
{ // FUNCTION_SET
XDIRECTION_NORMAL = (0 << 4), // MX = 0
XDIRECTION_REVERSE = (1 << 4), // MX = 1
YDIRECTION_NORMAL = (0 << 3), // MY = 0
YDIRECTION_REVERSE = (1 << 3), // MY = 1
POWER_ON = (0 << 2), // PD = 0
POWER_DOWN = (1 << 2), // PD = 1
HORIZONTAL_ADDRESSING = (0 << 1), // V = 0
VERTICAL_ADDRESSING = (1 << 1), // V = 1
BASIC_CMD_SET = (0 << 0), // H = 0
EXTENDED_CMD_SET = (1 << 0), // H = 1
};
enum disp_ctrl_t
{ // DISPLAY_CONTROL
BLANK = (0 << 2) | (0 << 0), // D = 0, E = 0
NORMAL = (1 << 2) | (0 << 0), // D = 1, E = 0
ALL_ON = (0 << 2) | (1 << 0), // D = 0, E = 1
INVERSE = (1 << 2) | (1 << 0), // D = 1, E = 1
};
enum vo_range_t
{ // SET_VO_RANGE
VO_LOW = (0 << 0), // PRS = 0
VO_HIGH = (1 << 0), // PRS = 1
};
enum cfg_t
{ // DISPLAY_CONFIG
MSB_ON_TOP = (0 << 2),
LSB_ON_TOP = (1 << 2),
};
enum bias_t
{ // SET_BIAS
BIAS_11,
BIAS_10,
BIAS_9,
BIAS_8,
BIAS_7,
BIAS_6,
BIAS_5,
BIAS_4,
};
}
using namespace ns_st7548;
#include "i2c.h"
static i2c_t<I2C_address, USCI0, DMA2 > I2C;
uint8_t const st7548_t::init_cmd[] =
{
FUNCTION_SET
| XDIRECTION_NORMAL
| YDIRECTION_NORMAL
| POWER_ON
| HORIZONTAL_ADDRESSING
| EXTENDED_CMD_SET // H = 1
,
DISPLAY_CONFIG
| LSB_ON_TOP // DO = 1
,
SET_BIAS
| BIAS_9 // 64 rows => 1/64 duty cycle
,
SET_Vo
| 0xFF // Vo = max at 0xFF
// | 0x64 // Vo = max at 0xFF
,
FUNCTION_SET
| XDIRECTION_NORMAL
| YDIRECTION_NORMAL
| POWER_ON
| HORIZONTAL_ADDRESSING
| BASIC_CMD_SET // H=0
,
SET_VO_RANGE
| VO_HIGH // Vo gen ON(PRS=1)
,
DISPLAY_CONTROL
| NORMAL // D=1 E=0 , normal mode
,
SET_Y
| 0x00 // Y=0
,
SET_X
| 0x00 // X=0
};
//***************************************
void st7548_t::power_on()
{
ON(LCD_SUPPLY);
ON(LCD_RESET);
{
uint8_t volatile i = 0;
while (--i);
}
// delay_ms(1);
OFF(LCD_RESET);
{
uint8_t volatile i = 0;
while (--i);
}
// delay_ms(10);
//***************************************************
//* Lcd init commands *
//***************************************************
I2C.on();
if(I2C.write(CMD_TILL_STOP, init_cmd, sizeof(init_cmd)))
{
PoweredOn = true;
Buffer.Update.Left = 0;
Buffer.Update.Right = SIZE_X;
Buffer.Update.Bottom = 0;
Buffer.Update.Top = SIZE_Y;
}
}