我是靠谱客的博主 勤劳天空,最近开发中收集的这篇文章主要介绍用示波器量I2C 信号,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

I2C client 挂到 adapter之后,就可以通过I2C 读写命令开始 读写设备寄存器了。
 
读写的时候,都可以用示波器量出来I2C CLK 和I2C data信号的,甚至可以读出 data信号上的,传输的设备地址和数据。
 
有趣的是,开始的时候,把示波器信号周期调的比较大,比如500ms,这时候,测量音频Codec I2C总线上信号,居然量不到信号,而点触摸屏的时候就可以测到I2C 总线上有数据波动。(好多设备都是连载同一条I2C总线上的)。 后来才发现原来的把示波器周期调小到us级,改用触发方式,就可以捕捉到I2C设备上的信号了。
 
具体做法,可以添加以下代码,生成sys/class/i2c-adapter/* 下面的节点reg和val 。
 
reg --- 要读写的 I2C 设备寄存器地址
val --- reg里面的值
static unsigned long sys_reg;
static ssize_t sys_reg_show(struct device *dev,
                   struct device_attribute * attr,char * buf)
{
    printk(" reg show : sys_reg = %dn", sys_reg);
    return snprintf(buf,PAGE_SIZE, "%x", (u32)sys_reg);
}
static ssize_t sys_reg_store(struct device *dev,
                struct device_attribute *attr, const char * buf,size_t size)
{
        strict_strtoul(buf, 16, &sys_reg);
    printk(" reg store : sys_reg = %dn", sys_reg);
                    return size;
}
static ssize_t sys_val_show(struct device *dev,
                struct device_attribute *attr, char *buf)
{
        unsigned char val;
// struct i2c_client *client;
        val = 0;
// client = container_of(dev, struct i2c_client, dev);
        val = lc1120_i2c_read(sys_reg);
    printk(" sys_val_show : val = %dn", val);
        return snprintf(buf, PAGE_SIZE, "%x", val);
}
static ssize_t sys_val_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t size)
{
        unsigned long val = 0;
    printk(" sys_val_store : before : buf = %sn", buf);
        if (strict_strtoul(buf, 16, &val) == 0)
            {
             // struct i2c_client *client;
              // client = container_of(dev, struct i2c_client, dev);
    printk(" sys_val_store : sys_reg = %dn", sys_reg);
    printk(" sys_val_store : before :val = %dn", val);
                lc1120_i2c_write(val, sys_reg);
            }
    printk(" sys_val_store : after :val = %dn", val);
        return size;
}
static DEVICE_ATTR(reg, S_IRUGO | S_IWUGO, sys_reg_show, sys_reg_store);
static DEVICE_ATTR(val, S_IRUGO | S_IWUGO, sys_val_show, sys_val_store);
下面这些在初始化中添加
  1.    if (device_create_file(&client->dev, &dev_attr_reg))
            printk(KERN_ERR "%s create sysfs reg failedn", __func__);
        if (device_create_file(&client->dev, &dev_attr_val))
            printk(KERN_ERR "%s create sysfs val failedn", __func__);
    这样,读写reg 就是选定设备寄存器地址,
读写val,就是进行I2C读写操作,可以产生波形了。

最后

以上就是勤劳天空为你收集整理的用示波器量I2C 信号的全部内容,希望文章能够帮你解决用示波器量I2C 信号所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部