5. IIC

I2C 是一种用于设备间通信的两线协议。在物理层上,它由两根线组成:SCL 和 SDA ,即时钟和数据线。

K2000最多可支持创建5组 IIC 对象。

5.1. 构建iic

from sharp_spi_iic import *            # 导入 iic 模块

from sharp_user import *               # 导入 用户自定义 模块 需要从此模块里获取pin对象

adap = SHARP_IIC_init(id = 0,scl = LCD_TP_SCL,sda = LCD_TP_SDA,freq=10000,iic_delay = 1)
SHARP_IIC_init(id,scl,sda,freq,timeout,iic_delay,number) 此方法会构造并返回一个新的IIC对象,并用于后续的读写

id : 标识特定的 I2C 外设。如果填入 id = 0,即选择软件模拟的方式实现 I2C,这时可以使用任意引脚来模拟 I2C 总线 ,这样在初始化时就必须指定 scl 和 sda 。

scl : 应该是一个 Pin 对象,指定为一个用于 scl 的 Pin 对象。id = 1时 此值无效 (可选参数)

sda : 应该是一个 Pin 对象,指定为一个用于 sda 的 Pin 对象。id = 1时 此值无效 (可选参数)

freq : 应该是为 scl 设置的最大频率。(可选参数)

timeout : 应该是为 超时时间。(可选参数)

iic_delay: 应该是为 电平的间隔时间 。 (可选参数)

number : 应该是为 多组IIC对象的序列号,多组IIC的时候使用,单组IIC可以忽略 (可选参数) 。

5.2. iic发送

为了应对IIC多变的时序要求,特地定制了一个针对IIC传输的类对象iic_message,此对象包含以下几个参数。

  • iic_type : 读写类型,具体有以下四种类型。

    • I2C_START_W : Start+Write Addr+Write Dat(该模式为写对应地址数据)

    • I2C_W : Write Dat(只发送数据)

    • I2C_START_R : Start+Read Addr+Read Dat(该模式为读对应地址数据)

    • I2C_R : Read Dat(只读取数据)

  • iic_addr : 器件地址。

  • iic_len : 读写长度。

  • IIC_Buffer : 读写缓冲区。

# IIC 写函数:reg:地址16位  len:发送的长度  data:发送的数据,使用列表[]
def IIC_Write(adap,reg,data_len,data):
    byte_buf = bytearray(data_len+2)
    byte_buf[0]=(reg>>8)&0xff
    byte_buf[1]=reg&0xff
    if len(data)>=data_len:
        for i in range(data_len):
            byte_buf[i+2]=data[i]
    else:
        print('data_len out of range')
    message = iic_message()
    message.iic_addr = 0x51             #器件地址A2
    message.iic_type = I2C_START_W      #类型 见第14行
    message.iic_len = data_len+2
    message.IIC_Buffer = byte_buf       #此处传的是发送的byte,如果有接收可在SHARP_IIC_transfer后面在回读一下IIC_Buffer
    SHARP_IIC_transfer(adap,message,1)

IIC_Write(IIC_adap,0x1E,5,[0x01,0x02,0x03,0x04,0x05])    #写示例

5.3. iic接收

# IIC 写函数:reg:地址16位  len:读的长度
def IIC_Read(adap,reg,data_len):
    tx_buf = bytearray(2)
    rx_buf = bytearray(data_len)

    tx_buf[0]=(reg>>8)&0xff
    tx_buf[1]=reg&0xff
    message = [iic_message() for i in range(2)]
    message[0].iic_addr = 0x51             #器件地址A2
    message[0].iic_type = I2C_START_W      #类型 见第14行
    message[0].iic_len = 2
    message[0].IIC_Buffer = tx_buf       #此处传的是发送的byte,如果有接收可在SHARP_IIC_transfer后面在回读一下IIC_Buffer

    message[1].iic_addr = 0x51             #器件地址A3
    message[1].iic_type = I2C_START_R      #类型 见第14行
    message[1].iic_len = data_len
    message[1].IIC_Buffer = rx_buf       #此处传的是发送的byte,如果有接收可在SHARP_IIC_transfer后面在回读一下IIC_Buffer
    SHARP_IIC_transfer(adap,message,2)
    return message[1].IIC_Buffer

data = IIC_Read(IIC_adap,0x3FC0, 17)                     #读示例

5.4. 示例

def IIC_Init():
    adap = SHARP_IIC_init(id = 0,scl = LCD_TP_SCL,sda = LCD_TP_SDA,freq=10000,iic_delay = 1)
    return adap

# IIC 写函数:reg:地址16位  len:发送的长度  data:发送的数据,使用列表[]
def IIC_Write(adap,reg,data_len,data):
    byte_buf = bytearray(data_len+2)
    byte_buf[0]=(reg>>8)&0xff
    byte_buf[1]=reg&0xff
    if len(data)>=data_len:
        for i in range(data_len):
            byte_buf[i+2]=data[i]
    else:
        print('data_len out of range')
    message = iic_message()
    message.iic_addr = 0x51             #器件地址A2
    message.iic_type = I2C_START_W      #类型 见第14行
    message.iic_len = data_len+2
    message.IIC_Buffer = byte_buf       #此处传的是发送的byte,如果有接收可在SHARP_IIC_transfer后面在回读一下IIC_Buffer
    SHARP_IIC_transfer(adap,message,1)


# IIC 写函数:reg:地址16位  len:读的长度
def IIC_Read(adap,reg,data_len):
    tx_buf = bytearray(2)
    rx_buf = bytearray(data_len)

    tx_buf[0]=(reg>>8)&0xff
    tx_buf[1]=reg&0xff
    message = [iic_message() for i in range(2)]
    message[0].iic_addr = 0x51             #器件地址A2
    message[0].iic_type = I2C_START_W      #类型 见第14行
    message[0].iic_len = 2
    message[0].IIC_Buffer = tx_buf       #此处传的是发送的byte,如果有接收可在SHARP_IIC_transfer后面在回读一下IIC_Buffer

    message[1].iic_addr = 0x51             #器件地址A3
    message[1].iic_type = I2C_START_R      #类型 见第14行
    message[1].iic_len = data_len
    message[1].IIC_Buffer = rx_buf       #此处传的是发送的byte,如果有接收可在SHARP_IIC_transfer后面在回读一下IIC_Buffer
    SHARP_IIC_transfer(adap,message,2)
    return message[1].IIC_Buffer



# IIC写示例,IIC_adap为实例化的IIC对象
#          实例化对象  地址   写长度   写数据
# IIC_Write(IIC_adap, 0x1E,  1,      [0x20])

# IIC读示例,IIC_adap为实例化的IIC对象
# 接收读取数据          实例化对象   地址   读取数据长度
# R_data      =IIC_Read(IIC_adap,  0x01,  1)




if __name__ == '__main__':
    # 实例化IIC对象
    IIC_adap=IIC_init(id = 0,scl = LCD_TP_SCL,sda = LCD_TP_SDA,freq=10000,iic_delay = 1)
    IIC_Write(IIC_adap,0x1E,5,[0x01,0x02,0x03,0x04,0x05])    #写示例
    data = IIC_Read(IIC_adap,0x3FC0, 17)                     #读示例