4个职位/0个新职位
最后一篇文章
孔卡
离线
最后一次见到:4年1个月前
已加入:2017-01-22 02:42
I2C重启信号

嗨,DIalog,
我有一个外设,是这个时序:
起点
发送设备地址(W)
发送注册地址
重新启动
发送设备地址(R)
读取数据
....
住手

看了 演示i2c.c还是没搞清楚如何实现这个时序。
一般的I2C时序是这样的:
起点
发送设备地址(W/R)
发送注册地址
写入/读取数据
....
住手

该如何利用I2C的库函数来实现? 硬件i2c设置重启已启用(硬件i2c ID,布尔已启用)如何使用?
在芯片硬件设计中,重新启动是怎样触发的?

另外,一个I2C操作过程是如何启动的?(产生开始信号开始)。 演示i2c.c里,FM75型的例子,貌似只有一个 设置目标地址,这个函数可以启动 I2C吗? 即使可以,这次I2C完成之后,下次的操作也应该重复启动I2C才对。

谢谢

关键词:
设备:
Qinjiny\u对话框
离线
最后一次见到:3天7小时前
工作人员
已加入:2016-11-01 05:47
你好,

你好,

硬件\ i2c \设置\重启\启用这个函数是把I2C\u控制\u寄存器里的I2C\u重新启动\u EN位设为1,目的在做为I2C主机的时候允许发送重新启动信号,并且这个一点默认就是1,也就是允许的。

重新启动信号一般不需要手动设置,底层协议根据奴隶反馈ACR公司的情况自行判断是发送重新启动继续进行I2C数据传输还是发送住手结束。

建议看一下681产品介绍的114页开始,对芯片的I2C功能和时序有很详细的说明。除了演示i2c.c外,也可以看看演示i2c异步.c和适配器里面的 广告i2c.c

孔卡
离线
最后一次见到:4年1个月前
已加入:2017-01-22 02:42
Qinjiny\u对话,您好

Qinjiny\u对话,您好
我看演示里的 外围设备演示工程,隐含了很多细节,包括启动 启动、停止信号等等
一般步骤:
1.设置目标地址
2.资源需求(I2C)

然后就是读写I2C比如
静态void fm75_read_reg(uint8_t reg,uint8_t*val,uint8_t len)
{
大小\u t rd \u状态=0;
HW\ u I2C\ u ABORT\ u SOURCE abrt\ u src=HW\ u I2C\ u ABORT\ u NONE;

/*
*在从传感器寄存器读取值之前,我们需要向它发送一个字节的信息
*通知现在将读取哪个传感器寄存器。
*/
硬件i2c写字节(hw I2C1,reg);
rd_status=hw_i2c_read_buffer_sync(hw_I2C1,val,len,&abrt_src,hw_i2c_F_NONE);
if((rd_status<(size_t)len)| |(abrt_src!=硬件\ I2C \中止\无){
printf(“fm75读取失败:%u”换行符,abrt\u src);
}
}

那我理解的话: 硬件i2c写字节(hw I2C1,reg);这个语句会启动 开始并发送 从属地址(写),然后 发送 规则
接下来, 硬件i2c读取缓冲区同步这个函数,读,改变了I2C的方向,会自动产生一个 重新启动,并自动发送 从属地址(读),然后读取数据。。。读取完成之后,I2C控制器自动产生 停下

几个关键的 开始,重新开始,停止都是隐含而且自动完成的? 包括 从属地址都是自动发送的? -- 没有看到发送 从属地址的函数语句。
那我要求的时序,也可以用上面这段代码来实现了 ? 万能啊

开始---|
发送设备地址(W)----硬件i2c写字节(hw I2C1,reg);
发送注册地址--|
重启---自动生成--|
发送设备地址(R)----硬件i2c读取缓冲区同步
读取数据--|
....
住手--|

是这样吗? 如果这样,真是万能了

Qinjiny\u对话框
离线
最后一次见到:3天7小时前
工作人员
已加入:2016-11-01 05:47
发生方向改变的话I2C模块是会发送重新启动命令的

发生方向改变的话I2C模块是会发送重新启动命令的,不过还是建议使用适配器里面的函数而不是直接调用底层驱动