My Freescale P2020 based embedded single board computer (SBC) uses an NXP
PCA9670 I2C 8 line GPIO Expander. I would like to create an active low pulse
(idle high, toggle line low and then immediately back high as fast as possible)
on one of the GPIO lines that has a stable and consistent pulse width. The
PCA9670 uses 8 bit data and supports multiple consecutive data bytes following
the address. My thought was that if I could get my system to output the I2C
address and two data bytes all consecutively back-to-back, then the pulse width
should be stable and consistent. I have tried using i2c-tools i2c-dev.h as
shown below both using a write() call and alternatively using a call to
i2c_smbus_write_byte_data(). I did not really see a difference between these
two options. In both cases, the pulse width varies quite a bit from about 100
usec to about 3 msec. So it appears that the bytes are not all going out the
I2C master back-to-back consecutively but one at a time with the chance that
the CPU gets busy servicing interrupts, etc. between bytes.
The Gentoo Linux distribution for my SBC uses a 3.0.4 kernel.
Please let me know if there is any way to get multiple data bytes to go out on
the I2C bus consecutively back-to-back from userspace. If this is not possible
from userspace, what other options would work as desired.
NOTE: the header file i2c-dev.h used was from i2c-tools version 3.1.0
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include "i2c-dev.h"
#define I2CDEV "/dev/i2c-0"
#define I2CADDR 0x27
int main(void)
{
int fd;
char buf[2] = {0xf7, 0xff};
if ((fd = open(I2CDEV, O_WRONLY)) < 0)
{
printf("ERROR: unable to open I2C device %s\n", I2CDEV);
exit(-1);
}
if (ioctl(fd, I2C_SLAVE_FORCE, I2CADDR) < 0)
{
printf("ERROR: ioctl call failed, errno=0x%x\n", errno);
exit(-1);
}
while (1)
{
// write(fd, buf, 2);
i2c_smbus_write_byte_data(fd, buf[0], buf[1]);
sleep(1);
}
}
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html