天嵌 ARM开发社区

 找回密码
 注册
查看: 3958|回复: 6

请教TQ2440的I2C程序

[复制链接]
jiang11 发表于 2012-3-5 17:34:08 | 显示全部楼层 |阅读模式
本帖最后由 jiang11 于 2012-3-5 18:45 编辑

TQ2440,自带了一个I2C的测试程序,文件为:apps/IIC_RW/i2c_rw.c
这个程序测试正常
现在有个应用,想通过I2C向另外一个设备发送数据,使用上述代码之后,发现有个问题:
比如想发送的数据为:0xFF 0xFE 两个字节,则接收到的数据为:0x00 0xFF 0x01 0xFE四个字节
其中1、3是eeprom的内部地址,2,4是发送的数据。
如果只想收到发送的数据,即0xFF 0xFE,该如何修改?
相关的代码如下(摘自测试程序i2c_rw.c):
int eeprom_write_byte(struct eeprom *e, __u16 mem_addr, __u8 data)
{
        int r;
        __u8 command = mem_addr & 0x00ff;
        union i2c_smbus_data i2cdata;
        i2cdata.byte = data;
        r = i2c_smbus_access(e->fd, I2C_SMBUS_WRITE, command, I2C_SMBUS_BYTE_DATA, &i2cdata);

        if(r < 0)
                printf("iic write error");
        usleep(10);
        return r;
}

static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, int size, union i2c_smbus_data *data)
{
struct i2c_smbus_ioctl_data args;
args.read_write = read_write;
args.command = command;
args.size = size;
args.data = data;
return ioctl(file, I2C_SMBUS, &args);
}


借我你的一生 发表于 2012-3-5 19:46:39 | 显示全部楼层
我还在点LED...:Q:Q
回复

使用道具 举报

embedsky_lhh 发表于 2012-3-6 09:14:45 | 显示全部楼层
没明白楼主的意思,什么叫只发送数据,你那I2C的芯片是什么类型的啊,如果是E2PROM 或者要求发送地址的芯片你就得先发地址然后再发数据。
回复

使用道具 举报

 楼主| jiang11 发表于 2012-3-6 15:50:24 | 显示全部楼层
apps/IIC_RW/i2c_rw.c这个代码是向E2PROM发送数据的,E2PROM要求先发送一个地址(E2PROM的地址)再发数据。
我现在要做的是向另外一个设备发送数据,另外一个设备不是E2PROM,不需要类似于E2PROM的地址。
我说的另外一个设备是一个单片机,上面有个接收数据的程序。
使用apps/IIC_RW/i2c_rw.c这个代码发送数据之后,本来要发送0xFF 0xFE2个字节的数据,单片机会收到4个字节的数据0x00 0xFF 0x01 0xFE,相当于传输速率只有原来的50%
我希望能够不发送0x00 0x01这2个字节,利用上面的代码,要怎么修改?
回复

使用道具 举报

embedsky_lhh 发表于 2012-3-8 12:04:59 | 显示全部楼层
jiang11 发表于 2012-3-6 15:50
apps/IIC_RW/i2c_rw.c这个代码是向E2PROM发送数据的,E2PROM要求先发送一个地址(E2PROM的地址)再发数据。 ...

那你就发0xff 0xfe 就行了,不发0x00 0x01
回复

使用道具 举报

亚瑟王 发表于 2012-3-8 12:16:06 | 显示全部楼层
你好,在Linux的iic驱动中有有很多协议可以使用的。我们用的是smbus的,在给的例子程序里面有个很关键的函数:

static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, int size, union i2c_smbus_data *data)
{
        struct i2c_smbus_ioctl_data args;

        args.read_write = read_write;
        args.command = command;
        args.size = size;
        args.data = data;
        return ioctl(file, I2C_SMBUS, &args);
}
这个函数的最后一行就是调用的iic驱动的ioctl函数,然后在ioctl函数中判断了使用的类型。
args.command就是存放的eeprom内部的地址。
根据你描述的情况,你可以使用尝试一下在刚刚的函数中修改I2C_SMBUS为I2C_RDWR,然后修改args结构体为:i2c_rdwr_ioctl_data,这个结构体只有两个成员:

struct i2c_rdwr_ioctl_data {
        struct i2c_msg __user *msgs;        /* pointers to i2c_msgs */
        __u32 nmsgs;                        /* number of i2c_msgs */
};
这个应该可以满足你的要求。
回复

使用道具 举报

亚瑟王 发表于 2012-3-8 12:23:15 | 显示全部楼层
并且根据smbus结构体的情况,理论上讲:你把你要发的数据,假设是10个字节,第一个字节放到command上,后9个字节放到data数组上,一样的可以发送10个字节的。方法多种多样,就看你个人对它的理解和实际操作了。
struct i2c_smbus_ioctl_data {
        __u8 read_write;
        __u8 command;
        __u32 size;
        union i2c_smbus_data __user *data;
};
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-20 22:22 , Processed in 2.044345 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表