I2C设定及使用


为了设定或是使用I2C需要使用pid_ioctl函数。 I2C支持的pid_ioctl函数的命令目录如下。

命令 下级命令 说明
set mode sm set data rate: standard - 100 Kbps
fm set data rate: fast - 400 Kbps
daddr [A] set address: local device address
saddr [A] set address: slave device address
get rxlen get the number of pending bytes in receive buffer
txlen get the number of pending bytes in send buffer
error nack get the number of NACK in the last transaction
bus get the number of bus error in the last transaction
state 0 - idle, etc. - I2C internal operation
req read [N] request to read
write - request to write
wait request to write and wait ("req stop" is required)
stop request to stop writing data ("req wait" is required)
reset request to reset bus

I2C设定

I2C通过利用"set"命令来设定通信模式与slave设备地址。

设定通信速度

支持PHPoC的I2C标准模式与高速模式,基本默认值是标准模式。

区分 语法
standard pid_ioctl($pid, "set mode sm");
fast pid_ioctl($pid, "set mode fm");

设定地址设备

I2C在选择要传送数据的slave时利用slave设备的地址。slave设备地址可如下进行设定。

类型 语法
slave device address pid_ioctl($pid, "set saddr [A]");
local device address pid_ioctl($pid, "set daddr [A]");

设备地址[A]需要以16进制2位型态输入。PHPoC的I2C使用7字节地址指定方式,LSB一直是0。几个已预定的地址无法使用,请参考。 如果使用此地址将在PHPoC发生错误。

地址 (Binary) 例(Hexa) 备注
7 6 5 4 3 2 1 0
X X X X X X X 1 E1, A3, 1B LSB is 1
0 0 0 0 X X X X 00 ~ 0F All of 4 Upper bits are 0
1 1 1 1 X X X X F0 ~ FF All of 4 Upper bits are 1

读取I2C状态

I2C利用"get"命令确认各种状态信息。

读取发送/接收缓冲区字节数

在I2C可以如下确认发送或是接收缓冲区字节数。

区分 语法
Send buffer pid_ioctl($pid, "get txlen");
Receive buffer pid_ioctl($pid, "get rxlen");

读取错误次数

在I2C可确认最后交易的NACK或是总线错误次数。

区分 语法
NACK pid_ioctl($pid, "get error nack");
bus Error pid_ioctl($pid, "get error bus");

读取状态

可如下确认I2C的状态。在空闲状态时返还0,不是空闲状态时返还不是0的值。

区分 语法
State pid_ioctl($pid, "get state");

使用I2C

读取邀请

是I2C master命令向slave发送读取数据的邀请。在执行此命令后slave的应答数据正常在缓冲区接收时,通过pid_read函数可读取该内容。

区分 语法
Request to Read Data pid_ioctl($pid, "req read [N]");

在上面语法中[N]指要读取的数据的字节数。

读写邀请

I2C master命令利用slave传送读取数据邀请的命令。读写邀请如下有两种方法。

区分 语法
Request to Write Data pid_ioctl($pid, "req write");
Request to Write Data and Wait pid_ioctl($pid, "req write wait");
Stop Writing Data pid_ioctl($pid, "req stop");

当执行"req write"命令即发送数据。因此执行命令前必须将要发送的数据保存在缓冲区。相反"req write wait"命令将总线状态做为传送开始条件并执行"req stop"命令前不制作终止条件。 因此,在实行"req stop"命令前利用pid_write函数可技术发送数据。

邀请初始化

因总线故障等问题通信不顺畅时,可通过此命令将I2C通信初始化。

命令 语法
Request to Request Bus pid_ioctl($pid, "req reset");