【触觉智能 Purple Pi开发板试用】+02.I2C测试(zmj)
Purple Pi开发板通过J12排针提供了丰富的GPIO接口,包括UART、SPI、I2C、GPIO等(还包括DC5V、DC3.3V、GND)。
本节主要测试Purple Pi开发板的对外I2C接口。
//------I2C总线简介
I2C总线(Inter IC bus)是由Philips公司开发的一种通用数据总线。
两根通信线:SCL(Serial Clock串行时钟线)、SDA(Seriak Data串行数据线)。
工作模式为同步、半双工,带数据应答。
同步(因为它有单独的时钟线)、半双工(SDA只有一根线,并且还要来回通信)
通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。
Purple Pi开发板提供了两组I2C接口,此处主要测试第一组HW-I2C。
序号 | I2C序号 | 时钟SCL | 数据SDA | 设备号dev |
---|---|---|---|---|
1 | HW I2C group0 | PAD_TTL1 | PAD_TTL2 | /dev/i2c-0 |
2 | HW I2C group1 | PAD_HDMITX_SCL | PAD_HDMITX_SDA | /dev/i2c-1 |
AT24C02作为一种non-volatile(非易失性存储器),可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息。它的内存存取空间容量是2048bit (2kbit/256Bytes),由每页8Bytes/64bit、共计32页组成。它具有两线I2C接口,提供双向通信协议。通过把WP引脚接地,可以格式化存储器。此处测试一款已经焊接好AT24C02的EEPROM存储模块。
//------AT24C02
a.接口:I2C
b.器件地址:7bit从机地址,1010xxx
c.默认地址:0x50
//------AT24C02结构简介
X DEC-译码器,左边是地址线,输入译码器又回来。
SERIAL MUX-串行数据选择端,借助Y DEC(Y译码器)通过D(out)/ACK LOGIC一位一位的输出出去;
DATA WORD ADDR/COUNTER-用来设置地址,内部设有存储地址的寄存器,每写入或读出一个地址,这个寄存器会自动加一,如果读出不指定地址的话,它默认把寄存器的数据拿出来。
I2C总线扫描设备节点使用i2cdetec指令,I2C总线设备写入使用的是i2cset指令,读取使用的是i2cget指令。
//------测试流程
a.扫描I2C总线/列出所有I2C设备节点:i2cdetect -l
|---i2c-1 i2c Sstar I2C adapter 1 I2C adapter
|---i2c-0 i2c Sstar I2C adapter 0 I2C adapter
b.扫描I2C-0总线设备:i2cdetect -y 0
c.读取I2C-0总线的0x50设备:地址0x10,数值0xff
i2cget -f -y 0x0 0x50
|---0xff
d.写入I2C-0总线的0x50设备:地址0x10,数值0x5a:
i2cset -f -y 0x0 0x50 0x10 0x5a b
e.重新读取,发现已经变成了0x5a。
i2cget -f -y 0x0 0x50
|---0x5a
//------关于i2cdump
i2cdump可以批量获取I2C总线上的设备数值。
LM75A/LM75B是一个高速I2C接口的温度传感器,可以在-55℃~+125℃的温度范围内将温度直接转换为数字信号,并可实现0.125℃的精度。MCU可以通过I2C总线直接读取其内部寄存器中是数据。LM75有三个可选的逻辑地址引脚,使得同一总线上课同时连接8个器件而不发生地址冲突。
//------LM75
a.接口:I2C
b.器件地址:7bit从机地址,1001xxx
c.默认地址:0x48
I2C总线扫描设备节点使用i2cdetec指令,I2C总线设备读取使用的是i2cget指令。
a.扫描I2C总线/列出所有I2C设备节点:i2cdetect -l
|---i2c-1 i2c Sstar I2C adapter 1 I2C adapter
|---i2c-0 i2c Sstar I2C adapter 0 I2C adapter
b.扫描I2C-0总线设备:i2cdetect -y 0
c.读取I2C-0总线的0x48设备:i2cget -f -y 0x0 0x48
|---0x1a(换算成十进制是26摄氏度)
d.将数值读取与格式转换通过shell脚本完成lm75.sh
#!/bin/sh
# ------
getTEMP()
{
i2cget -f -y 0x0 0x48 0x00
}
# ------
temp='getTEMP' ;
Value=$($temp) ;
Result=$(printf "%d" "$Value") ;
# ------
echo "//------------------------------------------------"
date
echo ""
echo "Temperature read from LM75 @ i2c-0_0x48 : $Result ."
echo ""
read -n1 -p "Press any key to exit!"
echo ""
# ------
//------END
更多回帖