I have a 1602A V2.0
LCD display (16 chars x 2 lines) that I intend to connect to my Kinetis MK26 ARM M4
MCU via a LCM 1602 I2C extender
(which has a Philips PCF8574AT
on it).
I'm trying to get it to work since this morning, but apparently, the address I calculated for the I2C extender (0x3F
according to this datasheet, A0, A1, A2 are non-jumpered) is not OK, so I tried to scan for a valid address where the I2C extender would ACK
me back, but I cannot find any.
I connected just the PCF8574AT
to my board, the LCD is not connected and it still doesn't work.
I have the following piece of code (KSDK 2.0):
#include "fsl_gpio.h"
#include "fsl_port.h"
#include "fsl_i2c.h"
#include "Retarget.h"
#include "Log.h"
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
int main()
{
RetargetInit();
i2c_master_config_t masterConfig;
uint8_t status;
/* Get default configuration for master. */
I2C_MasterGetDefaultConfig(&masterConfig);
printf("Got def. config\r\n");
/* Init I2C master. */
I2C_MasterInit(I2C0, &masterConfig, CLOCK_GetFreq(I2C0_CLK_SRC));
//I2C_Enable()
printf("Init\r\n");
/* Send start and slave address. */
printf("Starting...\r\n");
// 0x70, 0x27, 0x38, 0x20, 0x3F
uint8_t u8Addr = 0x3F;
for(u8Addr=0; u8Addr<128; u8Addr++)
{
status = I2C_MasterStart(I2C0, u8Addr, kI2C_Write);
LOG("sent address 0x%x", u8Addr);
uint32_t u32Flags;
/* Wait address sent out. */
uint16_t timeout = UINT16_MAX;
while(!((u32Flags = I2C_MasterGetStatusFlags(I2C0)) & kI2C_IntPendingFlag) && (--timeout))
{
}
if((u32Flags = I2C_MasterGetStatusFlags(I2C0)) & kI2C_IntPendingFlag)
{
LOG("ADDRESSS 0x%x IS OK", u8Addr);
}
LOG("timeout is %d", timeout);
//LOG("done address");
status = I2C_MasterStop(I2C0);
LOG("Stopped with status=%d", status);
}
}
Could you please point out what I'm doing wrong, why my scan doesn't yield any results?
Or is there a problem with my I2C extender, phisycally?
I'd expect the output of the above code to contain a single "ADDRESSS 0x… IS OK" line with a timeout different than 0, but that's not the case.
Merry Christmas!
PS:
The LCM 1602 I2C extender I'm talking about is this one (with the Philips controller on it):
Which as as far as I can tell has this schematic (although the controller is not identical):
http://www.nexuscyber.com/Content/files/Schematic/I2C_Schematic.pdf
I connected the SDA & SCL to the properly labeled pins on my board (so I guess pull-up resistors are in place, I'd have to check to be sure), and the GND and VDD to a GND and a 3v3 on the board directly (I also tried connecting it to a separate 5v power source, results are the same).
Best Answer
According to the schematic of the PCB and the datasheet of PCF8574 the I2C address can be calculated after figure 10:
I'm not sure which version of the IC you are using. The schematic says PCF8574 and you mentioned the PCF8574A. However if it's the PCF8574 the address is 0x20, if it's PCF8574A the address is 0x70.