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) #读示例