IST3042 - dispositivo compatible?

1

Hace poco recibí una pantalla que funciona con un IST3042 . Según la hoja de datos, este es un controlador de 160x2 TN / STN-LCD. Necesito usar el modo SPI ya que esta es la interfaz a la que tengo acceso.

Lo primero que encontré fue que utiliza una transferencia de datos de 9 bits que es similar a I2C pero que no utiliza las señales ACK / NACK. Intenté escribir en la pantalla RAM y "algo" sucede, pero no estoy muy seguro de lo que realmente estoy haciendo. Si comprendo correctamente el controlador, debo escribir el comando para establecer el puntero de datos en la posición 0 y luego comenzar a escribir los valores. Cada bit corresponde a un solo segmento por lo que entiendo, pero estoy obteniendo resultados extraños dependiendo de lo que escribo. Creo que la escritura SPI está bien porque tengo valores correctos en mi alcance (también el modo debería ser correcto).

Ahora para la pregunta principal: Alguien sabe de un dispositivo "similar" donde pueda encontrar un controlador ya existente como código de muestra para verlo. Realmente no he encontrado algo similar porque tal vez me falten los términos de búsqueda correctos.

Después de algunas búsquedas, he encontrado que esta hoja de datos del PCF8576C tiene algunos ... Similitudes interesantes, pero todavía no estoy del todo allí.

    
pregunta Tom L.

2 respuestas

0

Como se hizo en una pregunta a continuación, publicaré la solución para un controlador que funcione (extractos) aquí:

// Initialization of the SPI interface for that specific IC
spi_set_clock_polarity(SPI, CSID_SPI_DISP, SPI_DISP_CPOL);
spi_set_clock_phase(SPI, CSID_SPI_DISP, SPI_DISP_CPHA);
spi_set_bits_per_transfer(SPI, CSID_SPI_DISP, SPI_CSR_BITS_9_BIT); //<- 9bit SPI interface
spi_set_baudrate_div(SPI, CSID_SPI_DISP, (uint8_t)(sysclk_get_peripheral_hz() / SPI_DISP_FREQUENCY));
spi_set_transfer_delay(SPI, CSID_SPI_DISP, SPI_DLYBS, SPI_DLYBCT);

// Initialization for the display so after these lines you should at least see something, also some defines so you can see what's actually being sent and can compare it to the datasheet

#define IST3042_NOT_LAST_CMD            0x80    //!< Is NOT last command in sequence bit pattern
#define IST3042_CMD_MISC                0x7C    //!< Bit pattern to select miscellaneous options
void disp_init(void) {

    ist3042ca1_init(&ist3042);

    uint8_t cmd;

    cmd = IST3042_NOT_LAST_CMD | IST3042_CMD_MISC | 0x02;
    ist3042ca1_write(&ist3042, &cmd, 1);        // Preload
    delay_ms(1);

    cmd = IST3042_NOT_LAST_CMD | IST3042_CMD_POWER_CONTROL | 0x04;
    ist3042ca1_write(&ist3042, &cmd, 1);        // VFOFF
    delay_ms(1);

    cmd = IST3042_NOT_LAST_CMD | IST3042_CMD_DISPLAY_CONTROL | 0x00;
    ist3042ca1_write(&ist3042, &cmd, 1);        // Turn all segments on, do not show them, display on
    delay_ms(100);

    cmd = IST3042_NOT_LAST_CMD | IST3042_CMD_DCK_DIVIDER | 0x0F;
    ist3042ca1_write(&ist3042, &cmd, 1);        // DCK divider

}


// Aaaaand the write_packet function
static status_code_t ist3042ca1_write_packet(const ist3042ca1_t* ist3042_device, const uint8_t *data, size_t len)
{
    uint32_t timeout = SPI_TIMEOUT;
    uint32_t i = 0;
    uint16_t val;

    while (len) {
        timeout = SPI_TIMEOUT;
        while (!spi_is_tx_ready(ist3042_device->spi)) {
            if (!timeout--) {
                return ERR_TIMEOUT;
            }
        }
        //val = data[i];
        val = data[i] << 1;     // This accounts for the ACK cycle the display requires
        spi_put(ist3042_device->spi, val);
        i++;
        len--;
    }

    return STATUS_OK;
}
    
respondido por el Tom L.
-1

No puedo proporcionarle un ejemplo de código, pero ¿transmite 9 bits fuera de SPI por cada byte de información para el chip IST? De lo contrario, sus datos no estarán sincronizados con el chip (página 12 de la hoja de datos). Espero que esto ayude.

    
respondido por el user117884

Lea otras preguntas en las etiquetas