Control LCD con MSP430 a través de la mochila I2C PCF8574

1

Estoy en mi punto de vista con esto en este momento.

Necesito conectar mi MSP430G2553 con el expansor I2C PCF8574 para controlar una pantalla LCD. Hasta ahora no he tenido mucha suerte. Hay muy poco soporte en el sitio web del fabricante en términos de ejemplos de código, etc.:

Esta es la pantalla LCD - enlace

Esta es la placa secundaria I2C - enlace

Los he soldado juntos según las imágenes en el sitio web anterior y conecté la placa a mi Launchpad correctamente. Se ha eliminado el puente en P1.6. Resistencias pull-up de 10K en ambas líneas SCL y SDA. La luz de fondo de la pantalla LCD está encendida cuando el launchpad está conectado a un puerto USB.

El problema que estoy bastante seguro es que está basado en código. En el sitio web del fabricante, dice que la placa viene con la dirección de esclavo 0x3F y el código de ejemplo MSP430 que he usado reconoce la placa a través de I2C usando esta dirección. El problema que tengo ahora es escribir en la pizarra usando este código, ya que realmente no entiendo lo que está pasando. La Guía del usuario del MSP430 no es de mucha ayuda y no estoy seguro de lo que debería escribir en la pizarra secundaria para que funcione correctamente con la pantalla LCD. Aquí están las partes pertinentes de mi código:

void TI_USCI_I2C_transmitinit(unsigned char slave_address,
                      unsigned char prescale){
  P3SEL |= SDA_PIN + SCL_PIN;                 // Assign I2C pins to USCI_B0
  UCB0CTL1 = UCSWRST;                        // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;       // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;              // Use SMCLK, keep SW reset
  UCB0BR0 = prescale;                         // set prescaler
  UCB0BR1 = 0;
  UCB0I2CSA = slave_address;                  // Set slave address
  UCB0CTL1 &= ~UCSWRST;                       // Clear SW reset, resume operation
  UCB0I2CIE = UCNACKIE;
  IE2 = UCB0TXIE;                            // Enable TX ready interrupt
}

//------------------------------------------------------------------------------
// unsigned char TI_USCI_I2C_slave_present(unsigned char slave_address)
//
// This function is used to look for a slave address on the I2C bus.
//
// IN:   unsigned char slave_address  =>  Slave Address
// OUT:  unsigned char                =>  0: address was not found,
//                                        1: address found
//------------------------------------------------------------------------------
unsigned char TI_USCI_I2C_slave_present(unsigned char slave_address){
  unsigned char ie2_bak, slaveadr_bak, ucb0i2cie, returnValue;
  ucb0i2cie = UCB0I2CIE;                      // restore old UCB0I2CIE
  ie2_bak = IE2;                              // store IE2 register
  slaveadr_bak = UCB0I2CSA;                   // store old slave address
  UCB0I2CIE &= ~ UCNACKIE;                    // no NACK interrupt
  UCB0I2CSA = slave_address;                  // set slave address
  IE2 &= ~(UCB0TXIE + UCB0RXIE);              // no RX or TX interrupts
  __disable_interrupt();
  UCB0CTL1 |= UCTR + UCTXSTT + UCTXSTP;       // I2C TX, start condition
  while (UCB0CTL1 & UCTXSTP);                 // wait for STOP condition

  returnValue = !(UCB0STAT & UCNACKIFG);
  __enable_interrupt();
  IE2 = ie2_bak;                              // restore IE2
  UCB0I2CSA = slaveadr_bak;                   // restore old slave address
  UCB0I2CIE = ucb0i2cie;                      // restore old UCB0CTL1
  return returnValue;                         // return whether or not
                                              // a NACK occured
}

//------------------------------------------------------------------------------
// void TI_USCI_I2C_transmit(unsigned char byteCount, unsigned char *field)
//
// This function is used to start an I2C commuincation in master-transmit mode.
//
// IN:   unsigned char byteCount  =>  number of bytes that should be transmitted
//       unsigned char *field     =>  array variable. Its content will be sent.
//------------------------------------------------------------------------------
void TI_USCI_I2C_transmit(unsigned char byteCount, unsigned char *field){
  TI_transmit_field = field;
  byteCtr = byteCount;
  UCB0CTL1 |= UCTR + UCTXSTT;                 // I2C TX, start condition
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Disable Watchdog
_EINT(); // enable interrupts
TI_USCI_I2C_transmitinit(0x3F,0x20); // initialize USCI
i = TI_USCI_I2C_slave_present(0x3F);
while ( TI_USCI_I2C_notready() ); // wait for bus to be free
TI_USCI_I2C_transmit(1, array); // transmit a byte-long array
LPM0; // put CPU to sleep during
// communication
}

Lo siento si este es un post confuso - Estoy muy confundido por toda la tarea que estoy tratando de lograr aquí. Tengo un amigo que hizo esto usando UART y está sugiriendo que ceda en I2C y compre piezas para cambiar a ese protocolo, pero pensé que buscaría la ayuda de aquellos que podrían tener un poco de experiencia en I2C. >     

pregunta Nick

0 respuestas

Lea otras preguntas en las etiquetas